2017-06-05 210 views
0

我有一個證書鏈爲: root CA -> intermediate CA -> org CA -> client CertOpenssl的驗證與鏈接的CA和鏈接證書

當我驗證與CA的客戶端證書爲root CA -> intermediate CA -> org CA,它的工作原理:

$ cat org_1_ca/ca_crt.pem intermediate_ca/ca_crt.pem root_ca/ca_crt.pem > /tmp/test123.pem $ openssl verify -CAfile /tmp/test123.pem client/client_crt.pem client_crt.pem: OK

但是,當我將我的客戶證書鏈接到組織CA(org CA -> client Cert),並將其餘鏈作爲CA(root CA -> intermediate CA),但它不包含:

$ cat intermediate_ca/ca_crt.pem root_ca/ca_crt.pem > /tmp/test12.pem $ openssl verify -CAfile /tmp/test12.pem client/org1_client_crt.pem client/org1_client_crt.pem: C = US, ST = CA, L = LA, O = PP, OU = TEST, CN = user error 20 at 0 depth lookup:unable to get local issuer certificate

這是根本錯誤的東西還是openssl verify不喜歡這樣的東西?我嘗試了與nginx和openssl connect相同的事情,那裏沒有運氣。任何幫助表示讚賞。

+0

Stack Overflow是編程和開發問題的網站。這個問題似乎與題目無關,因爲它不涉及編程或開發。請參閱幫助中心的[我可以詢問哪些主題](http://stackoverflow.com/help/on-topic)。也許[超級用戶](http://超級用戶。com /)或[Unix&Linux Stack Exchange](http://unix.stackexchange.com/)將是一個更好的地方。另請參閱[我在哪裏發佈有關Dev Ops的問題?](http://meta.stackexchange.com/q/134306) – jww

+0

好點,下次會多加註意! – Amir

回答

1

openssl命令行verify操作如果多於一個給定讀取只有一個證書,第一個,從給定爲操作數的文件,或從每個文件。這與-CAfile -trusted -untrusted選項指定的文件不同,後者可以(通常包含)多個證書。

您的文件client/org1_client_crt.pem可能包含客戶端證書和'org CA'證書,按照該順序。只有客戶端證書被使用,'org CA'證書被忽略,結果你沒有一個有效的鏈來驗證。

如果您想使用命令行來模擬/測試接收器(對於客戶端證書,服務器)將執行的驗證,請將葉證書作爲操作數以及所有其他傳輸(鏈)證書提供給-untrusted,以及錨點加上信任庫中的任何「已知」中介,無論是明確的還是默認的。

沒有openssl connect操作;我假設你的意思是openssl s_client,包括-connect在內的選項,因爲這是使用客戶端證書鏈有意義的一個地方。選項s_client類似地只使用文件中的第一個證書。除了最新版本1.1.0之外,命令行上沒有指定客戶機鏈的選項,甚至在那裏它也沒有記錄,因此您必須仔細閱讀幫助信息或代碼,儘管API /庫很長支持這個你自己寫的代碼。

通過1.0.2,如果你想發送一個客戶端證書的全連鎖到服務器(你應該每個RFC),假設服務器請求客戶端身份驗證,這是不正常的,不是默認的nginx(其他),你必須使用一個技巧:供應都在信任需要客戶鏈中的證書,除了到錨(一個或多個)需要驗證服務器,或者使用-CAfile和/或-CApath明確,或使用(如果需要修改)默認信任庫,除非您的openssl是較早的非RedHat版本,其中默認信任庫僅在s_client s_server s_time中不起作用。

對於s_server中的服務器證書/鏈也是如此,只是幾乎總是使用它,而不是非常少。