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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章