首页 > 解决方案 > 如何在码头服务器中列出服务器端的客户端证书

问题描述

我已经设置了一个 Jetty 服务器,其中 ssl 上下文使用密钥和信任存储进行了更新,但是,任何具有服务器信任的有效证书的客户端都能够建立到服务器的 TLS 连接。

但是,我需要知道所有可能的受信任客户端中的哪个客户端当前正在发出请求;换句话说,我需要知道在此连接中使用的客户端证书,特别是在处理程序中。有谁知道如何访问此证书,或者是否有可能?

我想对证书执行一些自定义检查,以根据证书中的某些字段进一步过滤掉客户端,然后再将它们呈现给服务器?

PS:我确实尝试在网上查看并进行了一些研究,但似乎没有任何效果。

标签: javaauthenticationssljettyembedded-jetty

解决方案


首先添加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连接使用的活动。

您应该能够从这些信息源之一获得所需的信息。(请不要更改这些属性的任何值,否则会冒各种奇怪行为的风险)


推荐阅读