我正在运行安装了 APR 库(以及随之而来的 OpenSSL HTTPS 堆栈)的 tomcat 安装。
我想要做的是将特定 HTTPS 连接器锁定到特定证书的用户。添加客户端证书验证没有问题,但我无法让它仅针对特定的通用名称进行验证。
我可能有点天真,认为SSLRequire
Apache 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 "host.example.com")"/>
您能建议一种使用 Tomcat/APR/OpenSSL 来实现此功能的方法吗?
答案1
上面的摘录来自 sever.xml 文件,对吗?我有一个问题,为什么您没有在您使用的 JVM/JDK 中使用 cacerts 密钥库?您使用它来授予在 tomcat 上运行的应用程序 https 访问权限,对吗?
我很惊讶 PEM 格式的证书在 TOMCAT 中有效。我总是必须将 PEM 证书转换为 DER 格式,然后在 TOMCAT 中使用它。
我会建议:
- 使用 Java 安装附带的 keytool 二进制文件在密钥库 /your/path/to/java/jre/lib/security/cacerts 中创建证书。它可帮助您将 Java 应用程序置于 SSL 上。
或者
- 如果您已有 CACERT.PEM,请使用 openssl 将其转换为 DER:
openssl x509 -通知 PEM -输入 CACERT.PEM -输出 DER -输出 CACERT.DER
使用 keytool 将证书导入您的密钥库。
编辑 server.xml 并按照你的方式进行。