2012-04-10 172 views
9

有沒有辦法使用一組合理的CA證書設置OpenSSL上下文(SSL_CTX而不是自己發佈它們?我不想讓他們保持最新的責任。國際海事組織的任何現代操作系統都應該提供「讓我信任的CA證書」作爲一項服務,但我不知道事實是否如此。我不介意三次(一次用於Windows,一次用於Mac OS X,一次用於Linux)編寫此代碼,但我寧願在此處編寫此代碼。特別是,我寧願不編寫代碼來窺探安裝了哪些瀏覽器並試圖提取他們的可信證書。 (顯然這是easy to get this very wrong。)OpenSSL合理的可信CA證書默認值?

答案爲最新版本的Linux似乎是叫SSL_CTX_load_verify_locations/etc/ssl/certs/ca-certificates.crt(該文件是否存在)。

Windows和Mac OS X有簡單的答案嗎?

回答

5

在OS X上,您可以從用戶的鑰匙串中獲取用戶信任的證書信息。下面是一個包含了一些非常好的信息收集使用可可這些信息的鏈接:

Get Certificates in Keychain

如果可可不是您的需求確定的依賴,並希望直接在命令行做的一切,你可以使用certtool實用程序 - 請參閱man certtool和其他在線文檔以瞭解它。要列出用戶的登錄鑰匙串中的所有證書,你可以這樣做:

certtool y k=login.keychain 

或獲得的名單內置可信系統根:

certtool y k=/System/Library/Keychains/SystemRootCertificates.keychain 

,也許

certtool y k=/System/Library/Keychains/SystemCACertificates.keychain 

我確信還有其他方法可以使用系統接口來獲取這些信息。

在Linux方面,是的,/etc/ssl/certs/ca-certificates.crt是正確的路要走。當安裝ca-certificates軟件包時,該文件將存在於Debian衍生產品(包括Ubuntu變體)中,而我不確定如何在基於Redhat的系統上正確使用該文件。

+0

您是否知道'certtool'對於顯式標記爲「永不信任」的證書行爲如何? – Bruno 2012-04-26 20:40:38

+0

我不認爲certtool會顯示任何有關信任級別的信息;你會想要使用不同的機制來查詢信任度。如果你真的想要使用命令行工具,那麼試試'man security'是一個好方法。 – 2012-04-26 21:19:48

+1

另請參見MacPorts的certsync實用程序(https://trac.macports.org/browser/trunk/dports/security/certsync/#files,實際代碼位於files/certsync.m中),該程序還導出受信任的紮根到一個文件中並確實注意信任標誌(通過不導出它們)。 – neverpanic 2015-07-03 12:45:59

7

這裏是我落得這樣做:

在Windows上:使用CertOpenSystemStore,環比他們使用CertEnumCertificatesInStore獲得從Windows "ROOT"證書庫中的證書,從CERT_CONTEXTpbCertEncoded場搶X509編碼的原始憑證,使用d2i_X509創建一個OpenSSL X509結構,並使用X509_STORE_add_cert將其添加到OpenSSL證書存儲中。 Windows的所有功能都可從​​獲得。

在Mac OS X:使用SecKeychainOpen"/System/Library/Keychains/SystemRootCertificates.keychain"鑰匙扣獲得證書,創建一個迭代器使用SecKeychainSearchCreateFromAttributes在鑰匙串中的證書,使用SecKeychainSearchCopyNext迭代,得到使用SecItemExport原料X509證書,創建使用d2i_X509的OpenSSL的證書,並使用X509_STORE_add_cert將其添加到OpenSSL商店。 Mac的功能可從/Systems/Library/Frameworks/Security.framework/Security獲得。

一個更好的方法可能是創建一個OpenSSL X509_STORE,該回調使用OS函數來驗證單個根證書,而不是複製所有這些證書,但我沒有嘗試過。

+0

你可以分享代碼嗎? – proteneer 2014-01-26 05:31:08

+0

@proteneer,代碼現在是這裏的Racket openssl庫的一部分:https://github.com/plt/racket/tree/master/racket/collects/openssl/private – 2014-01-26 16:02:30