猿问

进行 TLS 连接

我通过 openssl 连接到某个服务器:


openssl s_client -crlf -connect somehost.com:700 -cert key.pem

它有效。连接成功。


但是当我尝试从 Go 代码(文档中的示例)中做同样的事情时,它对我不起作用:


import (

    "crypto/tls"

    "crypto/x509"

)


func main() {

    // Connecting with a custom root-certificate set.

    const rootPEM = `

-----BEGIN CERTIFICATE-----

my key text

-----END CERTIFICATE-----`


// First, create the set of root certificates. For this example we only

// have one. It's also possible to omit this in order to use the

// default root set of the current operating system.

roots := x509.NewCertPool()

ok := roots.AppendCertsFromPEM([]byte(rootPEM))

if !ok {

    panic("failed to parse root certificate")

}


conn, err := tls.Dial("tcp", "somehost.com:700", &tls.Config{

    RootCAs: roots,

})

if err != nil {

    panic("failed to connect: " + err.Error())

}

conn.Close()

}

我的文字错误是:


panic: failed to connect: x509: certificate is valid for otherhost.com, not somehost.com [recovered]

问题:我做错了什么?也许我没有添加一些 tls.Config 参数?


慕哥9229398
浏览 149回答 2
2回答

幕布斯6054654

openssl s_client只是一个连接的测试工具,但它并不关心证书是否对连接有效。Go 反而关心证书是否可以被验证,因此您会得到证书无效的信息,因为名称不匹配。我做错了什么?根据错误消息,您确实通过错误的主机名访问了主机。或者您的服务器配置不当,以至于它发送了错误的证书。

慕婉清6462132

我不需要检查服务器的 ssl 证书。它是某个域注册表的演示服务器。所以我需要服务器来检查我的证书。  const certPEM = `-----BEGIN CERTIFICATE-----  -----END CERTIFICATE-----  `  const certKey = `-----BEGIN RSA PRIVATE KEY-----  -----END RSA PRIVATE KEY-----`  cert, err := tls.X509KeyPair([]byte(certPEM), []byte(certKey))  if err != nil {      t.Error("server: loadkeys: %s", err)  }  cfg := tls.Config{      InsecureSkipVerify: true,      ServerName:         "somehost.com",      Certificates:       []tls.Certificate{cert},  }  conn, err := tls.Dial("tcp", "somehost.com:700", &cfg)  if err != nil {      t.Error("failed to connect: " + err.Error())  }  defer conn.Close()  所以这段代码适用于我的情况。
随时随地看视频慕课网APP

相关分类

Go
我要回答