gpt4 book ai didi

authentication - 使用 X.509 证书的 Tomcat 9.x.x 客户端身份验证

转载 作者:太空宇宙 更新时间:2023-11-03 15:07:59 24 4
gpt4 key购买 nike

我正在使用 Tomcat 9.0.19 并尝试为特定 Web 应用程序启用基于 X.509 证书的客户端身份验证(又名 I&A)。

总而言之,Tomcat 适用于通过单向 TLS 启用基本 I&A 的应用程序。当访问具有基于证书的 I&A 的 Web 应用程序时,Tomcat 似乎没有在发送 Server Hello Done 之前请求客户端证书作为 Server Hello 消息的一部分,随后它无法通过身份验证检查:

02-Jan-2020 13:00:40.371 FINE [https-jsse-nio-443-exec-10] org.apache.catalina.authenticator.SSLAuthenticator.doAuthenticate 查找证书2020 年 1 月 2 日 13:00:40.830 FINE [https-jsse-nio-443-exec-10] org.apache.catalina.authenticator.SSLAuthenticator.doAuthenticate 此请求中未包含证书

在 Wireshark 中跟踪 TLS 流并看到 TLS 1.2 握手。交换加密数据后不久,Tomcat 会发送“加密警报”消息并关闭套接字。尝试从浏览器联系 Tomcat,执行 GET。浏览器没有提示我选择证书,这似乎也表明 Tomcat 没有向浏览器请求它。

任何帮助将不胜感激!

更多详情:

我们有一组用于 Tomcat 和客户端的证书,由中间 CA 颁发,由根 CA 签名(颁发)。双方(客户端和服务器)都设置了信任库,并且在其中设置了具有正确证书/ key 的 keystore 。 Web 应用程序设置为需要证书 I&A (web.xml):

<security-constraint>
<web-resource-collection>
<web-resource-name>All by default</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>OTService</role-name>
</auth-constraint>

<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>

<login-config>
<auth-method>CLIENT-CERT</auth-method>
<realm-name>certificate</realm-name>
</login-config>

OTService 角色与单个用户帐户一起在 Tomcat-Users.xml 中设置:

现在server.xml中的Connector配置如下:

   <Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="100" SSLEnabled="true" scheme="https" secure="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="/apache-tomcat-9.0.19/conf/km/keyStore.jks"
certificateKeystorePassword="PASSWORD"
certificateKeyAlias="tomcat"
type="RSA" />
truststoreFile="/apache-tomcat-9.0.19/conf/km/trust_store.jks"
truststorePass="PASSWORD"
truststoreType="JKS"
certificateVerification="required"
clientAuth="true"
protocols="TLSv1.2"
</SSLHostConfig>
</Connector>

知道为什么 Tomcat 不请求客户端证书吗?

最佳答案

我发现的第一个问题是 Tomcat 忽略了信任库的 Connector->SSLHostConfig 设置并使用了 JRE 默认信任库。我发现它的方法是让浏览器将协商的 TLS session key 保存到文件 (Google SSLKEYLOGFILE),然后配置 Wireshark 使用该文件,捕获浏览器-Tomcat session ,然后能够以明文形式查看每条消息。

接下来,我发现 Tomcat 实际上是在请求客户端证书,但它发送的已接受根 CA 列表来自默认的 JRE cacerts 文件,而不是来自 truststoreFile 属性指定的文件。通过将 setenv.sh 文件添加到具有 Java 属性的 Tomcat bin 目录以覆盖默认信任存储位置,可以让 Tomcat 全面使用不同的文件。

现在,我在做生意,浏览器能够完成 TLS 握手,但随后的身份验证和授权步骤失败了。我最终确定提供证书的正确方法。 tomcat_users.xml 文件中的主题字段不是“CN=OU Client, OU=Control Systems, O=IoTY, L=Scottsdale, S=AZ, C=US”,而是“CN=OU Client , OU=Control Systems, O=IoTY, L=Scottsdale, ST=AZ, C=US”。最后,我有 2-way TLS 工作。

要记住的一件事是,如果在 Tomcat 上运行的任何东西试图通过 TLS 连接到另一个使用商业 CA 证书的系统,它将失败,因为您现在使用的信任库没有商业根 CA 的证书。修复它的一种方法是制作默认 JRE cacerts 文件的副本,并将系统特定的 CA 证书添加到其中,并从上面提到的 setenv.sh 文件指向它。

关于authentication - 使用 X.509 证书的 Tomcat 9.x.x 客户端身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59569969/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com