2015-09-04 149 views
2

我正在嘗試建立到服務器計算機的TLS連接。我使用openssl CLI命令創建了根CA證書和服務器證書。我創建了具有與其IP地址相同的通用名稱的服務器證書。根CA證書的通用名稱是服務器的FQDN。Openssl:在SSL_CTX_load_verify_locations中使用CApath參數時,證書驗證失敗API

我正在使用openssl庫API建立與服務器的連接。 我現在用的是API

int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile, const char *CApath)

用於設置CA文件查找路徑。

當我使用CAfile參數指定我的CA文件的路徑並將CApath參數保留爲NULL時,一切正常。

但是,如果我用CApath參數指定的路徑到包含CA文件的目錄,留下憑證檔案錯誤參數爲NULL,則連接由於證書驗證錯誤失敗。

當我使用wireshark捕獲數據包時,發現我的客戶端代碼正在從服務器發送「服務器問候」的TLS響應「未知CA」。我已經使用了我在成功連接中使用的相同CA證書文件。

從我的觀察,同時探索OpenSSL庫的源代碼,我推斷,在我的情況下,CA的文件不被認爲是由庫API有效,因此沒有被加載由於一些未知的原因。

有人可以告訴我的原因,如果可能的話,這個問題的解決方案?

+3

如文檔中所述,CApath中的文件是否具有正確的文件名稱(即證書散列)?從https://www.openssl.org/docs/manmaster/ssl/SSL_CTX_load_verify_locations.html:「如果CApath不是NULL,它指向一個包含PEM格式CA證書的目錄,每個文件都包含一個CA證書,文件由CA主題名稱哈希值查找,因此必須可用...「 –

+0

CA證書具有主題名稱(CN = )。但我不明白什麼是主題名稱散列。我在證書中看不到這樣的字段。 – sreeyesh

+3

您的評論顯示您的文件可能沒有正確的名稱。您可以閱讀https://mta.openssl.org/pipermail/openssl-users/2015-July/001687.html以獲取有關如何創建正確文件名的更多信息。 –

回答

3

我張貼的答案我自己的問題,因爲我花了很多時間尋找這個問題的解決方案,因爲我沒有得到關於從互聯網這個問題太多信息。我希望這會幫助其他面臨類似問題的人。

如果CApath不爲空,則CApath指向的目錄應包含有效的CA證書。最重要的是CA文件名應該是主題名稱哈希值。

無論是CA的文件進行重命名,它們的主題名稱的哈希值或軟鏈接到可與名稱相同CA文件的CA主題名散創建的CA文件。

c_rehash實用程序可用於在CApath中創建必要的鏈接。這相當sipmle的語法。

c_rehash <CApath> 

c_rehash實用程序可能不適用於所有的Linux發行版。在這種情況下,

openssl x509 -in <CA file name> -noout -subject_hash 

可用於生成主題名稱散列(例如e5d93f80)。只需將「.0」附加到該值,然後使用該名稱(e5d93f80.0)創建一個到CA文件的軟鏈接。如果有多個CA文件具有相同的主題名稱散列值,則它們的擴展名應該不同(例如,e5d93f80.1)。搜索按分機號碼的順序執行。

opensssl已經引入了這種技術來減少CA文件查找時間。否則,openssl可能必須讀取CApath中的所有文件才能找到匹配的CA文件。

+0

這非常有幫助。謝謝@sreeyesh –

相關問題