0

总结我的问题:

我有一个面向 Jboss 的 Apache Web 服务器。下面是 Httpd conf 的 ssl 部分

ProxyRequests Off
SSLProxyEngine on

SSLCertificateFile 
/FinMgmt/deploy/https/certs/webserver/fm.insurance.co.uk_a_cert.pem
SSLCertificateKeyFile
/FinMgmt/deploy/https/certs/webserver/fm.insurance.co.uk_a_key.pem

SSLCACertificateFile       
/FinMgmt/deploy/https/certs/fm.insurance.co.uk_CA_cert.pem
SSLVerifyClient optional_no_ca
SSLOptions +ExportCertData
ProxyPass /webapp1 https://fm.insurance.co.uk:8443/webapp1
ProxyPassReverse /webapp1 https://fm.insurance.co.uk:8443/webapp1
ProxyPass /webapp2 https://fm.insurance.co.uk:8443/webapp2
ProxyPassReverse /webapp2 https://fm.insurance.co.uk:8443/webapp2

下面是来自 jboss server.xml 的 ssl 部分:

    <!-- SSL/TLS Connector configuration using the admin devl guide keystore clientAuth=false -->
    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
    maxThreads="500" scheme="https" secure="true"
    clientAuth="false" sslProtocol="TLS"
    keystoreFile="${jboss.server.home.dir}/conf/server.keystore"
    keystorePass="glamdev"
    truststoreFile="${jboss.server.home.dir}/conf/server.truststore"

    truststorePass="passwd"/>

据我了解,Apache 配置为使用 SSLVerifyClient optional_no_ca 的 2 路相互身份验证,这意味着客户端可能提供也可能不提供证书。

现在 jboss 被配置为一种方式的 SSL 身份验证。现在我的理解是,当浏览器发送请求 apache 时,apache 将响应证书,浏览器将尝试使用其根 CA 进行身份验证或抛出异常,要求用户存储它。

当 apache 将请求路由到 jboss 时,这里 apache 将充当客户端,jboss 作为 SSL 服务器,jboss 将从密钥库发送其证书,该证书将由 Apache 使用 SSLCACertificateFile 指令进行验证

如果 jboss 必须重定向到自己,它必须通过反向代理,因为我们设置了 proxyPassReverse。在这种情况下,jboss 将充当 SSL 客户端,Apache http 作为 SSL 服务器,Apache 将发送 jboss 验证使用的证书信任库中的 CA 证书。我在解释配置文件方面是对的吗?

另外我不完全理解在 SSLVerifyClient 中使用 optional_no_ca。apache 是否会从浏览器请求证书,或者它取决于浏览器?

实际上,我继承了这个应用程序而没有任何文档,我正在努力理解它。

4

1 回答 1

2

我假设您所追求的是在您的 JBoss 应用程序中使用客户端证书身份验证来验证浏览器(而不是 Apache Httpd 作为 JBoss 的客户端)。

如果你想让 Apache Httpd 作为 JBoss 容器前面的反向代理,你需要配置 Apache Httpd 来请求和处理客户端证书身份验证。特别是,您应该使用它的SSLCA*SSLVerifyClient指令,它是mod_ssl.

在 Apache Httpd 和 JBoss 工作节点之间配置 SSL/TLS 是独立的。如果您当时在受信任的网络上,通常没有必要这样做。如果您确实需要 SSL/TLS,请使用 Apache Httpd 的SSLProxy*指令来配置要信任的 CA。话虽如此,这样做肯定会在您的应用程序中造成更多混乱,因为客户端证书信息的来源会产生歧义:JBoss 容器级别的真实客户端证书身份验证或中继证书,由 Apache Httpd 处理。

实际上,您需要将客户端证书信息传递给您的容器以获取更多信息,如本答案中所述。


相反,如果您追求的是 Apache Httpd 和 JBoss 之间的客户端证书身份验证,您需要使用 SSL/TLS 保护此连接并确保是否来自反向代理(将提供其证书),您应该能够使用SSLProxyMachineCertificateFileApache Httpd 2.4 中的可用功能。(这种配置当然不寻常。)


编辑:(随着问题的变化。)

据我了解,Apache 配置为使用 SSLVerifyClient optional_no_ca 的 2 路相互身份验证,这意味着客户端可能提供也可能不提供证书。

SSLVerifyClient optional_no_ca意味着 Apache Httpd 只会检查客户端是否拥有它提供的证书的私钥:它不会验证证书是否受信任(变得SSLCACertificateFile无用)。如果您希望证书的显示是可选的,但仍要根据您的 PKI 进行验证,请使用SSLVerifyClient optional(with SSLCACertificateFile)。

现在 jboss 被配置为一种方式的 SSL 身份验证。现在我的理解是,当浏览器发送请求 apache 时,apache 将响应证书,浏览器将尝试使用其根 CA 进行身份验证或抛出异常,要求用户存储它。

是的,而且浏览器与 Apache Httpd 的连接与 JBoss 无关。

当 apache 将请求路由到 jboss 时,这里 apache 将充当客户端,jboss 作为 SSL 服务器,jboss 将从密钥库发送其证书,该证书将由 Apache 使用 SSLCACertificateFile 指令进行验证

不,它是SSLProxyCACertificateFile(或...Path

如果 jboss 必须重定向到自己,它必须通过反向代理,因为我们设置了 proxyPassReverse。在这种情况下,jboss 将充当 SSL 客户端,Apache http 作为 SSL 服务器,Apache 将发送 jboss 验证使用的证书信任库中的 CA 证书。我在解释配置文件方面是对的吗?

我不确定在哪种情况下 JBoss 会“重定向到自己”(或者您的意思是什么)。没有任何迹象表明 JBoss 在这里扮演了客户的角色。这不是什么ProxyPassReverse

另外我不完全理解在 SSLVerifyClient 中使用 optional_no_ca。apache 是否会从浏览器请求证书,或者它取决于浏览器?

当您设置SSLVerifyClientoptionaloptional_no_carequire时,服务器将请求证书。使用require,如果客户端不发送(它信任的)连接,它将终止连接。

就您的配置而言,没有任何迹象表明将客户端证书传送到 JBoss 容器。它没有在 Apache Httpd 级别以任何方式进行验证(任何拥有自签名客户端证书的人都可以在此处连接)。原则上,您可以使用optional_no_ca, 让任何证书通过,并且仅在它们到达 Java 容器后对其进行验证,但您肯定需要一些额外的自定义代码才能在 JBoss 应用程序中执行此操作。您还需要以某种方式传达证书本身(例如,通过mod_header自定义标头或更直接使用mod_proxy_ajp.

于 2012-07-29T19:40:44.533 回答