關於nginx正向代理帶證書請求的處理


1.在工作中配到了需要nginx代理到https請求,並需要攜帶證書的請求,在測試的時候用的是直接調用地址沒有代理。可以正常請求,httpclient(version: 4.5.3)請求帶證書:

 1    URL url = this.getClass().getResource("/cd/weijianming")//獲取證書,發送POST請求;里面是證書路徑
  
2 KeyStore keyStore = KeyStore.getInstance("PKCS12");
 3 // 從配置文件里讀取證書的路徑信息,  4 FileInputStream instream = new FileInputStream(url.getFile());  5 // 證書密碼  6  keyStore.load(instream, "123dsfasdfsdsf");  7  instream.close();  8 SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, MCH_ID.toCharArray()).build();  9 SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null, SSLConnectionSocketFactory.getDefaultHostnameVerifier()); 10 CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();

此代碼用來創建帶證書的httpclient,創建完成之后就可以發送請求攜帶證書了。就可以用主方法測試了。

 

2.但是在布置代碼到測試環境的時候,由於服務器限制,只能通過代理訪問外網請求,代理之后發現證書帶不過去,一直報錯缺少證書,然后繞了一上午的彎路,終於下午找到解決方法。

  1)nginx 版本要是 1.7.1 之后,因為proxy_ssl_certificate這個命令之前的版本不支持。nginx 配置如下:

location /test/ {
				proxy_set_header Host $host;
				proxy_set_header X-Real-IP $remote_addr;
				proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
				proxy_redirect    off; 
				proxy_ssl_certificate       證書路徑;
				proxy_ssl_certificate_key   key路徑; 
				proxy_pass 外網地址;
			  }

只需要替換文本里面的漢字即可實現配置。然后直接代理請求地址就可以訪問了。需要注意的是此時代碼里面就不用加載證書了。以上java代碼可以替換為:

        CloseableHttpClient httpclient = HttpClients.createDefault();

只需要一行就行。

之所以記錄下來,是因為自己碰到這個問題,有點茫然不知如何處理,所以覺得應該記錄下來。這個配置是客戶端請求攜帶證書。服務端配置不是這樣。請注意!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM