- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 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/
我正在使用SQL Server 2008 R2,并且想创建一个触发器。 对于每个添加(仅添加),将像这样更新一列: ABC-CurrentYear-AutoIncrementCode 例子: ABC-
是否可以在显示最终一致性的数据存储中创建/存储用户帐户? 似乎不可能在没有一堆架构复杂性的情况下管理帐户创建,以避免可能发生具有相同 UID(例如电子邮件地址)的两个帐户的情况? 最终一致性存储的用户
您好, 我有一个带有 Identity 的 .NetCore MVC APP并使用 this指导我能够创建自定义用户验证器。 public class UserDomainValidator : IU
这与以下问题相同:HiLo or identity? 我们以本站的数据库为例。 假设该站点具有以下表格: 帖子。 投票。 注释。 使用它的最佳策略是什么: 身份 - 这是更常见的。 或者 HiLo -
我想将 Blazor Server 与 ASP.NET Identity 一起使用。但我需要使用 PostgreSQL 作为用户/角色存储,因为它在 AWS 中。 它不使用 EF,这是我需要的。 我创
我正在开发一个 .NET 应用程序,它可以使用 Graph API 代表用户发送电子邮件。 提示用户对应用程序进行授权;然后使用获取的访问 token 来调用 Graph API。刷新 token 用
我使用 ASP.NET 身份和 ClaimsIdentity 来验证我的用户。当用户通过身份验证时,属性 User.Identity 包含一个 ClaimsIdentity 实例。 但是,在登录请求期
所以我在两台机器上都安装了 CYGWIN。 如果我这样做,它会起作用: ssh -i desktop_rsa root@remoteserver 这需要我输入密码 ssh root@remoteser
我尝试在 mac osx 上的终端中通过 telnet 连接到 TOR 并请求新身份,但它不起作用,我总是收到此错误消息: Trying 127.0.0.1... telnet: connect to
我正在开发一个 .NET 应用程序,它可以使用 Graph API 代表用户发送电子邮件。 提示用户对应用程序进行授权;然后使用获取的访问 token 来调用 Graph API。刷新 token 用
我正在开发一项服务,客户可以在其中注册他们的 webhook URL,我将发送有关已注册 URL 的更新。为了安全起见,我想让客户端(接收方)识别是我(服务器)向他们发送请求。 Facebook和 G
在 Haskell 中,有没有办法测试两个 IORef 是否相同?我正在寻找这样的东西: IORef a -> IORef a -> IO Bool 例如,如果您想可视化由 IORef 组成的图形,这
我是 .NET、MVC 和身份框架的新手。我注意到身份框架允许通过注释保护单个 Controller 操作。 [Authorize] public ActionResult Edit(int? Id)
我有一列具有身份的列,其计数为19546542,我想在删除所有数据后将其重置。我需要类似ms sql中的'dbcc checkident'这样的内容,但在Oracle中 最佳答案 在Oracle 12
这是我用来创建 session 以发送电子邮件的代码: props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enabl
我想了解 [AllowAnonymous] 标签的工作原理。 我有以下方法 [HttpGet] public ActionResult Add() { return View(); } 当我没
在使用沙盒测试环境时,PayPal 身份 token 对某些人显示而不对其他人显示的原因是否有任何原因。 我在英国使用 API,终生无法生成或找到 token 。 我已经遵循协议(protocol)并
我对非常简单的事情有一些疑问:IDENTITY。我尝试在 phpMyAdmin 中创建表: CREATE TABLE IF NOT EXISTS typEventu ( typEventu
习语 #1 和 #5 是 FinnAPL Idiom Library两者具有相同的名称:“Progressive index of (without replacement)”: ((⍴X)⍴⍋⍋X⍳
当我第一次在 TFS 中设置时,我的公司拼错了我的用户名。此后他们将其更改为正确的拼写,但该更改显然未反射(reflect)在 TFS 中。当我尝试 checkin 更改时,出现此错误: 有没有一种方
我是一名优秀的程序员,十分优秀!