解決這個(gè)問(wèn)題花了很多時(shí)間,特意寫(xiě)出來(lái):
如果遇上這個(gè)問(wèn)題障陶,通常和系統(tǒng)安裝的openssl版本有關(guān)。本質(zhì)上是因?yàn)榱难担?qǐng)求https的時(shí)候咸这,底層的校驗(yàn)算法要求密碼更長(zhǎng)了。
這個(gè)問(wèn)題通常發(fā)生在魔眨,服務(wù)端用了比較舊的加密算法媳维,而客戶(hù)端用了比較新的。這和openssl的安全等級(jí)有關(guān)
這是openssl上安全等級(jí)的文檔:https://www.openssl.org/docs/man1.1.0/man3/SSL_CTX_get_security_level.html
新版本的安全等級(jí)默認(rèn)是2遏暴,以前的版本通常是1侄刽。
level2要求dh key (就當(dāng)作密碼吧)的長(zhǎng)度更長(zhǎng)。
那么問(wèn)題來(lái)了朋凉,在不能升級(jí)對(duì)方服務(wù)器openssl和修改自身服務(wù)器配置的情況下州丹,如何解決?
本質(zhì)上杂彭,需要在https調(diào)用的時(shí)候墓毒,把安全等級(jí)設(shè)置為1或者0(不推薦)。那么怎么做亲怠?我相信有更多的辦法所计,我為了趕時(shí)間,只找到這個(gè)方式(對(duì)應(yīng)php7.2版本及以上有效)
為什么我的方法只對(duì)7.2以上有效团秽?因?yàn)?.2的更新文檔才給出了這個(gè)功能主胧。
php7.2版本的更新文檔:https://www.oschina.net/news/91008/php-7-2-0
具體做法是:
ssl選項(xiàng)中,設(shè)置安全等級(jí)為1即可习勤,然后把這個(gè)東西傳到可以使用它的地方踪栋,比如file_get_contents,fopen 等图毕。file_get_contents可以用夷都,但不太推薦。
如果你的版本是7.2以上予颤,那么請(qǐng)你繼續(xù)google囤官,找到方式后告訴我厢破。
另一個(gè)解決問(wèn)題的思路:
ps:openssl在編譯安裝的時(shí)候可以指定默認(rèn)安全等級(jí),但是我的環(huán)境在docker別人編譯好的鏡像中治拿,所以改起來(lái)不方便摩泪。如果你的不是,你可以去指定劫谅,我相信也能解決問(wèn)題见坑。
理論依據(jù):
至于為什么圖片上寫(xiě)的是1,我認(rèn)為是對(duì)方文檔沒(méi)更新捏检。我在一篇英文評(píng)論里發(fā)現(xiàn)了荞驴,現(xiàn)在新版本的openssl(1.1.1c)默認(rèn)填寫(xiě)的是2。