
我正在嘗試製作一個腳本來測試網站是否使用對其網域有效的非自簽名憑證。這意味著它不會在瀏覽器中顯示警告。
我嘗試過
openssl s_client -connect www.example.com:443 -servername www.example.com
即使證書對該網域無效,我仍然得到:
驗證返回碼:0(確定)
知道我怎樣才能實現這一目標嗎?
答案1
如果您希望 openssl 實際驗證證書,您需要告訴它要這樣做。
1. 檢查憑證上的主機名稱是否與您想要的名稱相符
有一個特定的選項,-verify_hostname
.在下面的命令中,我在 serverfault.com 上使用它,但我正在檢查主機名稱 example.com:
[jenny@temeraire crt] $ openssl s_client -verify_hostname example.com -connect serverfault.com:443
CONNECTED(00000003)
[...]
Verify return code: 62 (Hostname mismatch)
---
DONE
然而,進程本身的回傳碼仍然是 0,這意味著您必須查看輸出,而不是在測試中使用返回碼。
2. 檢查憑證是否來自受信任的CA
我已經針對 serverfault.com 網站運行了它,但沒有提供受信任的 CA 清單來再次檢查,以便保證驗證失敗:
[jenny@galactica tmp] $ openssl s_client -verify 2 -connect serverfault.com:443
[...]
Verify return code: 27 (certificate not trusted)
但是,openssl 仍然會給您回傳程式碼 0,因為該命令實際上正確執行,這使得編寫腳本變得更加困難。
更好的方法是先下載證書,然後運行openssl verify
它:
[jenny@galactica tmp] $ openssl verify selfsignedcert.pem; echo $?
selfsignedcert.pem: C=SE, O="Nevermind", CN=foo.example.com
error 18 at 0 depth lookup: self signed certificate
18
如您所見,我得到了回傳碼 18,這表示「自簽名憑證」。還有許多其他錯誤代碼;檢查手冊頁以verify
獲取更多資訊。