2017-10-13 58 views
2

我試圖找到一個類似於Python的ssl.get_server_certificate()的函數,它需要一個主機名 - 端口對並返回一個PEM編碼的證書,但我沒有任何運氣。如何從URL獲取證書?

我已經做了相當多的挖掘工作,但是我發現的最接近的問題(Get remote ssl certificate in golang)沒有幫助,也沒有閱讀關於包crypto/tls的文檔。我是新來走,所以我可以在文檔中有不明白的東西

回答

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