关于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();

只需要一行就行。

之所以记录下来,是因为自己碰到这个问题,有点茫然不知如何处理,所以觉得应该记录下来。这个配置是客户端请求携带证书。服务端配置不是这样。请注意!!

posted @ 2018-06-09 15:23  言灵之书  阅读(6535)  评论(1编辑  收藏  举报