2 回答

TA貢獻1773條經(jīng)驗 獲得超3個贊
tls.Certificate 通常存儲證書鏈- 換句話說,> 1 個證書。請注意,它的Certificate
字段是類型[][]byte
,其中每個證書都是一個[]byte
.
tls 包導(dǎo)入了 x509 包,因此 x509 中沒有獲取 tls.Certificate 的函數(shù);這將導(dǎo)致進口周期。但是如果你有一個 x509.Certificate,你就已經(jīng)有一個 tls.Certificate;只需將 x509.Certificate 的Raw
字節(jié)放入 tls.Certificate 的Certificate
切片中。

TA貢獻1796條經(jīng)驗 獲得超7個贊
你可以這樣做:
func LoadP12TLSCfg(keystore, password string) (*x509.CertPool, tls.Certificate, error) {
data, err := ioutil.ReadFile(keystore)
if err != nil {
return nil, tls.Certificate{}, err
}
pk, crt, caCrts, err := pkcs12.DecodeChain(data, password)
if err != nil {
return nil, tls.Certificate{}, err
}
pool := x509.NewCertPool()
pool.AddCert(caCrts[0])
tlsCrt := tls.Certificate{
Certificate: [][]byte{crt.Raw},
Leaf: crt,
PrivateKey: pk,
}
return pool, tlsCrt, nil
}
func LoadServerTLSCfg(keystore, password string) (*tls.Config, error) {
pool, crt, err := LoadP12TLSCfg(keystore, password)
if err != nil {
return nil, err
}
cfg := &tls.Config{
ClientCAs: pool,
ClientAuth: tls.RequireAndVerifyClientCert,
Certificates: []tls.Certificate{crt},
}
return cfg, nil
}
func LoadClientTLSCfg(keystore, password string, serverName string) (*tls.Config, error) {
pool, crt, err := LoadP12TLSCfg(keystore, password)
if err != nil {
return nil, err
}
cfg := &tls.Config{
RootCAs: pool,
Certificates: []tls.Certificate{crt},
ServerName: serverName,
}
return cfg, nil
}
- 2 回答
- 0 關(guān)注
- 283 瀏覽
添加回答
舉報