You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Jetty 11迁移至Jetty 12:如何获取SSL连接信息?

在Jetty 12中获取SSL会话及客户端证书相关属性

Jetty 12对内部API做了重构,原Jetty 11依赖的非标准请求属性已不再直接提供,需通过以下方式获取你需要的SSL相关信息:

1. 获取SSL协议与加密套件

通过Jetty原生Request实例获取SslConnection,进而拿到SSLSession提取协议和加密套件:

import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.io.ssl.SslConnection;
import jakarta.servlet.http.HttpServletRequest;

// 在Servlet方法中获取Jetty原生Request
HttpServletRequest servletRequest = ...;
Request jettyRequest = Request.getRequest(servletRequest);

// 获取SslConnection并提取SSLSession
SslConnection sslConnection = jettyRequest.getConnection().unwrap(SslConnection.class);
if (sslConnection != null) {
    SSLSession sslSession = sslConnection.getSslSession();
    String sslProtocol = sslSession.getProtocol(); // 对应ssl_protocol=TLSv1.3
    String sslCipher = sslSession.getCipherSuite(); // 对应ssl_cipher=TLS_CHACHA20_POLY1305_SHA256
}

2. 获取客户端证书及相关信息

前提配置

需先在Jetty的SSL连接器中启用客户端认证,否则无法获取客户端证书。示例配置(jetty.xml):

<New id="sslContextFactory" class="org.eclipse.jetty.ssl.SslContextFactory.Server">
  <Set name="keyStorePath">你的密钥库路径</Set>
  <Set name="keyStorePassword">密钥库密码</Set>
  <!-- 根据业务需求选择:needClientAuth强制要求客户端证书,wantClientAuth可选 -->
  <Set name="needClientAuth">true</Set>
</New>

提取客户端证书信息

标准Servlet属性jakarta.servlet.request.X509Certificate在Jetty 12中仍可使用,用于获取客户端证书数组:

import java.security.cert.X509Certificate;
import java.util.Base64;

// 获取客户端证书数组
X509Certificate[] clientCerts = (X509Certificate[]) servletRequest.getAttribute("jakarta.servlet.request.X509Certificate");
if (clientCerts != null && clientCerts.length > 0) {
    X509Certificate clientCert = clientCerts[0];
    
    // 获取客户端DN(对应ssl_client_i_dn=CN=xyz)
    String sslClientIDN = clientCert.getSubjectX500Principal().getName();
    
    // 转换为PEM格式证书(对应x_ssl_client_cert)
    String pemCert = "-----BEGIN CERTIFICATE-----\n" +
        Base64.getEncoder().encodeToString(clientCert.getEncoded()) +
        "\n-----END CERTIFICATE-----";
}

注意事项

  • 若未配置客户端认证,jakarta.servlet.request.X509Certificate属性会为null;
  • org.eclipse.jetty.server.x509属性仅存储服务器证书,与客户端证书无关;
  • 所有操作需做空值判断,避免因非SSL请求导致空指针异常。

内容的提问来源于stack exchange,提问作者Michał Niklas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 05:20:18