专注 K8S研究
分类: 系统运维
2018-12-07 17:32:14
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();
只需要一行就行。
之所以记录下来,是因为自己碰到这个问题,有点茫然不知如何处理,所以觉得应该记录下来。这个配置是客户端请求携带证书。服务端配置不是这样。请注意!!
location upstream test { server 192.168.1.50:8443; } server { listen 1443; server_name ycc.cnpdc.com; location /test/ { proxy_set_header Host caw.welcom.com; 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 key/caw.welcom.com/clinet.pem; proxy_ssl_certificate_key key/caw.welcom.com/clinet.key; proxy_pass } } 请求验证: curl -v