Apache-2.2

通過反向代理從 Salesforce.com 進行證書身份驗證

  • June 12, 2013

我正在嘗試允許 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 來測試客戶端證書中的變數。

引用自:https://serverfault.com/questions/513199