反向代理不会对 Salesforce.com 的 SSLRequire 进行身份验证

反向代理不会对 Salesforce.com 的 SSLRequire 进行身份验证

我正在努力尝试通过 Apache 反向代理从 salesforce.com 获取 SSL 消息。当他们尝试向我们发送消息时,我收到 403(禁止)错误。我已通过 Web 浏览器从后端 Web 服务请求 WSDL 来验证代理是否正常工作,并且无需 SSL 身份验证,它就可以从 IE/FireFox/等浏览器运行。如果我完全关闭 SSLRequire,SFDC 不会报告错误,并会删除该消息。不幸的是,没有消息发送到我的 apache 服务器。我没有收到任何日志,也没有消息。

我相信我想使用指令 SSLRequire 来确定 SSL 消息的发送者是谁。

SSLRequire(%{SSL_CLIENT_S_DN_CN} 等式“proxy.salesforce.com”)

Salesforce.com 向我提供了他们的公钥,因为 CN 实际上是 proxy.salesforce.com:

证书:

Data:
    Version: 3 (0x2)
    Serial Number:
        0c:9e:22:84:5f:b8:55:8c:cb:c5:bf:aa:01:2a:7b:23
    Signature Algorithm: sha1WithRSAEncryption
    Issuer: C=US, O=VeriSign, Inc., OU=VeriSign Trust Network, OU=Terms of use at https://www.verisign.com/rpa (c)10, CN=VeriSign Class 3 International Server CA - G3
    Validity
        Not Before: Dec  7 00:00:00 2011 GMT
        Not After : Dec  7 23:59:59 2013 GMT
    Subject: C=US, ST=California, L=San Francisco, O=Salesforce.com, Inc., OU=Application, CN=proxy.salesforce.com
    Subject Public Key Info:

我的 SSL 请求日志显示:

[2013 年 6 月 11 日:07:50:28 -0400] 96.43.148.8 - TLSv1 RC4-MD5 “POST HTTP/1.1” 416

我的错误日志:96.43.148.8 - - [11/Jun/2013:07:50:28 -0400]“POST HTTP/1.1”403 416“-”“Jakarta Commons-HttpClient/3.1”

我的访问日志显示:

[Tue Jun 11 07:50:28 2013] [info] Access to /opt/apache/htdocs/dev denied for 96.43.148.8 (requirement expression not fulfilled)
[Tue Jun 11 07:50:28 2013] [info] Failed expression: (%{SSL_CLIENT_S_DN_CN} eq "proxy.salesforce.com")
[Tue Jun 11 07:50:28 2013] [error] [client 96.43.148.8] access to /opt/apache/htdocs/dev failed, reason: SSL requirement expression not fulfilled (see SSL logfile for more details)

目前 SFDC 能告诉我的唯一信息是 (403)Forbidden

我的配置文件:

<VirtualHost *:8010>

# Set up logging
LogLevel info
ErrorLog veri/sfdc.error.log
Customlog veri/sfdc.log combined
CustomLog veri/ssl_request_log "%t %h %{SSL_CLIENT_S_DN_CN}c %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"


# misc directives
ServerSignature on

# Enable SSL on front end
SSLEngine On
SSLCertificateFile veri/server.crt
SSLCertificateKeyFile veri/server.key
SSLCertificateChainFile veri/intermediate.crt
SSLProtocol -ALL +SSLv3 +TLSv1
SSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:-LOW:-EXP
SSLOptions -FakeBasicAuth +StdEnvVars

<location />
Order deny,allow
deny from all
allow from 96.43.148.8

SSLRequire (%{SSL_CLIENT_S_DN_CN} eq "proxy.salesforce.com")

</location>

SetEnv USING_SSL_SERVER 1
ProxyRequests off
ProxyVia On
ProxyPreserveHost On
SSLProxyEngine off


ProxyPass <SNIPPED>
ProxyPassReverse <SNIPPED>

</VirtualHost>

答案1

您收到的客户端证书似乎不具备预期的属性。具体来说,它的主题规范名称字段似乎与预期的“proxy.salesforce.com”不匹配

在您的情形下,我会在您的反向代理的外部接口上设置一个 tcpdump,等待来自 96.43.148.8 的连接。然后,我会将该跟踪的结果输入到 wireshark,以便它解析 SSL 握手并允许您获取用于 SSL 客户端身份验证的证书的 subject.cn。

这应该可以很好地指示出哪里出了问题。

答案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 路径。

相关内容