我尝试在本地设置mongo以测试
中描述的设置https://www.compose.com/articles/connect-to-mongo-3-2-on-compose-from-golang/ " A Hardrder"节
蒙戈
我有一组有效的自签名凭据和mongo设置。 我已经包含了密钥,因为这些只会在开发期间使用,以确保mongo ssl代码正常工作。
使用时,通过
运行mongod --config config/location
配置
net:
port: 27017
ssl:
mode: requireSSL
CAFile: /data/mongo/ca.crt
PEMKeyFile: /data/mongo/server.pem
allowInvalidHostnames: true
allowConnectionsWithoutCertificates: true
然后我可以使用
连接到数据库mongo --ssl --sslCAFile /data/mongo/ca.crt
Golang
func NewSession(url string, ca string) (m *mgo.Session, err error) {
roots := x509.NewCertPool()
roots.AppendCertsFromPEM([]byte(ca))
tlsConfig := &tls.Config{}
tlsConfig.RootCAs = roots
url = strings.TrimSuffix(url, "?ssl=true")
dialInfo, err := mgo.ParseURL(url)
dialInfo.DialServer = func(addr *mgo.ServerAddr) (net.Conn, error) {
conn, err := tls.Dial("tcp", addr.String(), tlsConfig)
return conn, err
}
//Here it is the session. Up to you from here ;)
session, err := mgo.DialWithInfo(dialInfo)
if err != nil {
return m, err
}
session.SetMode(mgo.Monotonic, true)
return session, nil
}
结果
Golang的东西尝试连接并命中10秒超时。会话顶部的fmt显示正确的文件正在进入ca var。
Mongo日志显示
utumongo_1 | 2017-07-27T08:09:14.964+0000 I NETWORK [initandlisten] connection accepted from 172.19.0.4:57474 #30 (1 connection now open)
utumongo_1 | 2017-07-27T08:09:14.966+0000 E NETWORK [conn30] SSL: error:14094412:SSL routines:SSL3_READ_BYTES:sslv3 alert bad certificate
utumongo_1 | 2017-07-27T08:09:14.967+0000 I NETWORK [conn30] end connection 172.19.0.4:57474 (0 connections now open)
修改 更新了mongo config
答案 0 :(得分:3)
您将NewSession
作为ca
参数传递给AppendCertsFromPEM
?这需要是PEM编码的CA证书字节,而不是CA证书的文件名。如果true
设法将任何证书添加到池中,则if ca, err := ioutil.ReadFile("myPEM"); err == nil {
roots.AppendCertsFromPEM(ca)
}
将返回docker run --rm -ti -v $(pwd):/data/mongo --net=host mongo -f /data/mongo/mongo.yaml
。
该文章已经显示了执行此操作的代码:
NewSession
SSL错误表示客户端拒绝服务器证书。我怀疑这是因为您的自签名证书未正确添加到池中。
修改强>
我在您的配置中本地运行了一份mongo副本。使用docker,这是:
tls.Dial
从提取配置的地方开始
在Go中使用您的dialInfo.DialServer = func(addr *mgo.ServerAddr) (net.Conn, error) {
conn, err := tls.Dial("tcp", addr.String(), tlsConfig)
if err != nil {
fmt.Println(err)
}
return conn, err
}
func表明button.addEventListener("click", function (event) {
event.preventDefault();
if (navigator.userAgent.match(/ipad|ipod|iphone/i)) {
var $input = $('#input_output');
$input.val();
var el = $input.get(0);
var editable = el.contentEditable;
var readOnly = el.readOnly;
el.contentEditable = true;
el.readOnly = false;
var range = document.createRange();
range.selectNodeContents(el);
var sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
el.setSelectionRange(0, 999999);
el.contentEditable = editable;
el.readOnly = readOnly;
var successful = document.execCommand('copy');
$input.blur();
var msg = successful ? 'successful ' : 'un-successful ';
}
else{
var copyTextarea = document.querySelector('#input_output');
copyTextarea.select();
var successful = document.execCommand('copy');
var msg = successful ? 'successful ' : 'unsuccessful';
}
由于缺少任何主题访问名称(SAN)扩展而返回错误,如下面的评论所示。
您需要更正服务器证书,以获得所需的适当主机名(或IP地址)SAN条目。
您可以使用以下命令调试此错误和任何其他TLS连接错误:
{{1}}