SSL介紹
SSL 介紹、使用及免費(fèi)SSL 申請(qǐng)教程2012年07月15日 ? 免費(fèi)資源, 博文記事? 共 11571字 ? 暫無評(píng)論? 被圍觀 6 分享到:似乎不少使用國外主機(jī)的站長都想弄個(gè) https://
SSL 介紹、使用及免費(fèi)SSL 申請(qǐng)教程
2012年07月15日 ? 免費(fèi)資源, 博文記事? 共 11571字 ? 暫無評(píng)論? 被圍觀 6
分享到:
似乎不少使用國外主機(jī)的站長都想弄個(gè) https:// “玩”,但是許多人對(duì)
SSL/TLS、HTTPS 、證書等概念了解有限,而中文互聯(lián)網(wǎng)上相關(guān)的教程也不是很完備,各種雜亂。正好,本人這幾天花了點(diǎn)時(shí)間研究了一下,給自己的站也部署了 HTTPS ,寫成這篇《Apache WordPress SSL 完全指南》,以饗中文讀者。本文較長,但是我會(huì)盡量寫得清楚明白的。
,一、基本術(shù)語及證書原理介紹
本部分有點(diǎn)枯燥,不愿意讀的讀者可以直接跳過。以下出現(xiàn)的縮寫鼠標(biāo)懸浮于上可查看全稱。
HTTPS
HTTPS 就是“超文本安全傳輸協(xié)議”,通俗地說就是建立在 SSL/TLS 上的 HTTP。 SSL/TLS
理論上講這是兩個(gè)協(xié)議,后者是前者的繼任者,但其實(shí) SSL 3.0 和 TLS 1.0 的差異很小,所以兩者很多時(shí)候是混為一談的??這兩個(gè)都是傳輸層協(xié)議,在他們的基礎(chǔ)上可以建議應(yīng)用層的協(xié)議如 FTP 和 Telnet,上面說的 HTTPS 就是建立在 SSL/TLS 基礎(chǔ)上的 HTTP。
證書
,這里的證書主要指使用公私鑰對(duì)加密的證書。下面主要會(huì)涉及到兩種證書,一個(gè)是 S/MIME 證書,另一個(gè)就是 SSL/TLS 證書了。前者可以用在電子郵件上,這里用作“服務(wù)器身份識(shí)別”,可以理解為取代傳統(tǒng)的“用戶名 密碼”的認(rèn)證方式的一把“鑰匙”。后者一般用于服務(wù)器加密(網(wǎng)頁、郵件服務(wù)等),也就是我們部署 HTTPS 時(shí)所必須的。
本文出現(xiàn)的證書都是用公私鑰加密的證書。這涉及到 [[非對(duì)稱加密]] 技術(shù),每張證書都由一個(gè)公鑰和一個(gè)私鑰組成,兩個(gè)拼在一起才是一套。其中,正如它們的名字所暗示的,公鑰是可以隨便發(fā)給別人看的,而私鑰一定是要保密的,如果私鑰被偷了,后果很嚴(yán)重。
信任鏈與 CA
CA 就是“數(shù)字證書認(rèn)證中心”,是證書的簽發(fā)機(jī)構(gòu)。證書的世界里有一套信任體系,信任了一家機(jī)構(gòu)之后,此機(jī)構(gòu)簽發(fā)的證書都是受信的。在我們的操作系統(tǒng)和瀏覽器中,內(nèi)置了幾家靠譜的 CA 的根證書,并列為可信任的證書。而這些 CA 簽署的證書,由于信任鏈的關(guān)系,也是默認(rèn)被信任的。比如中國招商銀行的網(wǎng)銀頁面就是用的 VeriSign 簽署的的證書。由于 VeriSign 是一家老牌的靠譜 CA,大部分操作系統(tǒng)和瀏覽器默認(rèn)都是信任 VeriSign 的根證書的,當(dāng)然也就默認(rèn)信任招商銀行用的證書了。
如果有一家 CA,比較年輕,發(fā)展得還不夠大,那么就會(huì)面臨有的地方信任,有的地方不信任的問題。比如 CACert.org 就是這樣一家 CA。這是一家靠社區(qū)驅(qū)動(dòng)的 CA,它的根證書受到 Arch Linux 等一些 Linux 發(fā)行版的信任,但是卻不受 Windows 和 OS X 的信任(完整的受信任列表見這里),所以它的網(wǎng)站(用了它自己的證書)若是用 https:// 瀏覽的話(點(diǎn)擊這里),一些 Linux 用戶會(huì)毫無壓力地進(jìn)入,而 Windows 和 OS X 用戶則會(huì)看到證書警告說該網(wǎng)站的證書不受信任。以下兩張截圖便顯示了這一點(diǎn):
而如果有一家 CA 完全就像街頭的“辦證”廣告那樣完全胡來,那自然是沒有任何一家去信任它的證書了,比如下面這個(gè):
,大家都懂的??
不過需要說明的是,如果你使用自簽名證書的話,對(duì)用戶來說默認(rèn)都是不受信任的。
二、部署 HTTPS 的前提條件
以下是部署 HTTPS 的前提:
最好是 VPS 甚至獨(dú)立服務(wù)器。如果是共享主機(jī)的,則需要主機(jī)商提供 SSL/TLS 功能(有的面板有這樣的功能),否則不行。
服務(wù)器上必須開啟了 mod_ssl 。(共享主機(jī)的話,主機(jī)商一般都開啟了)
最好有獨(dú)立 IP。如果沒有,則需要主機(jī)打開 SNI 功能(見 RFC 4366),但 XP IE8 及以下是不支持 SNI 的,會(huì)報(bào)證書錯(cuò)誤。(PS :Showfom 注,也有比較高級(jí)的證書是支持多域名的,比如 CloudFlare 在使用的 GlobalSSL ,如圖) 最好去申請(qǐng)/購買一張正規(guī)的第三方知名 CA 簽署的證書,不要像鐵道部那樣胡
,亂搞一個(gè)。不過,如果你只是為了測(cè)試用途或是對(duì)網(wǎng)站數(shù)據(jù)進(jìn)行特殊加密自己私下使用的話(你懂的),自簽名的證書也是可以的。
推薦有一個(gè) Linux 運(yùn)行環(huán)境。如果已經(jīng)是 Linux 服務(wù)器的話,直接 SSH 進(jìn)服務(wù)器執(zhí)行命令也是可以的。
三、自簽名證書
雖然不一定受信,但是證書的確是人人都可以自己制作的。有的時(shí)候,我們使用 HTTPS 只是為了數(shù)據(jù)的加密,僅供自己使用,不用管別人信任與否,這時(shí)候就可以用到自簽名證書。在這種情況下,你可以把自己創(chuàng)建的證書加入到自己的桌面電腦的信任列表,這樣就不會(huì)再有錯(cuò)誤提示了。
Apache 的文檔中有 Creating self-signed certificates 這一節(jié)教你怎么創(chuàng)建自簽名證書,簡(jiǎn)單明了,十分傻瓜:
用包管理器安裝 ssl -cert 這個(gè)包,再執(zhí)行
sudo make-ssl -cert /usr/share/ssl-cert/ssleay.cnf /path/to/cert.pem 命令,按照提示輸入一個(gè) Common Name(CN ,保持和主機(jī)名相同),便能按照 /usr/share/ssl-cert/ssleay.cnf 這個(gè)默認(rèn)模板生成一份證書,這份證書是公鑰和私鑰合并在一個(gè)文件里的,用文本編輯器打開將看到這樣的結(jié)構(gòu): -----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC3Y VVgZ0R tjV rH4ZAE4EnGhDUPSe GHNFvz9SwpRl/hoCvlclTyV/kZwFC6gS1Gx3wIOM6eBFIMb 16koaOaXWsCNP9LZUjCNj8V497SVvdHqovzx7ztCrKzOcUMK6VwsF/ynJYor6oYQ jdVvLuCnb/fw1Na 9w5fVUees7lVXBY60TRvAS82yyzuwRaZcJHWqTzysKNz01Mk zhcNughh9ONfRC6Q0AeKVLWw
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICpDCCAYwCCQDdTk8KetUkFTANBgkqhkiG9w0BAQUFADAUMRIwEAYDVQQDEwls b2NhbGhvc3QwHhcNMTIwNjEwMTE1NDUwWhcNMjIwNjA4MTE1NDUwWjAUMRIwEAYD 6JWaSpkY1WJ8XPMwc/eAdFi0b58GQtv5uMXwVnjGy/P1TKoP76REt4TVwKXuiTPB 4m/ZyTVbJ81JfSjm0xxTQl39kJjhzNenYOBSOy/1YH2vSRAVnuoy/aFSyXggUz2 PpZt4UZ0c7g=
-----END CERTIFICATE-----
前面那段是私鑰,后面那段是證書信息和公鑰。這份證書默認(rèn)的有效期是 3650 天(十年)。
其實(shí)剛才那個(gè)傻瓜式的命令實(shí)質(zhì)上是執(zhí)行了這個(gè):
sudo openssl req -new -x509 -days 3650 -nodes -out /path/to/cert.pem -keyout /path/to/cert.pem
各參數(shù)的意義:
openssl req -new:用 OpenSSL 套件生成新的證書請(qǐng)求
-x509:使用 X.509(PEM 編碼的一種實(shí)現(xiàn))
-days 3650:有效期是十年,可以自己改
-nodes :這個(gè)不是英文單詞 “nodes ”,而是 “No DES ” 的意思,代表不用 DES 加密私鑰,否則私鑰默認(rèn)是用 DES 加密的,每次啟動(dòng) Apache 要輸入密碼 -out :證書(包括證書信息和公鑰)的文件名
-keyout :私鑰的文件名,如果此項(xiàng)和上一項(xiàng)同名的話,那么公鑰和私鑰是合并
,在同一文件里的(正如上面所貼的)
執(zhí)行這個(gè)命令會(huì)讓你輸入一系列信息,比如 Common Name (CN)、公司名、地理位置、聯(lián)系方式等,除了 CN 必須要和網(wǎng)站域名匹配之外,其他可以按照你的喜好自由填寫。
證書生成好后,便是在 Apache 的配置文件中指定它了。具體的配置文件寫法可以參考它自帶的 /etc/apache2/sites-available/default-ssl 配置文件,主要是以下這幾行要修改:
SSLEngine on
SSLCertificateFile /path/to/cert.crt
SSLCertificateKeyFile /path/to/cert-key.key
并且如果按照上文,把公鑰和私鑰放在同一個(gè)文件里的話,那只要提供
SSLCertificateFile 就好了,后面的 KeyFile 不用填(保持它們的注釋狀態(tài))。 插播:Linux 是不分辨文件擴(kuò)展名的,所以理論上上面的這些公鑰婆鑰私鑰的擴(kuò)展名都是可以隨便起的,甚至不填也可以,但是為了方便自己弄清楚,我習(xí)慣上是這樣命名的:只包含證書信息和公鑰的文件擴(kuò)展名為 crt,同時(shí)包含了公鑰和私鑰的文件擴(kuò)展名為 pem,只包含私鑰的文件擴(kuò)展名為 key。
保存配置文件后,用 sudo a2ensite 來啟用它,再執(zhí)行一下 sudo a2enmod ssl 確保 mod_ssl 已經(jīng)開啟(如果使用虛擬主機(jī)的話,還需要在 apache2.conf 加上 NameVirtualHost *:443 這一條),然后執(zhí)行 sudo service apache2 restart 來重啟 Apache。如果沒有出現(xiàn)奇怪的錯(cuò)誤的話,那么現(xiàn)在你的網(wǎng)站已經(jīng)可以通過 https:// 協(xié)議訪問了。當(dāng)然,由于這個(gè)證書是不受信任的,瀏覽器會(huì)彈出安全警告,不用管,雖然證書是不受信任的,但是畢竟是 TLS,所以傳輸?shù)膬?nèi)容已經(jīng)是加密過的了,第三方無法知道你訪問的網(wǎng)站內(nèi)容。如果不想每次都看到證書警告的話,可以把這個(gè)證書導(dǎo)入到系統(tǒng)中,設(shè)為信任。在 Firefox 中也可以選擇“添加例外”。
四、第三方簽名證書
雖然自簽名證書默認(rèn)是不受操作系統(tǒng)或?yàn)g覽器的信任的,但是這并不影響它能夠加密傳輸內(nèi)容的本質(zhì)。自簽名證書給自己用是足夠了,如果嫌證書警告煩人的話,自己添加為信任就好了,甚至在一小撮人中用也是足夠了——你把證書發(fā)給你的朋友們,讓他們也設(shè)為信任,這樣他們?cè)L問你的網(wǎng)站的時(shí)候也不會(huì)彈警告了。但是如果要全世界大部分人訪問你的網(wǎng)站的時(shí)候都不會(huì)彈證書警告的話,就要找一些靠譜的第三方 CA,讓它們幫你簽名證書,由于大部分人的操作系統(tǒng)或?yàn)g覽器都是信任這些靠譜 CA 的,所以由他們簽名的你的證書也是受信任的,這樣訪問你網(wǎng)站的時(shí)候就不會(huì)彈證書警告了。
注意:第三方簽名證書不代表比自簽名證書的加密更強(qiáng)悍更可靠!TLS 的加密強(qiáng)度由加密的位數(shù)決定,與證書是誰簽名的無關(guān)。找第三方簽名只是為了不彈證書警告。如果你只是自己用或是一小撮人用的話(思路提醒:twip ),用自簽名就足夠了。
要使用第三方簽名證書,首先同樣要?jiǎng)?chuàng)建私鑰:
openssl genrsa 1024 > ssl.key
各參數(shù)含義:
openssl genrsa 1024:用 OpenSSL 來生成一個(gè) 1024 位 RSA 加密的私鑰(Generate RSA),這個(gè)位數(shù)是可以改的
,> ssl.key:通過重定向命令,把生成的私鑰保存到 ssl.key 這個(gè)文件中
生成好了之后用一些圖形化的證書查看器查看大概是這個(gè)樣子的(當(dāng)然,指紋肯定不一樣??)
然后你也得告訴第三方 CA 你的 CN、地址、聯(lián)系方式等,這時(shí)需要使用
Certificate Request,就是“證書請(qǐng)求”,它是私鑰和證書信息的整合,把它交給第三方 CA,他們可以讀取這個(gè)文件中的私鑰和證書信息,然后幫你簽名。這個(gè) Certificate Request 文件的擴(kuò)展名一般用 csr。
在剛才私鑰的基礎(chǔ)上生成證書請(qǐng)求的命令是這個(gè):
openssl req -new -key ssl.key > ssl.csr
執(zhí)行了之后也會(huì)要求你輸入證書的信息,然后把最終生成的結(jié)果放到 ssl.csr 中。如果用文本編輯器打開這個(gè)文件,看到的是類似這樣的東西:(我省略了一部分字符)
-----BEGIN CERTIFICATE REQUEST-----
MIIBhDCB7gIBADBFMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEh MB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIGfMA0GCSqGSIb3DQEB
,AQUAA4GNADCBiQKBgQDXRbfQQP TulvM8Qz5d/IhzLxav6VcX/Zhy5HTftCKeIhH B0bNH6PDxg5tmqY9g9hzgl5OLhkkTYEYsYugKYxdAx/aK3XXAGruguzSbc4fA2Rx leo0Ow9DQGo=
-----END CERTIFICATE REQUEST-----
把這個(gè)文件傳給 CA,他們簽名之后會(huì)給你頒發(fā)公鑰證書,然后把它添加到 Apache 的配置文件中了:
SSLEngine on
SSLCertificateFile /path/to/cert.crt
SSLCertificateKeyFile /path/to/cert-key.key
SSLCertificateChainFile /path/to/chain.pem
因?yàn)檫@是第三方 CA 簽名的,所以要有一個(gè)把你的證書和它的根證書相連接的過程。如下圖:
那個(gè) ChainFile 就是中間那一環(huán)。當(dāng)然了,正如 KeyFile 可以和主證書文件合并一樣,這個(gè) ChainFile 也是可以和主文件合并的,這三個(gè)全部首尾相連地并成一個(gè)文件也是沒有問題的,這樣就只要填一個(gè) SSLCertificateFile 就好了。 改好配置之后,像上面自簽名那樣,也重啟一下 Apache,就可以用 https:// 協(xié)議訪問了。并且,由于是大家都信任的靠譜 CA 簽名的,這樣的證書是不會(huì)彈證書警告的。
五、WordPress HTTPS 免插件部署指南
解決“混合內(nèi)容”問題
這一節(jié)主要講一下 WordPress 的 HTTPS 實(shí)現(xiàn)。在 WordPress 的插件庫中,有一個(gè)叫 Force SSL 的插件,它的作用是當(dāng)用戶用 https:// 訪問的時(shí)候,實(shí)時(shí)解析頁面中所有的 URI,把 http:// 換成 https://。本來我覺得那插件還是不錯(cuò)的,后來我把 php 的內(nèi)存限量稍微改小一些,就大量出現(xiàn) 500 錯(cuò)誤,一看錯(cuò)誤日志,竟然全是那個(gè)插件“試圖分配超過限額的內(nèi)存”,這才覺得這插件實(shí)在太耗資源了!所以我果斷刪除了那個(gè)插件,開始嘗試無插件實(shí)現(xiàn) WordPress 的 HTTPS 訪問。
如果按照上面的教程,把證書什么的都設(shè)置好了的話,這時(shí)候 WordPress 已經(jīng)可以通過 https:// 協(xié)議訪問了,但是有問題:頁面中的圖片、CSS 、JavaScript 的 URI 都是 http:// 的,所以會(huì)有“混合內(nèi)容”的問題,在 Chromium/Chrome 里是一個(gè)難看的紅叉叉(高危內(nèi)容,如 JavaScript)或灰色的鎖上有個(gè)黃三角
,(低危內(nèi)容,如圖片),在 Internet Explorer 里則是顯示為“混合內(nèi)容”,彈出大量煩人的警告窗口。那個(gè) Force SSL 插件的兩大作用之一就是把這種資源的 URI 改成 https:// 的。
但是,讓我們手工來改吧。這里要介紹一下“協(xié)議級(jí)相對(duì)路徑“,例子可以見 Google HTML/CSS Style Guide 的建議:
Omit the protocol from embedded resources.
Omit the protocol portion (http:, https:) from URLs pointing to images and other media files, style sheets, and scripts unless the respective files are not available over both protocols.