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

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

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

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

Go
幕布斯6054654 2023-06-26 18:08:24
我有一個 gRPC 客戶端和服務(wù)器,兩者都使用 ssl 證書進(jìn)行保護(hù)。如果沒有代理,這些工作就很好。作為測試,當(dāng)我故意創(chuàng)建有缺陷的證書時,它會失敗。稍后在本文中證明這不是證書問題。gRPC 服務(wù)器代碼:// 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)在我嘗試使用轉(zhuǎn)發(fā)代理(我已經(jīng)測試過并且在正常的 HTTP api 請求上工作正常)。然而,它經(jīng)常在通過代理的 gRPC 請求上失敗。我正在使用cuttle,它內(nèi)部使用goproxy并進(jìn)行以下設(shè)置。請注意,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 客戶端和服務(wù)器之間運行代理會導(dǎo)致以下錯誤:傳輸:身份驗證握手失敗:x509:由未知頒發(fā)機(jī)構(gòu)簽名的證書(可能是因為在嘗試驗證候選頒發(fā)機(jī)構(gòu)證書“測試服務(wù)器”時“x509:無效簽名:父證書無法簽署此類證書”這表明這是一個證書問題,但是,正如前面所述和測試的那樣,gRPC 在沒有代理的情況下可以完美工作。另請注意:我不想在代理后面運行 gRPC,但由于開發(fā)環(huán)境而被迫這樣做。gRPC 服務(wù)器和代理運行在同一臺 docker 機(jī)器上。具有相同的 IP 地址將導(dǎo)致以下配置,這只會相互抵消(相信我,我無論如何都嘗試過)。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 地址可以解決這個問題,但是,我什么也學(xué)不到,并且想解決這個問題。我嘗試了像這里回答的配置來設(shè)置不同的docker內(nèi)部IP,但是,該IP將保持為空(僅設(shè)置網(wǎng)絡(luò))并且在新IP上訪問只會超時。
查看完整描述

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è)置。


查看完整回答
反對 回復(fù) 2023-06-26
  • 1 回答
  • 0 關(guān)注
  • 225 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號