resin https 請求報錯解決
阿新 • • 發佈:2018-12-15
問題:
遊戲支付完後,通知服務端,服務端要去蘋果伺服器驗證訂單是否合法。採用的是封裝好的HttpClient 工具。
在與客戶端聯調時,驗證訂單這一步報錯
javax.net.ssl.SSLHandshakeException: Failed to negotiate the use of secure ...
排查
1.在main方法中模擬呼叫這個請求,返回結果正常,可以訪問成功 2.啟動web伺服器後,呼叫驗證的介面,到去蘋果伺服器驗證的時候又丟擲上面的異常 3.考慮是 httpClient 請求https時需要處理,百度一番,按照百度上的修改程式碼,測試結果還是跟第一二步一致
分析
1.為什麼main方法中執行成功,啟動web伺服器,執行相同的邏輯的時候就報錯? 2.網上各種對httpclient的修改都嘗試了,結果都是一樣 3.考慮是否是web容器的原因(專案用的resin伺服器) 4.百度 resin https 配置,一堆亂七八糟的,搜不到想要的 5.直接去resin 配置檔案中搜索 “ssl” 關鍵字(該關鍵字在異常出出現過)
在 resin.xml 中搜出這兩項配置
<system-property jdk.tls.ephemeralDHKeySize="2048" jdk.tls.rejectClientInitiatedRenegotiation="true" sun.security.ssl.allowUnsafeRenegotiation="false" sun.security.ssl.allowLegacyHelloMessages="false"/>
allowUnsafeRenegotiation 該關鍵字與異常資訊中的相似 allowLegacyHelloMessages 該關鍵字與debug時看到的資訊相似 把這兩項配置改成 true
啟動web專案,訪問介面, 執行正常
總結
出現這樣一段程式碼執行出兩個結果的詭異情況時,先斷點看看邏輯是不是一致,再想想是不是環境差異上的問題