自從全球開始推網站必須要支援 SSL (https) 加密之後,我就到 startssl.com 申請了一個免費的 SSL Certificate ,用了一陣子發現,只要用 HTTPS 打開我的個人網站,就有一定的機率會很慢,大約要等待 30 秒左右頁面才會下載完成,奇怪的是只要成功打開過一次頁面,接下來的頁面就不會再卡這麼久了,我一直懷疑是 SSL 的關系,但又沒辦法肯定。
Chrome console tool 是一個很強力的工具,它可以檢測整個網頁的傳輸過程,我使用它來測試我的網站連線資訊,先打開 chrome console toole ,然後再用 HTTPS 連到我的個人網站,結果在 Console Tool 中看到 " initial connection SSL" 的等待時間很長,甚至會超過 30 秒,我幾乎可以肯定這個 SSL 連線一定有問題。

OCSP
在網路上看了一些相關文章,猜測可能是 OCSP (online certificate status protocol) 這個功能造成我的網站特別的慢。
OCSP 是什麼呢? 他存在的目地是為了加快 SSL certificate 驗証的效率,OCSP 是指我們 server 端暫存一份從 certificate authority 給我們的憑証的資料,當 user 透過瀏覽器要跟 Server 做 SSL handshake 時, Server 端可以立馬用這個暫存的 Certificate 回傳給 User ,告知 user 我們家的憑証狀態 ,以便加快 SSL handshake 的速度,如果沒有 OCSP ,那麼 User 要再發一次 Request 到 CA 端,跟發憑証商要你的 Certificate 狀態,因為我的網站沒有實作 OCSP ,所以當 client 拿到 OCSP 驗証結果時,就會轉向 CA 商要求憑証,造成網頁變得很慢很慢。
如何檢查你的 OCSP 是否有開啟
https://www.digicert.com/help/ 這個網站可以幫助我們檢查網站是否有支援 OCSP ,例如我輸入我的網站 domain: www.puritys.me,結果得到 OCSP Staple: Not Enabled ,代表我的網站不支援 OCSP 。

另外我們也可以用 Command line script 的方式來檢查是否有啟用 OCSP,如果看到 "OCSP response: no response sent" ,就代表 ocsp 沒有成功。
- openssl s_client -connect www.puritys.me:443 -status 2> /dev/null
啟用 OCSP on Apache Server
啟用 OCSP 的方式很簡單,你只要在 httpd.conf 加入以下設定,然後再重啟 apache 即可,接著你可以用上面講的兩個方式來測試是否有正確啟用 OCSP ,要注意的是 OCSP 是使用 80 port 來做連線,所以你不要像我一樣,一開始不知道將 " SSLUseStapling on" 設定在 443 port ,結果找半天一直找不到原因。
- <IfModule ssl_module>
- SSLUseStapling on
- SSLStaplingResponderTimeout 5
- SSLStaplingReturnResponderErrors off
- SSLStaplingCache shmcb:/var/httpd/stapling_cache(128000)
- </IfModule>
成功啟用 OCSP 後,你會看到 OCSP Staple 顯示 "Good" 不在是 "Not Enabled" 。
OCSP Debug
- OLDIFS=$IFS; IFS=':' certificates=$(openssl s_client -connect www.puritys.me:443 -showcerts -tlsextdebug -tls1 2>&1 </dev/null | sed -n '/-----BEGIN/,/-----END/ {/-----BEGIN/ s/^/:/; p}'); for certificate in ${certificates#:}; do echo $certificate | openssl x509 -noout -ocsp_uri; done; IFS=$OLDIFS
- // http://ocsp.startssl.com
上面這行指令是用來找出你的 OCSP host,你必需確認你的 Server 與 OCSP host 之間的網路連線是通暢的,例如使用 telnet ocsp.startssl.com 80 來試試看 tcp 連線。
- openssl ocsp -issuer key/chain.crt -cert key/site.crt -text -url http://ocsp.startssl.com -CAfile key/root.crt -nonce
上面的指令是用來測試你的 server 是否可以從 CA 商拿到 OCSP 憑証 ,我的 SSL 憑証是跟 startssl 申請的,所以 CA 端 ocsp 網址為 http://ocsp.startssl.com ,是 http 喔不是 https !!
如果你有看到 "OCSP Response Status: successful " ,代表可以從 CA 端拿到正確的 ocsp 。
參考文章
- What is OCSP https://en.wikipedia.org/wiki/OCSP_stapling
- https://www.ssllabs.com/ssltest/analyze.html
- ocsp debug: https://raymii.org/s/articles/OpenSSL_Manually_Verify_a_certificate_against_an_OCSP.html
- openssl cookbook: https://www.feistyduck.com/library/openssl-cookbook/online/ch-testing-with-openssl.html
- SSL 漏洞 : https://www.sslbuyer.com/index.php?option=com_content&view=article&id=177:fix-ssl-vulnerabilities&catid=25&Itemid=2595