JDK1.6使用BouncyCastle第三方jar支持TSL1.2通过Nginx转发多个HTTPS接口

        应用从DMZ迁移到内网后,就不能连接外网了,必须通过代理服务器才能调用第三方接口。使用Nginx作为代理服务器,HTTP的接口代理没有问题,HTTPS的代理采用Nginx的TCP转发模块(Module ngx_stream_core_module)。多个HTTPS接口转发时,需要额外使用preread模块(Module ngx_stream_ssl_preread_module)。HTPPS的接口代理Java后台总是报错:

javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
Caused by: java.io.EOFException: SSL peer shut down incorrectly

Nginx后台报错信息如下:

no host in upstream "", client: 172.17.0.3, server: 0.0.0.0:10443, bytes from/to client:0/0, bytes from/to upstream:0/0

        一开始以为Nginx的配置错误,反复调整后发现,如果在“ map $ssl_preread_server_name ”中配置 default ,则对应的HTTPS接口就能调通,因此可以确定问题出在Java端。安装Haproxy作为代理服务器,在Java后台报同样的错误。问题根源在于项目使用的JDK1.6不支持TLS1.2,做了一个JDK1.8的测试工程,通过代理果然可以顺利调通接口。但是项目JDK的版本不可冒然升级,万幸最后找到第三方的BouncyCastle包可以解决这个问题。在此非常感谢lgs0626的帖子,提供了第三方jar包下载和封装好的TLSSocketConnectionFactory类,直接放到项目里使用就OK了。
       另外,也可以使用Nginx的第三方模块ngx_http_proxy_module,将Nginx作为一个代理服务使用,可以代理任何地址的请求,这样的话需要修改每个HTTP和HTTPS的请求,在代码中添加对应的proxy设置代码,代码改动较多。
本文测试工程下载地址:
https://download.csdn.net/download/eastsea/11226668

你可能感兴趣的:(java)