1 回答

TA貢獻(xiàn)1784條經(jīng)驗 獲得超8個贊
背景:
TLS 連接的每一端都需要預(yù)先安排的信任。
go
,當(dāng)使用 TLS 時,在聯(lián)系服務(wù)器時將默認(rèn)使用系統(tǒng)信任鏈。開發(fā)自定義解決方案時,您的應(yīng)用程序服務(wù)器的公共證書很可能不在該系統(tǒng)信任鏈中。所以你有兩個選擇:
通過禁用信任
InsecureSkipVerify: true
(不要這樣做?。?/p>為您的客戶添加自定義信任
您的應(yīng)用程序服務(wù)器很可能有一個自簽名證書,因此很容易獲得其中的公共證書部分。您還可以使用openssl等工具查看服務(wù)器的公共證書- 使用鏈接的解決方案,您不僅可以為您自己的開發(fā)服務(wù)器獲取公共證書,還可以為任何其他遠(yuǎn)程服務(wù)獲取公共證書 - 只需提供主機(jī)名和端口。
所以只是總結(jié)一下你的情況。你有:
Client?<-?TLS?->?Server
但想要:
Client?<-TLS->?Proxy?<-TLS->?Server
因此,您的客戶端現(xiàn)在不需要信任服務(wù)器,而只需信任代理 - 因為它只直接與代理通信。代理很可能有一個自簽名證書(請參閱上面有關(guān)如何提取信任證書的信息)。一旦你有了這個,更新你的go
代碼以使用這個自定義信任文件,如下所示:
// Get the SystemCertPool, continue with an empty pool on error
rootCAs, err := x509.SystemCertPool() // <- probably not needed, if we're only ever talking to this single proxy
if err != nil || rootCAs == nil {
? ? rootCAs = x509.NewCertPool()
}
// Read in the custom trust file
certs, err := ioutil.ReadFile(localTrustFile)
if err != nil {
? ? log.Fatalf("Failed to append %q to RootCAs: %v", localTrustFile, err)
}
// Append our cert to the system pool
if ok := rootCAs.AppendCertsFromPEM(certs); !ok {
? ? log.Fatalf("failed to append custom cert")
}
tlsConfig := &tls.Config{
? ? RootCAs: rootCAs,
}
代理還需要信任服務(wù)器 - 因此如果服務(wù)器的證書不在系統(tǒng)信任鏈中,那么它將需要類似上面的 tls.Config 設(shè)置。
- 1 回答
- 0 關(guān)注
- 225 瀏覽
添加回答
舉報