我正在尝试允许 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 路径。