我试图让Salesforce.com连接到一个位于我们公司networking内部的biztalk实例。 在这之间,是一个反向代理和一系列防火墙。
当对反向代理进行标准HTTP请求时,biztalk服务器响应正确。 重要的是要注意,反向代理本身似乎正常工作。
我需要做的是启用安全性,限制授权客户访问此Web服务。 最初,这只是Salesforce.com。
Salesforce.com已经提供了他们的SSL证书进行身份validation,我已经把这个证书放在了httpd.conf文件和SSLCACertificateFile指令中。
SSLVerifyClient require SSLVerifyDepth 1 SSLCACertificateFile /opt/apache/veri/auth.crt
当SalesForce连接并且正在使用这些指令时,会生成错误“javax.net.ssl.SSLPeerUnverifiedException:peer not authenticated”。
删除SSLVerifyClient需要,恢复正常的操作。
这是问题:
SSLCACertificateFile /opt/apache/veri/auth.crt
正如您在apache文档中所看到的那样,SSLCACertificateFile指的是颁发给客户端证书的CA证书的path,而不是客户端证书本身。 没有办法要求特定的客户端证书。 但是,您可以做的是要求证书由特定的CA颁发,然后validation证书的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
然后改变你的configuration看起来像这样:
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来testing客户端证书中的variables的几个例子。
SSL身份validation需要整个 CA Chain,包括根CA位于CA文件或CApath中。 我所做的假设是,OpenSSL证书商店中的根CA是足够的 – 事实并非如此。
添加使用的verisign根CA允许validation证书
<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 / CApath。