如何从 URL 获取证书?
How can I fetch a certificate from a URL?
我试图找到一个类似于 Python 的 ssl.get_server_certificate()
的函数,它需要一个主机名端口对和 returns 一个 PEM 编码的证书,但我没有'运气好。
我已经进行了相当多的挖掘,但我发现的最接近的问题 () 没有帮助,阅读包 crypto/tls
的文档也没有帮助。我是 Go 的新手,所以我可能没有理解文档中的某些内容
import (
"bytes"
"crypto/tls"
"encoding/pem"
)
func GetCertificatesPEM(address string) (string, error) {
conn, err := tls.Dial("tcp", address, &tls.Config{
InsecureSkipVerify: true,
})
if err != nil {
return "", err
}
defer conn.Close()
var b bytes.Buffer
for _, cert := range conn.ConnectionState().PeerCertificates {
err := pem.Encode(&b, &pem.Block{
Type: "CERTIFICATE",
Bytes: cert.Raw,
})
if err != nil {
return "", err
}
}
return b.String(), nil
}
用法:
certs, err := GetCertificatesPEM("example.com:443")
如果服务器检查客户端证书,那将不起作用。如果客户端没有有效证书,服务器会断开 TLS 连接(上面的代码根本没有证书。
- Server <---Client Hello------------ golang代码
- Server ----Server Hello with cert--> golang代码
在这一步你已经有了服务器的证书,但是无法在tls.Dial()(connection)中得到它,因为连接没有建立。
- Server <---Client cert(空证书)----golang代码。
- 服务器(如果启用验证)断开连接,因为客户端证书无效。
最终,golang 代码 returns 出现错误,您没有获得服务器证书,无论您在第 2 步中已经拥有它。
我试图找到一个类似于 Python 的 ssl.get_server_certificate()
的函数,它需要一个主机名端口对和 returns 一个 PEM 编码的证书,但我没有'运气好。
我已经进行了相当多的挖掘,但我发现的最接近的问题 (crypto/tls
的文档也没有帮助。我是 Go 的新手,所以我可能没有理解文档中的某些内容
import (
"bytes"
"crypto/tls"
"encoding/pem"
)
func GetCertificatesPEM(address string) (string, error) {
conn, err := tls.Dial("tcp", address, &tls.Config{
InsecureSkipVerify: true,
})
if err != nil {
return "", err
}
defer conn.Close()
var b bytes.Buffer
for _, cert := range conn.ConnectionState().PeerCertificates {
err := pem.Encode(&b, &pem.Block{
Type: "CERTIFICATE",
Bytes: cert.Raw,
})
if err != nil {
return "", err
}
}
return b.String(), nil
}
用法:
certs, err := GetCertificatesPEM("example.com:443")
如果服务器检查客户端证书,那将不起作用。如果客户端没有有效证书,服务器会断开 TLS 连接(上面的代码根本没有证书。
- Server <---Client Hello------------ golang代码
- Server ----Server Hello with cert--> golang代码 在这一步你已经有了服务器的证书,但是无法在tls.Dial()(connection)中得到它,因为连接没有建立。
- Server <---Client cert(空证书)----golang代码。
- 服务器(如果启用验证)断开连接,因为客户端证书无效。
最终,golang 代码 returns 出现错误,您没有获得服务器证书,无论您在第 2 步中已经拥有它。