在 Tomcat 中验证客户端证书 CN(APR)

在 Tomcat 中验证客户端证书 CN(APR)

我正在运行安装了 APR 库(以及随之而来的 OpenSSL HTTPS 堆栈)的 tomcat 安装。

我想要做的是将特定 HTTPS 连接器锁定到特定证书的用户。添加客户端证书验证没有问题,但我无法让它仅针对特定的通用名称进行验证。

我可能有点天真,认为SSLRequireApache Httpd 中通常使用的 mod_ssl 属性会起作用,但 Tomcat 实现无法识别该属性。(http://tomcat.apache.org/tomcat-7.0-doc/config/http.html#SSL%20Support指向一些 mod_ssl 文档,但是 Tomcat 实现似乎没有涵盖 mod_ssl 的所有方面)。

我可以通过使用 Java 版本的连接器而不是 APR(损失一些性能)来实现这一点,只需添加一个包含该证书的信任存储即可。但是,使用没有 SSLRequire 表达式的 openssl,我不确定如何使用 Tomcat7 做到这一点(如果这很重要的话,在 Windows 上)。

<Connector
   protocol="HTTP/1.1"
   port="443" maxThreads="150"
   scheme="https" secure="true" SSLEnabled="true"
   SSLCertificateFile="mycert.pem"
   SSLCertificateKeyFile="privkey.pem"
   SSLCACertificateFile="CABundle.pem"
   SSLVerifyClient="require" SSLProtocol="TLSv1" SSLRequire="(%{SSL_CLIENT_S_DN_CN} eq &quot;host.example.com&quot;)"/>

您能建议一种使用 Tomcat/APR/OpenSSL 来实现此功能的方法吗?

答案1

上面的摘录来自 sever.xml 文件,对吗?我有一个问题,为什么您没有在您使用的 JVM/JDK 中使用 cacerts 密钥库?您使用它来授予在 tomcat 上运行的应用程序 https 访问权限,对吗?

我很惊讶 PEM 格式的证书在 TOMCAT 中有效。我总是必须将 PEM 证书转换为 DER 格式,然后在 TOMCAT 中使用它。

我会建议:

  1. 使用 Java 安装附带的 keytool 二进制文件在密钥库 /your/path/to/java/jre/lib/security/cacerts 中创建证书。它可帮助您将 Java 应用程序置于 SSL 上。

或者

  1. 如果您已有 CACERT.PEM,请使用 openssl 将其转换为 DER:

openssl x509 -通知 PEM -输入 CACERT.PEM -输出 DER -输出 CACERT.DER

  1. 使用 keytool 将证书导入您的密钥库。

  2. 编辑 server.xml 并按照你的方式进行。

相关内容