如何从URL获取证书?

时间:2017-10-13 17:42:42

标签: ssl go ssl-certificate

我试图找到类似于Python ssl.get_server_certificate()的功能,它采用主机名 - 端口对并返回PEM编码的证书,但我还没有任何功能运气。

我已经做了相当多的挖掘,但我发现的最接近的问题(Get remote ssl certificate in golang)没有帮助,也没有阅读包crypto/tls的文档}。我是Go的新手,所以我可能还没有理解文档中的内容

2 个答案:

答案 0 :(得分:6)

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")

答案 1 :(得分:-1)

这仅仅是将main()添加到Tim的示例中,以便人们可以复制和粘贴:

package main

import (
    "bytes"
    "crypto/tls"
    "encoding/pem"
    "fmt"
)

func GetCertificatesPEM(address string) (string, error) {
.... the original function goes here
}

func main() {
    certs, err := GetCertificatesPEM("bitbucket.org:443")
    if err == nil {
        fmt.Printf("len %v : %v\n", len(certs), certs)
    } else {
        fmt.Print("err %v\n", err.Error())
    }
}