2016-11-22 59 views
0

我想驗證證書是否由子CA頒發。我使用下面的命令:驗證BEM中的PEM證書有錯誤但返回代碼OK

openssl verify -verbose -CAfile "/usr/share/jenkins/sub-ca.crt" cert.crt 

cert.crt在這種情況下是一個自簽名證書,所以它不是由sub-ca.crt發出的。 sub-ca.crt是由我們的root-ca頒發的證書。 當我運行命令,會顯示正確的錯誤:

error 18 at 0 depth lookup:self signed certificate 

,但此行 OK 下顯示,當我檢查與$返回代碼?我得到0作爲返回碼。 爲什麼在發生錯誤時該命令返回OK?

回答

1

verify命令嘗試建立證書鏈,驗證該鏈是完整的,檢查目的,檢查信任設置,整個鏈條的檢查有效性(如對時間等)等

由於verify是一個診斷工具,它的返回代碼並不意味着證書被成功驗證,這意味着該命令已成功運行到完成而沒有任何致命錯誤。某些類型的錯誤被視爲非致命錯誤,例如:自簽名證書,證書過期,錯誤處理證書擴展等。非致命錯誤仍將顯示,但不會影響最終的「確定」結果。

+0

感謝您的回答!有沒有辦法檢查這個命令的錯誤代碼?我必須知道它是否由CA頒發,並且爲此目的不接受自簽名證書。 – user3296316

+0

我不認爲你可以從命令行做到這一點(至少不是沒有刮掉文本輸出)。您將不得不直接使用libcrypto API來執行此操作。 –

0

在這種情況下,由OpenSSL命令返回的錯誤18表示它是在深度0處找到的自簽名證書,而自簽名證書未存在於其內部存儲中(或者在此命令的情況下,它不與-CAfile選項一起提供)。

通常,OpenSSL會嘗試組成一個證書鏈,它是基於證書或證書鏈提供驗證的頒發者,以及作爲-CAfile或-CAPath選項的一部分給出的證書。

它期望鏈中的自簽名證書(即最上面的證書鏈)也應該作爲-CAfile或-CAPath選項的一部分來呈現,即它們被驗證者信任。

在問題中,情況並非如此,因此也是錯誤。

+0

我不確定您提到的頁面在說明時是正確的*「由於OpenSSL無法驗證[自簽名]證書的任何簽名者,因此無法驗證證書....一旦您獲得簽名鏈上的某個人信任[您將得到Verify OK(0)]「*。 OpenSSL遵循RFC 5280和RFC 4158.RFC允許自簽名的最終實體證書,因此沒有理由拒絕一個可信任的證書。如果一個可信的('-CApath'或'-CAfile')被拒絕,那麼它就是OpenSSL中的一個bug。 – jww

+0

@jww,我對你的評論不是很清楚。這裏的要點是有一個自簽名證書提供用於驗證,並且該證書也不存在於受信任的存儲庫中,即不顯示-CAfile選項。所以它失敗了。其他信息是,這個自簽名證書是在深度爲0.我會嘗試重寫我的答案。 – Jay