java - 如何在 Jersey 服务器中获取/注入(inject)当前的 SSLSession?

标签 java ssl jersey jax-rs

我有一个 JAX-RS 应用程序 (Jersey 2.22),我需要在其中获取对等 SSL 客户端证书(服务器已启用相互 SSL 身份验证)。

我想要实现的是:

@GET
@Produces(MediaType.TEXT_PLAIN)
public String clientCertificates() {
    SSLContext sslContext = SSLContext.getDefault();
    SSLSessionContext clientContext = sslContext.getClientSessionContext();
    byte[] sessionId = clientContext.getIds().nextElement();
    SSLSession clientSession = clientContext.getSession(sessionId);
    Certificate[] certificates = clientSession.getPeerCertificates();
    return "The client provided " + certificates.length + " certificates.";
}

但这会在 clientContext.getIds().nextElement() 处抛出 NoSuchElementException,即使客户端 DID 提供了服务器接受的有效 SSL 证书以建立 session (我正在使用 Glassfish 4、WildFly 9 和 WildFly 进行尝试10).

注意:web.xml CLIENT-CERT 身份验证方法不是我所需要的:我需要获得对客户端证书的引用。

最佳答案

我发现这个(未经检查的)方法可以从 ContainerRequestContext 获取 ContainerRequestFilter 中提供的证书,如果有的话:

@Priority(Priorities.AUTHENTICATION)
public class AuthenticationFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        X509Certificate[] certificates = (X509Certificate[]) requestContext.getProperty("javax.servlet.request.X509Certificate");
        Principal principal = certificates[0].getSubjectX500Principal();
    }

}

关于java - 如何在 Jersey 服务器中获取/注入(inject)当前的 SSLSession?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34851218/

相关文章:

java - Telegram bot webhooks、Tomcat 上的 servlet 和 openshift cloud

java - OptaPlanner:使规划实体链接起来并且可以为空

java - 取消匿名TimerTask

ssl - 在 openstack ansible 部署中禁用 validate_certs 为 false

java - REST api 的类级 validator 甚至不执行 validator

java - 如何使用 HSSF(Apache POI)在现有 excel 的两行之间插入一行

java - 在 Java Web 应用程序中处理 X-FORWARDED-PROTO header

.net - 传输层安全 (TLS) 示例?

java - RESTful 层次结构以及 JAX RS 类

java - 使用 Maven 无界范围 JDK 构建 Jersey