之前公司開發的小程序已經運行很久了,當初在nginx上面配置https還是蠻簡單的,加載申請的證書就沒啥問題了,現在服務器快要到期了,先遷移到臨時服務器保證這段時間可以運行,就百度找一些教程一會就解決了,可問題來了,ios和測試工具上面都請求成功,但是安卓上面請求失敗,提示請求超時(.其實是提示錯誤)。
當初快過年了,已經無心工作,簡單的看了一下代碼,發現請求超時是在判斷http響應code不等於200時彈出的提示,這就瞬間蒙蔽了,我在各種環境下面訪問這個接口發現接口請求都是200的響應值,也去小程序官方論壇上面求職,因為提示的誤導一直沒有找到解決辦法。
初七上班了,這小程序(內部使用的)還不能用就影響員工了,仔細把代碼看一遍(確實寫的很爛),才發現這個提示 在success和fail都是這個提示,就在測試工具上面寫個測試接口,打印請求的響應結果,才發現問題是ssl握手失敗( request:fail ssl hand shake error ),就再把官方文檔看了一會,感覺就是tls版本的問題,微信要求tls版本需要支持1.2以及1.2以上。
問題發現了,就找資料查看怎么讓服務器支持這個版本協議,看起來很簡單:
SSLProtocol All -SSLv2 -SSLv3 //除了v2 和 v3以外其他的都支持
重啟apache以后,發現還是請求失敗,這就讓我懷疑人生了,難道沒有生效,找到網址查了一下
這不是支持的好好的么,怎么還是握手失敗,如果ios和pc都失敗了碼,那很有可能是正式的問題,現在就只有安卓真機上面請求失敗(ssl握手失敗),這就很蛋疼了。
后續看到一些人的blog上面配置apache 的https發現有的人攜帶了 SSLCACertificateFile 的路徑,有的沒攜帶,因為我記得申請的證書好像有這個文件(對應apache特有的),就試着帶上這個參數,果然,加上之后安卓上面測試就沒問題了,當初配nginx時候沒有這個文件,就一直以為不需要這個根證書。
這里附上 apache 虛擬主機配置ssl的參數
<VirtualHost *:443>DocumentRoot ".../htdocs" ServerName xxx:443SSLEngine onSSLCertificateFile /etc/apache2/ssl/2_xxx.crtSSLCertificateKeyFile /etc/apache2/ssl/3_xxx.keySSLCACertificateFile /etc/apache2/ssl/1_root_bundle.crt..錯誤日志目錄...</VirtualHost>
這里提供一下解決思路
1. 小程序上https請求失敗,先看這個https證書是否可用,用幾個瀏覽器打開這個網址看看
2. 證書沒問題,可以看看是不是服務器的tls版本的問題(附上檢測網址 https://www.ssllabs.com/ssltest/index.html )
3. 如果tls的版本也沒問題,那可以考慮是不是也和我一樣這個配置問題(缺少了根證書文件)