通過反向代理從 Salesforce.com 進行證書身份驗證
我正在嘗試允許 Salesforce.com 連接到位於我們公司網路內的 biztalk 實例。中間是反向代理和一系列防火牆。
當針對反向代理髮出標準 HTTP 請求時,biztalk 伺服器會正確響應。需要注意的是,反向代理本身似乎工作正常。
我需要做的是啟用安全性,將對該 Web 服務的訪問限制為授權客戶端。最初,這只是 Salesforce.com。
Salesforce.com 提供了他們的 SSL 證書進行身份驗證,我已將此證書放在帶有 SSLCACertificateFile 指令的 httpd.conf 文件中。
SSLVerifyClient require SSLVerifyDepth 1 SSLCACertificateFile /opt/apache/veri/auth.crt
當 SalesForce 連接並使用這些指令時,會生成錯誤“javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated”。
刪除 SSLVerifyClient 要求,恢復正常操作。
SSL autentication 需要整個CA 鏈,包括根 CA 位於 CAfile 或 CApath 中。我的假設是 OpenSSL 證書儲存中的根 CA 是足夠的 - 它不是。
添加使用的威瑞信根 CA 允許驗證證書
<Location /> SSLVerifyClient optional SSLVerifyDepth 10 SSLRequire (%{SSL_CLIENT_S_DN_CN} eq "<Partner CN name>") SSLCACertificatePath /opt/apache/veri/CA </Location>
如果您使用 SSLCACertificatePath 指令,請不要忘記重新散列 /opt/apache/veri/CA 路徑。
這是問題所在:
SSLCACertificateFile /opt/apache/veri/auth.crt
正如您在apache 文件中看到的那樣,SSLCACertificateFile 表示客戶端證書的頒發 CA證書的路徑,而不是客戶端證書本身的路徑。沒有辦法要求特定的客戶端證書。但是,您可以做的是要求證書由特定 CA 頒發,然後驗證證書的 CN。
因此,您需要讓您的客戶向您發送簽署其證書的證書的公共部分。您還需要檢查他們的證書包含的 CN:
$ openssl x509 -in path/to/clientcert.crt -noout -text|grep Subject|grep CN Subject: C=US, ST=Something, L=Something, O=Organization Name, OU=SomeOU, CN=host.name.example.com
然後將您的配置更改為如下所示:
SSLVerifyClient require SSLRequire %{SSL_CLIENT_S_DN_CN} eq "host.name.example.com" SSLVerifyDepth 1 SSLCACertificateFile /opt/apache/veri/auth.crt
這告訴 Apache 它將接受 SSL 連接,但前提是證書中的主機名是
host.name.example.com
並且證書已由其證書在/opt/apache/veri/auth.crt
.在 Apache 的 mod_ssl 文件中有更多資訊,其中有幾個範例說明瞭如何使用 SSLRequire 來測試客戶端證書中的變數。