通过反向代理从 Salesforce.com 进行证书身份验证

通过反向代理从 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 要求后,正常操作恢复。

答案1

问题如下:

SSLCACertificateFile /opt/apache/veri/auth.crt

正如你所看到的Apache 文档,SSLCACertificateFile 表示发证机构证书是客户端证书的证书,而不是客户端证书本身。没有办法要求特定的客户端证书。但是,您可以做的是要求证书由特定的 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 测试客户端证书中的变量。

答案2

SSL 身份验证需要全部的CA 链,包括位于 CAfile 或 CApath 中的根 CA。我假设 OpenSSL 证书存储中的根 CA 足够了 - 但事实并非如此。

添加使用的 verisign Root 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 路径。

相关内容