java - 如何在码头服务器中列出服务器端的客户端证书
问题描述
我已经设置了一个 Jetty 服务器,其中 ssl 上下文使用密钥和信任存储进行了更新,但是,任何具有服务器信任的有效证书的客户端都能够建立到服务器的 TLS 连接。
但是,我需要知道所有可能的受信任客户端中的哪个客户端当前正在发出请求;换句话说,我需要知道在此连接中使用的客户端证书,特别是在处理程序中。有谁知道如何访问此证书,或者是否有可能?
我想对证书执行一些自定义检查,以根据证书中的某些字段进一步过滤掉客户端,然后再将它们呈现给服务器?
PS:我确实尝试在网上查看并进行了一些研究,但似乎没有任何效果。
解决方案
首先添加SecureRequestCustomizer
到您HttpConfiguration
正在ServerConnector
使用的。
这反过来将添加几个请求属性,您可以使用这些属性访问连接和请求/响应交换中存在的安全信息。
示例(来自LikeJettyXml.java
):
// === jetty-http.xml ===
ServerConnector http = new ServerConnector(server,
new HttpConnectionFactory(http_config));
http.setPort(8080);
http.setIdleTimeout(30000);
server.addConnector(http);
// === jetty-https.xml ===
// SSL Context Factory
SslContextFactory sslContextFactory = new SslContextFactory();
sslContextFactory.setKeyStorePath("config/etc/keystore");
sslContextFactory.setKeyStorePassword(...);
sslContextFactory.setKeyManagerPassword(...);
sslContextFactory.setTrustStorePath("config/etc/keystore");
sslContextFactory.setTrustStorePassword(..);
// SSL HTTP Configuration
HttpConfiguration https_config = new HttpConfiguration(http_config);
https_config.addCustomizer(new SecureRequestCustomizer()); // <-- the magic line
// SSL Connector
ServerConnector sslConnector = new ServerConnector(server,
new SslConnectionFactory(sslContextFactory,HttpVersion.HTTP_1_1.asString()),
new HttpConnectionFactory(https_config));
sslConnector.setPort(8443);
server.addConnector(sslConnector);
一旦这到位,当您处理请求时,您可以访问请求属性...
request.getAttribute("javax.servlet.request.X509Certificate")
java.security.cert.X509Certificate
-在连接中使用的数组request.getAttribute("javax.servlet.request.cipher_suite")
- 协商的密码套件的名称(字符串类型)request.getAttribute("javax.servlet.request.key_size")
- 密钥大小(整数类型)request.getAttribute("javax.servlet.request.ssl_session_id")
- SSL 会话 ID(字符串类型)request.getAttribute("org.eclipse.jetty.servlet.request.ssl_session")
-javax.net.ssl.SSLSession
连接使用的活动。
您应该能够从这些信息源之一获得所需的信息。(请不要更改这些属性的任何值,否则会冒各种奇怪行为的风险)
推荐阅读
- angular - 如何在 Angular 8 中关闭按钮单击上的 p 对话框?
- python-3.x - 如何在 Python 中使用正则表达式进行否定搜索?
- javascript - 将来自 OpenWeatherMap 的响应集成到我的 HTML 中的问题
- java - 如何使用 @Query 向标准 CRUD Spring JPA 存储库方法添加其他方法(例如按名称、角色、类别搜索)?
- python - 使用 Python 使用服务帐户的 Google 用户列表
- batch-file - 使用批处理文件启动程序时,显示“找不到'example.exe'”
- pandas - 根据列值(字符串,子字符串)比较两个数据框并更新另一个列值
- mysql - MySQL 8:插入、更新、删除和更改模式时性能非常慢
- github - Github 的一般工作流程
- azure - 如何使用 Azure 函数将 teradata 表复制到 Azure sql?