翻譯:https://raymii.org/s/articles/OpenSSL_Manually_Verify_a_certificate_against_an_OCSP.html?utm_source=tuicool&utm_medium=referral
目錄:
1、ocsp客戶端獲取證書
2、獲取證書信任鏈
3、發送ocsp請求
4、吊銷證書
5、其他錯誤
這篇文章主要用來說明如何借助ocsp服務器來驗證證書。ocsp(The Online Certificate Status Protocol)是一種驗證證書狀態的一種方式,也是CRL(certificate revocation list)證書吊銷的一種替代方式。
與傳統的CRL比較有以下特點:
- 由於相對於傳統的CRL,一個ocsp響應包含的信息更少,故ocsp能夠更有效利用網絡和客戶資源
- 用OCSP,客戶無需自己解析CRL證書吊銷列表,但是客戶需要存儲狀態信息,而由於客戶側需要維護存儲緩存,故導致存儲信息很復雜。在實際使用中,這點帶來的影響卻很小,由於第三庫提供的相關接口已經幫我們完成此類工作
- OCSP通過專用網絡、專用證書、在特定的時間公開其服務。OCSP不強制加密,故可能帶來信息泄露的風險。
此文章中用到的openssl的版本為:OpenSSL 1.0.1g 7 Apr 2014
1、獲取證書用於ocsp驗證
首先,我們將從一個網站上獲取一個證書,這里我們用Wikipedia作為樣例來進行。我們獲取證書通過如下命令:
openssl s_client -connect wikipedia.org:443 2>&1 < /dev/null | sed -n '/-----BEGIN/,/-------END/p'
過該命令可以獲取wikipedia.org的客戶端證書
保存這個輸出到wikipedia.pem文件中
openssl s_client -connect wikipedia.org:443 2>&1 < /dev/null | sed -n '/-----BEGIN/,/-------END/p' > wikipedia.pem
現在,檢查整個證書中是否包含ocsp網址
openssl x509 -noout -ocsp_uri -in wikipedia.pem
若執行正確則輸出 http://ocsp.digicert.com ,否則你就不能驗證這個證書通過ocsp
2、獲取證書鏈
由於這個證書認證是一級一級逐層進行,故需要獲得與這個證書相關的證書鏈。利用openssl s_client -showcerts 選項,能夠查看到在該信任鏈上的所有相關證書
openssl s_client -connect wikipedia.org:443 -showcerts 2>&1 < /dev/null
如你所見,輸出能夠看到兩個證書,number 1 和number 0,其中number 0就是我們剛剛獲取的那個證書。如果你的網站有更多證書在認證鏈中,那么你將看到更多證書。為了發送證書,需要保存證書鏈中所有證書到一個文件chain.pem,按照剛剛命令輸出的證書順序,根證書總是在文件結尾。
3、發送ocsp認證請求
現在我們有ocsp認證請求的所有信息,使用下面命令發送ocsp認證請求。
openssl ocsp -issuer chain.pem -cert wikipedia.pem -text -url http://ocsp.digicert.com
其結果如下
OCSP Request Data: Version: 1 (0x0) Requestor List: Certificate ID: Hash Algorithm: sha1 Issuer Name Hash: ED48ADDDCB7B00E20E842AA9B409F1AC3034CF96 Issuer Key Hash: 50EA7389DB29FB108F9EE50120D4DE79994883F7 Serial Number: 0114195F66FAFF8FD66E12496E516F4F Request Extensions: OCSP Nonce: 0410DA634F2ADC31DC48AE89BE64E8252D12 OCSP Response Data: OCSP Response Status: successful (0x0) Response Type: Basic OCSP Response Version: 1 (0x0) Responder Id: 50EA7389DB29FB108F9EE50120D4DE79994883F7 Produced At: Apr 9 08:45:00 2014 GMT Responses: Certificate ID: Hash Algorithm: sha1 Issuer Name Hash: ED48ADDDCB7B00E20E842AA9B409F1AC3034CF96 Issuer Key Hash: 50EA7389DB29FB108F9EE50120D4DE79994883F7 Serial Number: 0114195F66FAFF8FD66E12496E516F4F Cert Status: good This Update: Apr 9 08:45:00 2014 GMT Next Update: Apr 16 09:00:00 2014 GMT Signature Algorithm: sha1WithRSAEncryption 56:21:4c:dc:84:21:f7:a8:ac:a7:b9:bc:10:19:f8:19:f1:34: c1:63:ca:14:7f:8f:5a:85:2a:cc:02:b0:f8:b5:05:4a:0f:28: 50:2a:4a:4d:04:01:b5:05:ef:a5:88:41:d8:9d:38:00:7d:76: 1a:aa:ff:21:50:68:90:d2:0c:93:85:49:e7:8e:f1:58:08:77: a0:4e:e2:22:98:01:b7:e3:27:75:11:f5:b7:8f:e0:75:7d:19: 9b:74:cf:05:dc:ae:1c:36:09:95:b6:08:bc:e7:3f:ea:a2:e3: ae:d7:8f:c0:9d:8e:c2:37:67:c7:5b:d8:b0:67:23:f1:51:53: 26:c2:96:b0:1a:df:4e:fb:4e:e3:da:a3:98:26:59:a8:d7:17: 69:87:a3:68:47:08:92:d0:37:04:6b:49:9a:96:9d:9c:b1:e8: cb:dc:68:7b:4a:4d:cb:08:f7:92:67:41:99:b6:54:56:80:0c: 18:a7:24:53:ac:c6:da:1f:4d:f4:3c:7d:68:44:1d:a4:df:1d: 48:07:85:52:86:59:46:d1:35:45:1a:c7:6b:6b:92:de:24:ae: c0:97:66:54:29:7a:c6:86:a6:da:9f:06:24:dc:ac:80:66:95: e0:eb:49:fd:fb:d4:81:6a:2b:81:41:57:24:78:3b:e0:66:70: d4:2e:52:92 wikipedia.pem: good This Update: Apr 9 08:45:00 2014 GMT Next Update: Apr 16 09:00:00 2014 GMT
如果你需要更簡略的輸出,去掉-text 選項,該選項一般用於調試
openssl ocsp -issuer chain.pem -cert wikipedia.pem -url http://ocsp.digicert.com wikipedia.pem: good This Update: Apr 9 08:45:00 2014 GMT Next Update: Apr 16 09:00:00 2014 GMT
4、吊銷證書
如果你有一個吊銷的證書,你也可以測試該證書按照上述步驟,所得的響應如下:
Response verify OK test-revoked.pem: revoked This Update: Apr 9 03:02:45 2014 GMT Next Update: Apr 10 03:02:45 2014 GMT Revocation Time: Mar 25 15:45:55 2014 GMT
5、其他錯誤
如果證書和ocsp服務不匹配,驗證將錯誤,使用-text選項可以查看具體錯誤。