線上業(yè)務(wù)遇到了一個奇怪的事情条获,服務(wù)訪問https域名有問題牌柄,日志里報錯大量的connection reset 。之前一直都好著啊歧蕉,怎么突然就報這個錯历筝。瀏覽器訪問了一下https的網(wǎng)站發(fā)現(xiàn)沒問題啊。怎么java服務(wù)訪問就有問題了廊谓。
抓包
遇到這種網(wǎng)絡(luò)上的問題梳猪,就不要猜了,先tcpdump一下,再wireshark分析下吧春弥。
抓到的網(wǎng)絡(luò)包如下:
分析tcp stream 發(fā)現(xiàn)呛哟,emmm,為什么只發(fā)了一個client hello 就給我reset了匿沛。這是什么操作扫责?讓我們來看一下我的打招呼的方式有問題嗎?
點開逃呼,似乎沒啥問題啊鳖孤,這里是TLS 1.0。反正問題已經(jīng)定位了抡笼,首先這是服務(wù)端問題苏揣,不是我客戶端問題。因為我就發(fā)了一個client hello推姻,服務(wù)端就reset我平匈。這明顯不是我客戶端的鍋啊,而且問題還是再TLS握手階段出的問題藏古。因為連 TLS 過程都還沒有建立好呢增炭。
好吧,問題是服務(wù)端拧晕,而且是nginx這塊隙姿,因為TLS的加解密是nginx這塊在做的。
分析
難道是nginx的配置沒寫支持TLS 1.0 厂捞。因為前段時間對nginx做了一次遷移孟辑,但似乎我也沒改域名的配置啊∧枨茫看看配置饲嗽。
對啊。server 塊中 ssl_protocols TLSv1 奈嘿,這不就是TLS1.0 么貌虾。怎么回事。裙犹。尽狠。
算了,那就nginx這塊再抓包吧叶圃。袄膏。。在nginx這塊抓包發(fā)現(xiàn)掺冠,數(shù)據(jù)包是TLS1.0 全部被reset了沉馆。好吧,應(yīng)該就是nginx這塊不支持TLS1.0 的問題。但是我配置文件明明是寫的支持俺夂凇揖盘??锌奴?
殺手锏
看來要第三方分析一下該域名了兽狭。
https://www.ssllabs.com/ssltest
用ssl test 測試一下 我們這個網(wǎng)站支持什么樣的客戶端。
這里是我已經(jīng)更正nginx后的截圖鹿蜀,源截圖是TLS 1.0 顯示的是No
好吧箕慧,果然不支持≤钋。靠~ 那就是nginx不支持 TLS1.0 的事實鐵定了颠焦。
回到問題源點,nginx到底是出了什么問題琐簇?最后想到了http塊蒸健。
問題解決
原來是http塊也配置了 ssl_protocols TLSv1.1 TLSv1.2; 單單忘了TLSv1 座享。這導致了 http塊 覆蓋了 server 塊的內(nèi)容婉商,所以TLS1 nginx不支持。導致的reset渣叛。
使用opensll 測試一下:
$ openssl s_client --connect xxx.xxx.mi.com:443 -showcerts -tls1
CONNECTED(00000003)
depth=2 C = US, ST = Arizona, L = Scottsdale, O = "GoDaddy.com, Inc.", CN = Go Daddy Root Certificate Authority - G2
verify return:1
depth=1 C = US, ST = Arizona, L = Scottsdale, O = "GoDaddy.com, Inc.", OU = http://certs.godaddy.com/repository/, CN = Go Daddy Secure Certificate Authority - G2
verify return:1
.....
通了丈秩。。淳衙。