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();
只需要一行就行。
之所以記錄下來,是因為自己碰到這個問題,有點茫然不知如何處理,所以覺得應該記錄下來。這個配置是客戶端請求攜帶證書。服務端配置不是這樣。請注意!!