代码之家  ›  专栏  ›  技术社区  ›  Giovanni Lovato

如何在Jersey服务器中获取/注入当前SSLSession?

  •  1
  • Giovanni Lovato  · 技术社区  · 9 年前

    我有一个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()处抛出NoSuchElementException。nextElement(),即使客户端DID提供了服务器接受的有效SSL证书来建立会话(我用Glassfish 4、WildFly 9和WildFly10来尝试)。

    注:网络。xmlCLIENT-CERT身份验证方法不是我所需要的:我需要获得对客户端证书的引用。

    1 回复  |  直到 9 年前
        1
  •  2
  •   Giovanni Lovato    9 年前

    我找到了这个(未选中)方法来获取 ContainerRequestFilter 来自 ContainerRequestContext ,如果有:

    @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();
        }
    
    }