gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:16:27 24 4
gpt4 key购买 nike

我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com