第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

goproxy 后面的 gPRC 返回證書錯誤,無需代理即可正常工作

goproxy 后面的 gPRC 返回證書錯誤,無需代理即可正常工作

Go
幕布斯6054654 2023-06-26 18:08:24
我有一個 gRPC 客戶端和服務器,兩者都使用 ssl 證書進行保護。如果沒有代理,這些工作就很好。作為測試,當我故意創(chuàng)建有缺陷的證書時,它會失敗。稍后在本文中證明這不是證書問題。gRPC 服務器代碼:// Creates a new gRPC server// Create the TLS credentialscreds, err := credentials.NewServerTLSFromFile("configs/cert/servercert.pem", "configs/cert/serverkey.pem")if err != nil {    log.Fatalf("could not load TLS keys: %s", err)}// Create an array of gRPC options with the credentialsopts := []grpc.ServerOption{grpc.Creds(creds)}// create a gRPC server objects := grpc.NewServer(opts...)gRPC 客戶端代碼:// Create the client TLS credentialscreds, err := credentials.NewClientTLSFromFile("configs/cert/servercert.pem", "")if err != nil {    log.Fatalf("could not load tls cert: %s", err)}conn, err := grpc.Dial(grpcUri, grpc.WithTransportCredentials(creds))if err != nil {    log.Fatalf("Unable to connect: %v", err)}現(xiàn)在我嘗試使用轉發(fā)代理(我已經測試過并且在正常的 HTTP api 請求上工作正常)。然而,它經常在通過代理的 gRPC 請求上失敗。我正在使用cuttle,它內部使用goproxy并進行以下設置。請注意,InsecureSkipVerify布爾值已被嘗試過true和false。根據(jù)我對 SSL 的(有限)了解,這需要如此,false因為它將在線檢查證書,并且這些證書是自簽名的,所以自然會失敗。然而,我再次嘗試了true兩者false// Config proxy.proxy := goproxy.NewProxyHttpServer()proxy.Tr = &http.Transport{    // Config TLS cert verification.    TLSClientConfig: &tls.Config{InsecureSkipVerify: !cfg.TLSVerify},    Proxy:           http.ProxyFromEnvironment,}在 gRPC 客戶端和服務器之間運行代理會導致以下錯誤:傳輸:身份驗證握手失敗:x509:由未知頒發(fā)機構簽名的證書(可能是因為在嘗試驗證候選頒發(fā)機構證書“測試服務器”時“x509:無效簽名:父證書無法簽署此類證書”這表明這是一個證書問題,但是,正如前面所述和測試的那樣,gRPC 在沒有代理的情況下可以完美工作。另請注意:我不想在代理后面運行 gRPC,但由于開發(fā)環(huán)境而被迫這樣做。gRPC 服務器和代理運行在同一臺 docker 機器上。具有相同的 IP 地址將導致以下配置,這只會相互抵消(相信我,我無論如何都嘗試過)。ENV http_proxy 192.168.99.100:3128ENV https_proxy 192.168.99.100:3128ENV no_proxy 192.168.99.100 # <- this would be the gRPC server IP, which is the same as the proxy. resulting in nothing being run through a proxy.分割 docker 中的 IP 地址可以解決這個問題,但是,我什么也學不到,并且想解決這個問題。我嘗試了像這里回答的配置來設置不同的docker內部IP,但是,該IP將保持為空(僅設置網絡)并且在新IP上訪問只會超時。
查看完整描述

1 回答

?
青春有我

TA貢獻1784條經驗 獲得超8個贊

背景:

TLS 連接的每一端都需要預先安排的信任。

go,當使用 TLS 時,在聯(lián)系服務器時將默認使用系統(tǒng)信任鏈。開發(fā)自定義解決方案時,您的應用程序服務器的公共證書很可能不在系統(tǒng)信任鏈中。所以你有兩個選擇:

  • 通過禁用信任InsecureSkipVerify: true(不要這樣做?。?/p>

  • 為您的客戶添加自定義信任

您的應用程序服務器很可能有一個自簽名證書,因此很容易獲得其中的公共證書部分。您還可以使用openssl等工具查看服務器的公共證書- 使用鏈接的解決方案,您不僅可以為您自己的開發(fā)服務器獲取公共證書,還可以為任何其他遠程服務獲取公共證書 - 只需提供主機名和端口。


所以只是總結一下你的情況。你有:

Client?<-?TLS?->?Server

但想要:

Client?<-TLS->?Proxy?<-TLS->?Server

因此,您的客戶端現(xià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,

}

代理還需要信任服務器 - 因此如果服務器的證書不在系統(tǒng)信任鏈中,那么它將需要類似上面的 tls.Config 設置。


查看完整回答
反對 回復 2023-06-26
  • 1 回答
  • 0 關注
  • 246 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號