先來回顧一下,瀏覽器在訪問 https **時,如何得知服務端是否支援 http/2?答案是借助 http/2 的協議協商機制:在 http/2 over http 中,可以使用 http 的 upgrade 機制進行協商;而對於 http/2 over tls,可以使用 tls 的 npn 或 alpn 擴充套件來完成協商。http/2 的這兩種協商方式,不了解的同學請看《談談 http/2 的協議協商機制》,這裡不再贅述。
當前所有瀏覽器,都只支援 http/2 over tls。也就是說,瀏覽器和服務端都支援 npn 或 alpn 協商,是用上 http/2 的大前提。本文重點討論 npn 和 alpn。
大部分 web server 都依賴 openssl 庫提供 https 服務,對於它們來說,是否支援 npn 或 alpn 完全取決於使用的 openssl 版本。通常,如果在編譯時不特意指定 openssl 目錄,web server 會使用作業系統內建的 openssl 庫。
openssl 1.0.2 才開始支援 alpn,當前主流伺服器作業系統基本都沒有內建這個版本。以下是乙份粗略的統計(via):
作業系統
內建 openssl 版本
centos 5
0.9.8e
centos 6
1.0.1e
centos 7
1.0.1e
ubuntu 14.04 lts
1.0.1f
ubuntu 16.04 lts
1.0.2g
debian 7 (wheezy)
1.0.1e
debian 8 (jessie)
1.0.1k
這份**列舉的系統中,只有最近剛發布的 ubuntu 16.04 才內建了支援 alpn 的 openssl 1.0.2。也就是說,直接使用系統 openssl 庫的 web server,極有可能不支援 alpn 擴充套件。
去年,google 在 chrome 47 中移除了對 npn 的支援,只支援 alpn,但很快就引發一大批 http/2 **的抱怨。最終,google 不得不在接下來的版本中又重新啟用了 npn。
半年後的今天,google 又一次決定在 chrome 51 中移除 npn,預計 5 月底發布。這一次恐怕不會再反悔了。
本文開頭那篇文章的作者悲觀地認為:現在 openssl 1.0.2 的普及程度仍然太低,chrome 現在去掉對 npn 的支援,仍然會導致一大批不支援 alpn 的 http/2 **最終無法協商到 http/2,只能降級使用 http/1.1。
對此,我的觀點是,該來的總會來,既然不能改變結果,不如早做準備。
通過 openssl 命令列工具,可以快速檢視自己的 http/2 服務是否支援 alpn 擴充套件:
openssl s_client -alpn h2 -servername imququ.com -connect imququ.com:443 < /dev/null | grep 'alpn'
如果結果包含alpn protocol: h2
,說明服務端支援 alpn,不受 chrome 51+ 去掉 npn 的影響。
如果結果包含no alpn negotiated
,說明服務端不支援 alpn,在 chrome 51+ 中無法協商到 http/2,需要盡快公升級。
由於 openssl 是系統基礎庫,大量其他軟體都對它有依賴,如果直接公升級系統自帶的 openssl,很容易引發各種問題。更為穩妥的做法是在編譯 web server 時自己指定 openssl 的位置。例如,我在《本部落格 nginx 配置之完整篇》這篇文章中提供的 nginx 編譯步驟中,就通過--with-openssl
指定了新版 openssl 原始碼路徑,這樣編譯出來的 nginx 就會用上最新的 openssl 庫。
如果你在用 libressl 做為 web server 的 ssl 庫,需要公升級到 2.1.3+ 才支援 alpn。
okhttp 是乙個 android 下比較常用的 http 客戶端,支援 http 和 http/2 協議。它在一年前也移除了對 npn 的支援,所以支援 http/2 但不支援 alpn 的**,在 okhttp 客戶端中會降級到 http/1.1。
chrome 51 這次也會徹底移除對 spdy 的支援,如果你的**還只支援 spdy,趁這個機會直接公升級到 http/2 + alpn 吧。
我們為什麼加班
4 在方法上,持續學習。方法總比問題多,我們只有不斷學習,不斷提高自己的知識和能力,才能不斷使用更好的方法來完成任務,好的方法的標準就是更好的生產力。5 在執行上,提高軟體質量。這個涉及知識 技術 方法學等各個方面,也涉及到軟體開發的各個過程,不僅包括設計 的質量,同樣包括文件的質量。軟體質量提高了...
為什麼我們道歉
2017年就在拐角處,當我說這是乙個新的開始的時候,我想我為大家說話 有一些令人興奮的關於重置按鈕,從頭開始,這就是這篇文章。你看,有不可避免地伴隨著愛的東西 痛苦。當我4個月前結婚的時候,最後一件事就是傷害了我的妻子。但無論我嘗試多麼努力,無論我付出多少努力,無論我投入多少技能,我都不可避免地說 ...
我們為什麼吵架?
有一位名人在部落格上說 任何一種穩定關係都是奴役與被奴役的關係。在感情中同理,也是主動和被動的關係。如果還沒有確定,就要通過吵架 離家出走等等手段來確定地位。兩個人明明相愛,往往最不憚以直接強硬的態度對待對方。大到經濟大事 百年樹人育兒方針,小到今天晚上吃饅頭還是麵條,都有可能發生激烈爭吵,彷彿和自...