1. 程式人生 > >Go實戰--golang使用ssl連線MongoDB(mgo)

Go實戰--golang使用ssl連線MongoDB(mgo)

生命不止,繼續 go go go!!!

文中主要介紹了Windows下如何安裝mongodb,mongodb的簡單命令,golang如何操作mongodb,以及使用golang+mongodb建立的微服務。

今天繼續深深耕一點。

Windows下mongo使用配置檔案

建立一個配置檔案,例如命名為mongod.cfg

建立一個日誌檔案,例如命名為mongodb.log

建立一個儲存資料的資料夾

配置檔案中鍵入以下內容:

systemLog:
  destination: file
  path: "D:\\mongodb_log\\mongodb.log"
  logAppend: true
storage:
dbPath: "D:\\mongodb_data\\db" security: authorization: enabled

cmd鍵入以下命令:

mongod --config "d:\Program Files\MongoDB\conf\mongod.cfg"

此時檢視mongodb.log內容為:

2017-08-24T02:18:49.250-0700 I CONTROL  [initandlisten] MongoDB starting : pid=3004 port=27017 dbpath=D:\mongodb_data\db 64-bit host=LAPTOP-MNU6522J
2017
-08-24T02:18:49.250-0700 I CONTROL [initandlisten] targetMinOS: Windows 7/Windows Server 2008 R2 2017-08-24T02:18:49.250-0700 I CONTROL [initandlisten] db version v3.4.6 2017-08-24T02:18:49.250-0700 I CONTROL [initandlisten] git version: c55eb86ef46ee7aede3b1e2a5d184a7df4bfb5b5 2017-08-24T02:18:49.251-0700 I CONTROL [initandlisten] OpenSSL version
: OpenSSL 1.0.1u-fips 22 Sep 2016 2017-08-24T02:18:49.251-0700 I CONTROL [initandlisten] allocator: tcmalloc 2017-08-24T02:18:49.251-0700 I CONTROL [initandlisten] modules: none 2017-08-24T02:18:49.251-0700 I CONTROL [initandlisten] build environment: 2017-08-24T02:18:49.251-0700 I CONTROL [initandlisten] distmod: 2008plus-ssl 2017-08-24T02:18:49.252-0700 I CONTROL [initandlisten] distarch: x86_64 2017-08-24T02:18:49.252-0700 I CONTROL [initandlisten] target_arch: x86_64 2017-08-24T02:18:49.252-0700 I CONTROL [initandlisten] options: { config: "d:\Program Files\MongoDB\conf\mongod.cfg", security: { authorization: "enabled" }, storage: { dbPath: "D:\mongodb_data\db" }, systemLog: { destination: "file", logAppend: true, path: "D:\mongodb_log\mongodb.log" } } 2017-08-24T02:18:49.253-0700 I - [initandlisten] Detected data files in D:\mongodb_data\db created by the 'wiredTiger' storage engine, so setting the active storage engine to 'wiredTiger'. 2017-08-24T02:18:49.253-0700 I STORAGE [initandlisten] wiredtiger_open config: create,cache_size=3540M,session_max=20000,eviction=(threads_min=4,threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),checkpoint=(wait=60,log_size=2GB),statistics_log=(wait=0), 2017-08-24T17:18:51.229+0800 I FTDC [initandlisten] Initializing full-time diagnostic data capture with directory 'D:/mongodb_data/db/diagnostic.data' 2017-08-24T17:18:51.231+0800 I NETWORK [thread1] waiting for connections on port 27017

使用tail檢視實時日誌

此時,你是不是很懷念linux呢,實時檢視日誌。我們也可以在windows上使用tail命令

解壓,新增到環境變數

重啟一個cmd,鍵入:

tail -f D:\mongodb_log\mongodb.log

為mongodb增加證書

生成證書
命令:

openssl req -newkey rsa:2048 -new -x509 -days 365 -nodes -out mongodb-cert.crt -keyout mongodb-cert.key

需要填寫一些資訊:

λ openssl req -newkey rsa:2048 -new -x509 -days 365 -nodes -out mongodb-cert.crt -keyout mongodb-cert.key
Generating a 2048 bit RSA private key
..........+++
..............................................+++
writing new private key to 'mongodb-cert.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:cn
State or Province Name (full name) [Some-State]:beijing
Locality Name (eg, city) []:beijing
Organization Name (eg, company) [Internet Widgits Pty Ltd]:superwang
Organizational Unit Name (eg, section) []:wangshubo
Common Name (e.g. server FQDN or YOUR name) []:wangshubo
Email Address []:[email protected]

生成pem

cat mongodb-cert.key mongodb-cert.crt > mongodb.pem

修改配置檔案
mongod.cfg檔案增加ssl:

systemLog:
  destination: file
  path: "D:\\mongodb_log\\mongodb.log"
  logAppend: true
storage:
  dbPath: "D:\\mongodb_data\\db"
security:
  authorization: enabled
net:
  ssl:
    mode: requireSSL
    PEMKeyFile: "D:\\Program Files\\MongoDB\\mongodb.pem"

啟動mongo服務

mongod --config "d:\Program Files\MongoDB\conf\mongod.cfg"

通過tail檢視日誌:

2017-08-24T17:35:24.671+0800 I CONTROL  [main] ***** SERVER RESTARTED *****
2017-08-24T17:35:25.831+0800 I CONTROL  [initandlisten] MongoDB starting : pid=9880 port=27017 dbpath=D:\mongodb_data\db 64-bit host=LAPTOP-MNU6522J
2017-08-24T17:35:25.831+0800 I CONTROL  [initandlisten] targetMinOS: Windows 7/Windows Server 2008 R2
2017-08-24T17:35:25.831+0800 I CONTROL  [initandlisten] db version v3.4.6
2017-08-24T17:35:25.831+0800 I CONTROL  [initandlisten] git version: c55eb86ef46ee7aede3b1e2a5d184a7df4bfb5b5
2017-08-24T17:35:25.831+0800 I CONTROL  [initandlisten] OpenSSL version: OpenSSL 1.0.1u-fips  22 Sep 2016
2017-08-24T17:35:25.831+0800 I CONTROL  [initandlisten] allocator: tcmalloc
2017-08-24T17:35:25.831+0800 I CONTROL  [initandlisten] modules: none
2017-08-24T17:35:25.831+0800 I CONTROL  [initandlisten] build environment:
2017-08-24T17:35:25.831+0800 I CONTROL  [initandlisten]     distmod: 2008plus-ssl
2017-08-24T17:35:25.831+0800 I CONTROL  [initandlisten]     distarch: x86_64
2017-08-24T17:35:25.831+0800 I CONTROL  [initandlisten]     target_arch: x86_64
2017-08-24T17:35:25.831+0800 I CONTROL  [initandlisten] options: { config: "d:\Program Files\MongoDB\conf\mongod.cfg", net: { ssl: { PEMKeyFile: "D:\Program Files\MongoDB\mongodb.pem", mode: "requireSSL" } }, security: { authorization: "enabled" }, storage: { dbPath: "D:\mongodb_data\db" }, systemLog: { destination: "file", logAppend: true, path: "D:\mongodb_log\mongodb.log" } }
2017-08-24T17:35:25.833+0800 I -        [initandlisten] Detected data files in D:\mongodb_data\db created by the 'wiredTiger' storage engine, so setting the active storage engine to 'wiredTiger'.
2017-08-24T17:35:25.833+0800 I STORAGE  [initandlisten] wiredtiger_open config: create,cache_size=3540M,session_max=20000,eviction=(threads_min=4,threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),checkpoint=(wait=60,log_size=2GB),statistics_log=(wait=0),
2017-08-24T17:35:26.762+0800 I CONTROL  [initandlisten]
2017-08-24T17:35:26.762+0800 I CONTROL  [initandlisten] ** WARNING: No SSL certificate validation can be performed since no CA file has been provided
2017-08-24T17:35:26.762+0800 I CONTROL  [initandlisten] **          Please specify an sslCAFile parameter.
2017-08-24T17:35:27.090+0800 I FTDC     [initandlisten] Initializing full-time diagnostic data capture with directory 'D:/mongodb_data/db/diagnostic.data'
2017-08-24T17:35:27.092+0800 I NETWORK  [thread1] waiting for connections on port 27017 ssl

啟動mongodb客戶端
cmd輸入命令:

mongo

如下:

MongoDB shell version v3.4.6
connecting to: mongodb://127.0.0.1:27017
2017-08-24T17:38:05.507+0800 I NETWORK  [thread1] Socket recv() 遠端主機強迫關閉了一個現有的連線。 127.0.0.1:27017
2017-08-24T17:38:05.552+0800 I NETWORK  [thread1] SocketException: remote: (NONE):0 error: 9001 socket exception [RECV_ERROR] server [127.0.0.1:27017]
2017-08-24T17:38:05.595+0800 E QUERY    [thread1] Error: network error while attempting to run command 'isMaster' on host '127.0.0.1:27017'  :
[email protected]/mongo/shell/mongo.js:237:13
@(connect):1:6
exception: connect failed

沒有證書的原因

通過ssl啟動mongodb客戶端
cmd鍵入命令:

mongo --ssl --sslPEMKeyFile "D:\Program Files\MongoDB\mongodb.pem" --sslAllowInvalidCertificates

如下:

MongoDB shell version v3.4.6
connecting to: mongodb://127.0.0.1:27017
2017-08-24T17:47:06.597+0800 W NETWORK  [thread1] SSL peer certificate validation failed: self signed certificate
2017-08-24T17:47:06.597+0800 W NETWORK  [thread1] The server certificate does not match the host name. Hostname: 127.0.0.1 does not match CN: wangshubo
MongoDB server version: 3.4.6

這裡需要提醒的是,千萬不要忘記--sslAllowInvalidCertificates,因為這是我們自制的證書。

解決not authorized on admin to execute command的問題
1.不帶ssl啟動mongod

mongod.exe --dbpath d:\mongodb_data\db

2.客戶端端連線

mongo

3.切換到admin

use admin

4.建立role

> db.createRole({role:'sysadmin',roles:[],privileges:[{resource:{anyResource:true},actions:['anyAction']}]})
{
        "role" : "sysadmin",
        "roles" : [ ],
        "privileges" : [
                {
                        "resource" : {
                                "anyResource" : true
                        },
                        "actions" : [
                                "anyAction"
                        ]
                }
        ]
}

5.切換到test,建立使用者

> use test
switched to db test
> db.createUser({user:'wangshubo',pwd:'dabaojian',roles:[{role:'sysadmin',db:'admin'}]})
Successfully added user: {
        "user" : "wangshubo",
        "roles" : [
                {
                        "role" : "sysadmin",
                        "db" : "admin"
                }
        ]
}

6.重新啟動mongodb服務端,使用認證

mongod --config "d:\Program Files\MongoDB\conf\mongod.cfg"

7.使用ssl連線

mongo --ssl --sslPEMKeyFile "D:\Program Files\MongoDB\mongodb.pem" --sslAllowInvalidCertificates --sslAllowInvalidHostnames

8.使用
使用test

use test

檢視資料庫

> show dbs
2017-08-25T10:36:48.550+0800 E QUERY    [thread1] Error: listDatabases failed:{
        "ok" : 0,
        "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
        "code" : 13,
        "codeName" : "Unauthorized"
} :
[email protected]/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
shellHelper.show@src/mongo/shell/utils.js:769:19
[email protected]/mongo/shell/utils.js:659:15
@(shellhelp2):1:1

9.不要灰心,操作前先認證就好了

> db.auth("wangshubo","dabaojian")
1
> show dbs
admin  0.000GB
local  0.000GB
store  0.000GB
test   0.000GB

golang通過ssl連線mongodb

所以,關於golang中介紹不再過多贅述,直接可以上程式碼了。為了方便起見,我直接把證書內容寫到了程式裡面。

package main

import (
    "crypto/tls"
    "crypto/x509"
    "fmt"
    "log"
    "net"

    "gopkg.in/mgo.v2"
    "gopkg.in/mgo.v2/bson"
)

const rootPEM = `-----BEGIN CERTIFICATE-----
MIID+zCCAuOgAwIBAgIJAKi7rDeJTJPeMA0GCSqGSIb3DQEBCwUAMIGTMQswCQYD
VQQGEwJjbjEQMA4GA1UECAwHYmVpamluZzEQMA4GA1UEBwwHYmVpamluZzESMBAG
A1UECgwJc3VwZXJ3YW5nMRIwEAYDVQQLDAl3YW5nc2h1Ym8xEjAQBgNVBAMMCXdh
bmdzaHVibzEkMCIGCSqGSIb3DQEJARYVd2FuZ3NodWJvMTk4OUAxMjYuY29tMB4X
DTE3MDgyNDA5MjU1NFoXDTE4MDgyNDA5MjU1NFowgZMxCzAJBgNVBAYTAmNuMRAw
DgYDVQQIDAdiZWlqaW5nMRAwDgYDVQQHDAdiZWlqaW5nMRIwEAYDVQQKDAlzdXBl
cndhbmcxEjAQBgNVBAsMCXdhbmdzaHVibzESMBAGA1UEAwwJd2FuZ3NodWJvMSQw
IgYJKoZIhvcNAQkBFhV3YW5nc2h1Ym8xOTg5QDEyNi5jb20wggEiMA0GCSqGSIb3
DQEBAQUAA4IBDwAwggEKAoIBAQDldV1M4lMT630NgMGTXcrcusCuzb/JMN3lMb7w
umlGwBo0XrSLbYRHzWdkx1yH9P0VZFalji34ELDTbD951sL/+/Hg4HC3qguVcduv
7wCiKpIm71NWYaYnfOyjCVi8OoGp6eMuImh+jpTGTPTwwwZzG1vc08f+rwtvfDzU
X+1FOvtPmsimmlDssd/edRWvbKkMCNmrVoLJ+zZQ0BfnovcN38+nEcXYakgZHM09
6hC2ASn8zIipoXo7nGaOwLhHnem0aLkdtcnwSvDgibe+eKA36dvZHnGIPj1sgAXl
6ZQvDNbVV5ITPCECf/ivGu1hiN6U0dJMUHeyT1wkuB+TWrPJAgMBAAGjUDBOMB0G
A1UdDgQWBBSjWxZXdtAN2ojdepVSHL5qAxzH8zAfBgNVHSMEGDAWgBSjWxZXdtAN
2ojdepVSHL5qAxzH8zAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAI
F7f3md5ffJtpBv4wqfWLiIMi18btXz3hkX8VuCTBvmoxCSeIqnSrLa2pFUlGFpoh
/xkkUcHP5hUA44NTJAYGu5N5PxdLuCe0DrSfqLZWiJzED19Fq1TwI0DU4hNfDWlk
W7idVPVJWEXNuy5BVXmvpUEn+nAV9Qo/SZ816kdPyZMksVId+W7twz4s+t+VCTaY
hQk+bbDw48ciQIDmBn44PoNhL1KCxvJf4QRQwIEaQfIK70HjmhVzDoAGdSM3A1v7
LqQG1bOeAFxY3PPAxfuZOQNtfXhX7JbupvC8c3o5X4hOqLMMr198D+ANsq8effwR
T2fbAPEzzPNDZjydwk2P
-----END CERTIFICATE-----
`

type Person struct {
    Name  string
    Phone string
}

func main() {

    roots := x509.NewCertPool()
    ok := roots.AppendCertsFromPEM([]byte(rootPEM))
    if !ok {
        panic("failed to parse root certificate")
    }

    tlsConfig := &tls.Config{
        RootCAs:            roots,
        InsecureSkipVerify: true,
    }

    dialInfo, err := mgo.ParseURL("mongodb://wangshubo:[email protected]:27017/test")
    if err != nil {
        log.Println(err)
        panic(err)
    }

    dialInfo.DialServer = func(addr *mgo.ServerAddr) (net.Conn, error) {
        conn, err := tls.Dial("tcp", addr.String(), tlsConfig)
        if err != nil {
            log.Println(err)
        }
        return conn, err
    }

    session, err := mgo.DialWithInfo(dialInfo)
    if err != nil {
        log.Println(err)
        panic(err)
    }

    defer session.Close()

    session.SetMode(mgo.Monotonic, true)

    c := session.DB("test").C("people")
    err = c.Insert(&Person{"superWang", "13478808311"},
        &Person{"David", "15040268074"})
    if err != nil {
        log.Fatal(err)
    }

    result := Person{}
    err = c.Find(bson.M{"name": "superWang"}).One(&result)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("Name:", result.Name)
    fmt.Println("Phone:", result.Phone)
}

輸出:
Name: superWang
Phone: 13478808311

這裡寫圖片描述

相關推薦

Go實戰--golang使用ssl連線MongoDB(mgo)

生命不止,繼續 go go go!!! 文中主要介紹了Windows下如何安裝mongodb,mongodb的簡單命令,golang如何操作mongodb,以及使用golang+mongodb建立的微服務。 今天繼續深深耕一點。 Windows下mon

Go實戰--golang中使用echo框架、MongoDB、JWT搭建REST API(labstack/echo、gopkg.in/mgo.v2、dgrijalva/jwt-go)

生命不止,繼續go go go !!! 今天,繼續echo框架,這次加入mongodb作為持久化儲存,使用jwt進行驗證,來搭建一套rest api,類似Twitter。 程式碼結構: ./model post.go user.

Go實戰--golang中使用Goji微框架(Goji+Mongodb構建微服務)

生命不止,繼續 go go go!!! 今天跟大家分享一個web微框架Goji. Goji What is Goji? 枸杞? Goji is a HTTP request multiplexer, similar to net/http.Serv

線上實戰zabbix監控mongodb詳細步驟

都是 targe 獲取 alt reat ubuntu16 系統參數 supported 服務 **Zabbix 監控mongodb做後整理** 系統運維工程師 李超因為我安全問題我們只能呢個通過mo

Go語言開發中MongoDB數據庫

urn import l數據庫 pkg selector 關系 示例 nec UNC 伴隨著移動端的興起,Nosql數據庫以其分布式設計和高性能等特點得到了廣泛的應該用,下面將介紹下Nosql中的mongoDB在Go語言中的應用,在開發前,有必要了解下基礎知識,mongo數

node.js連線mongoDB資料庫

前面已經講了mongoDB資料庫的安裝和使用,今天來研究一下node.js中如何連線和使用mongoDB資料庫。 方法一:mongoose連線 一、配置mongose 增加mongose類庫 npm install mongoose 二、利用mongoose連線mongoDB

Python存連線MongoDB

step1:安裝pymongo庫 pip install pymongo step2:使用pymongo模組連線mongoDB資料庫 #coding=utf-8 from pymongo import MongoClient #建立MongoDB資料庫連線 client =

關於在執行java連線MongoDB時遇到的連線超時問題

在linux虛擬機器裡執行建立集合的時候,遇到了以下問題:   這裡我最開始時使用的虛擬機器IP地址進行連線,因此就出現了錯誤,連線超時。在網上查了一些類似的問題,說要改驅動,後來才發現不是這個問題。 在本機上連線虛擬機器裡的MongoDB時才需要虛擬機器的IP地址,在虛擬機器內部eclips

java使用“使用者名稱+密碼”連線mongodb,認證失敗的問題解決

專案中,使用java“使用者名稱+密碼”連線mongodb,一直認證失敗! MongoClient mongoClient = new MongoClient(HOST, PORT); DB db = mongoClient.getDB(DB_NAME); // 認證失敗auth=false

python連線MongoDB資料庫方法及增刪改查等操作小結。

Y9   建議安裝MongoDB視覺化工具“Robo 3T”,可以很直觀的看到對MongoDB操作後的資料。 1、‘Robo 3T’的安裝,網上很多途徑可下載,在此分享我使用的版本: 連結:https://pan.baidu.com/s/1EcjmUVkXz1GQeTXy2fMk

nodeJs連線mongodb資料庫的操作

首先要啟動一個數據庫,在配置了環境變數的後,可直接在全域性開啟cmd視窗,啟動一個伺服器(沒有配置環境變數,在資料夾data下的db資料夾下執行cmd視窗),輸入命令: mongodb --dbpath d:\data\db 啟動資料庫後,在重新開啟一個cmd視窗,就可以對資料庫進行檢視與處

spring 連線MongoDB資料庫

專案中需要連線mongDB 需要注意MongoDB的版本 對應的.properties中關於MongoDB的配置如下 mongoDB 2.0及以下 spring.data.mongodb.uri=mongodb://localhost:2018/庫名 spring.data.mongo

解決遠端連線MongoDB出現錯誤

前言:最近準備學習下MongoDB,安裝什麼的都已經弄完了,想遠端連線來管理MongoDB,用的軟體是robo 3t 第一次連的時候就出錯誤了 大概意思是連線失敗,解決如下 第一步,首先檢查你的伺服器是否開啟了27017埠,在阿里或騰訊的控制檯可以看到,怎麼看,自行百度 可以看到,並沒有開啟2

21.26 mongodb介紹、 mongodb安裝、連線mongodbmongodb使用者管理

21.26 mongodb介紹 l官網www.mongodb.com, 當前最新版3.4 lC++編寫,基於分散式的,屬於NoSQL的一種 l在NoSQL中是最像關係型資料庫的 lMongoDB 將資料儲存為一個文件,資料結構由鍵值(key=>value)對組成。MongoDB 文件類似於

連線mongodb服務

語法:mongo.exe  ip地址:埠號/資料庫名(預設連線test) mongodb的預設埠號:27017 MongoDB內部結構                MongoDB MySQL              文件(Docu

kettle6.1如何連線mongodb

. Kettle的結構圖如下: 2.介紹各個元件詳細情況     表輸入:通常是你的sql語句,這個會Kettle基礎知識的都會不介紹了    JSON Output如下: MogoDB output如下:  下面這一步需要制定更新的

使用python連線mongodb查詢指定資料爬取用txt or excel儲存

import pymongo import csv import json import sys import importlib importlib.reload(sys) import xlwt from pymongo import MongoClient 該導的先導進來 mongo_

java連線MongoDB及CRUD操作

1、建立maven專案,並新增java驅動,使用的是3.9API版本 <dependencies> <dependency> <groupId>org.mongodb</groupId> <ar

mongodb的學習-4-使用 MongoDB shell 來連線 Mongodb 服務

執行啟動操作後,mongodb 在輸出一些必要資訊後不會輸出任何資訊,之後就等待連線的建立,當連線被建立後,就會開始列印日誌資訊。 使用 MongoDB shell 來連線 Mongodb 服務 標準 URI 連線語法: mongodb://[username:[email protec

PHP連線mongodb的現代用法---使用Monogodb\Driver\Manager

<?php /** * Created by PhpStorm. * User: Administrator * Date: 2018/11/29 * Time: 2:23 */ //require("mongoconn.php"); $wenwa = new MongoDB\Drive