最近在工作對(duì)接中發(fā)送https請(qǐng)求交互時(shí)遇到了一個(gè)坑,因?yàn)橥瑯拥膆ttp請(qǐng)求代碼與其他公司對(duì)接都沒問題,而與個(gè)別公司對(duì)接卻發(fā)生了一個(gè)很不可思議的問題.
發(fā)送請(qǐng)求時(shí)總是無法連接上服務(wù)器,httpclient提示peer not authenticated錯(cuò)誤。網(wǎng)上查了很多基本確定是服務(wù)器拒絕握手通信,導(dǎo)致只有客戶端請(qǐng)求而服務(wù)器不應(yīng)答。
之后總結(jié)了下:發(fā)送https請(qǐng)求時(shí)如果遇到這個(gè)問,因?yàn)閷?duì)接方有一個(gè)安全機(jī)制頻繁請(qǐng)求會(huì)有那么個(gè)別兩次被拒絕握手是因?yàn)槲覀兊恼?qǐng)求被認(rèn)為是一種攻擊行為,其實(shí)不然。這個(gè)沒辦法解決,之后間隔幾秒以后再去請(qǐng)求就會(huì)沒問題。
那么問題來了,一直都返回peer not authenticated這個(gè)就不是簡單的問題了。我在網(wǎng)上搜查了很久,掃蕩了幾個(gè)stackoverflow的文章,之后自己做檢查問題。因測試環(huán)境正常而正式環(huán)境不正常那么就有內(nèi)容可以進(jìn)行對(duì)比了。
首先在測試類中加入這句話
System.setProperty("javax.net.debug","ssl,handshake");
這句話可以打印我們請(qǐng)求的具體內(nèi)容信息以便于作對(duì)比
當(dāng)我發(fā)送請(qǐng)求打印信息如下

熒光色的是隨機(jī)數(shù)用于握手成功后服務(wù)器端的加密等操作
可以看到有個(gè)TLSv1 這是因?yàn)槲沂莏dk1.6支持的最高級(jí)別的就是這個(gè)當(dāng)然jdk1.8可以支持TLSv1.2
服務(wù)端接收到以后會(huì)和我進(jìn)行握手認(rèn)證通信

Cipher Suite: SSL_RSA_WITH_RC4_128_MD5? 這句話是服務(wù)器采用了客戶端加密套件中所支持的加密套件組后運(yùn)行通信后續(xù)會(huì)打印很多內(nèi)容并且客戶端會(huì)獲得信息? 。如果和護(hù)短沒有看到*** ServerHello, 開頭的首先查看是否是網(wǎng)絡(luò)限制,排除完自身網(wǎng)絡(luò)問題以后那么在看請(qǐng)求后發(fā)現(xiàn)的返回信息
如果是peer not authenticated那么可以考慮服務(wù)器端與客戶端所支持的加密套件中沒有通過的或者說服務(wù)器端沒有進(jìn)行向下兼容導(dǎo)致不理會(huì)低版本jdk的請(qǐng)求信息。這時(shí)需要讓服務(wù)器端的人去進(jìn)行檢查配置然后對(duì)向下兼容并檢查套件是否支持。如果全部都檢測過了,那么在此請(qǐng)求會(huì)發(fā)現(xiàn)請(qǐng)求成功。