普通HTTPS POST這樣
pool := x509.NewCertPool()
caStr, err := ioutil.ReadFile(serverCAFile)
if err != nil {
return nil, fmt.Errorf("read server ca file fail")
}
pool.AppendCertsFromPEM(caStr)
tr := &http.Transport{
TLSClientConfig: &tls.Config{
RootCAs: pool,
},
}
client := &http.Client{Transport: tr}
client.Post(url, bodyType, body)
但是,如果您的網址是使用ip(例如:https://127.0.0.1:8080/api/test)或者你的URL不符合證書的通用名稱,而你只想忽略證書的通用名稱檢查,應該這樣做
pool := x509.NewCertPool()
caStr, err := ioutil.ReadFile(serverCAFile)
if err != nil {
return nil, fmt.Errorf("read server ca file fail")
}
block, _ := pem.Decode(caStr)
if block == nil {
return nil, fmt.Errorf("Decode ca file fail")
}
if block.Type != "CERTIFICATE" || len(block.Headers) != 0 {
return nil, fmt.Errorf("Decode ca block file fail")
}
cert, err := x509.ParseCertificate(block.Bytes)
if err != nil {
return nil, fmt.Errorf("ParseCertificate ca block file fail")
}
pool.AddCert(cert)
tr := &http.Transport{
TLSClientConfig: &tls.Config{
RootCAs: pool,
ServerName: cert.Subject.CommonName, //manual set ServerName
},
}
client := &http.Client{Transport: tr}
client.Post(url, bodyType, body)
來源
2018-02-03 03:33:29
HMZ
不執行通用名稱驗證是否正常?或者,我的使用案例是一個邊緣案例 – frankgreco
IMO它確實沒有意義驗證證書,但不是通用名稱。在這一點上,我可以通過任何域名有效證書,你會檢查並說「是的,看起來確定」,所以你沒有得到任何實際的安全。 – dave
其中是來自'_,err:= cert.Verify(opts)'的'cert' – frankgreco