3

Grizzly 2.3 に基づく JAX-RS Web サービスを実行するサーバーで、クライアント x.509 証明書の CN フィールドを確認したいと考えています。Grizzly 1 の例をいくつか見つけましたが、コードが大幅に変更されているようです。ここに私が持っているコード:

class Transport {
    public static void main(String[] args){
        ResourceConfig rc = new PackagesResourceConfig(Transport.class.getPackage().getName());     
        String url = "http://myhost:8080/myURL";        
        URI uri = UriBuilder.fromUri(url).build();
        HttpServer server = GrizzlyServerFactory.createHttpServer(uri, rc);
        SSLContextConfigurator sslContext = new SSLContextConfigurator();
        sslContext.setKeyStoreFile("path_to_my_keystore");
        sslContext.setKeyStorePass("password");
        sslContext.setTrustStoreFile("path_to_my_truststore");
        sslContext.setTrustStorePass("password");
        sslContext.setSecurityProtocol("TLSv1.2");
        SSLEngineConfigurator sslEngineConfigurator = new  SSLEngineConfigurator(sslContext);
        sslEngineConfigurator.setNeedClientAuth(true);
        sslEngineConfigurator.setWantClientAuth(true);
        sslEngineConfigurator.setEnabledCipherSuites(new String[]{"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256", "TLS_RSA_WITH_AES_128_CBC_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", "TLS_RSA_WITH_AES_128_CBC_SHA"});
        sslEngineConfigurator.setClientMode(false);
        NetworkListener listener = new NetworkListener("grizzly_ssl", uri.getHost(), 8443);
        listener.setSecure(true);
        listener.setSSLEngineConfig(sslEngineConfigurator);
        server.addListener(listener);
    }

    @POST
    @Produces({ MediaType.APPLICATION_XML })
    @Consumes({ MediaType.APPLICATION_XML })
    @Path("foo")
    public Response receivePayload(MyPayload payload) {
        // How can I get the CN of the client x.509 certificate / or the fingerprint of the certificate?
    }
}
4

1 に答える 1

2

[1] と [2] で答えが見つかりました。

[1] Jersey / Spring で pki 証明書を取得するには? [2] Grizzly と ServletContainerContext

動作するコードは次のとおりです (Jersey 2 ではなく、Jersey 1.1 のみ):

class Transport {
    public static void main(String[] args){
        ResourceConfig rc = new PackagesResourceConfig(Transport.class.getPackage().getName());     
        String url = "http://myhost:8080/myURL";        
        URI uri = UriBuilder.fromUri(url).build();
        HttpServer server = GrizzlyServerFactory.createHttpServer(uri, new HttpHandler() {
            @Override
            public void service(Request request, org.glassfish.grizzly.http.server.Response response) throws Exception {
                response.setStatus(404, "Not found");
                response.getWriter().write("404: not found");   
            }
        }); 

        // Initialize and register Jersey Servlet
        WebappContext context = new WebappContext("WebappContext", "");
        ServletRegistration registration = context.addServlet("ServletContainer", ServletContainer.class);
        registration.setInitParameter(ServletContainer.RESOURCE_CONFIG_CLASS, 
            ClassNamesResourceConfig.class.getName());
        registration.setInitParameter(ClassNamesResourceConfig.PROPERTY_CLASSNAMES, Transport.class.getName());
        registration.addMapping("/*");
        context.deploy(server);


        SSLContextConfigurator sslContext = new SSLContextConfigurator();
        sslContext.setKeyStoreFile("path_to_my_keystore");
        sslContext.setKeyStorePass("password");
        sslContext.setTrustStoreFile("path_to_my_truststore");
        sslContext.setTrustStorePass("password");
        sslContext.setSecurityProtocol("TLSv1.2");
        SSLEngineConfigurator sslEngineConfigurator = new  SSLEngineConfigurator(sslContext);
        sslEngineConfigurator.setNeedClientAuth(true);
        sslEngineConfigurator.setWantClientAuth(true);
        sslEngineConfigurator.setEnabledCipherSuites(new String[]{"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256", "TLS_RSA_WITH_AES_128_CBC_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", "TLS_RSA_WITH_AES_128_CBC_SHA"});
        sslEngineConfigurator.setClientMode(false);
        NetworkListener listener = new NetworkListener("grizzly_ssl", uri.getHost(), 8443);
        listener.setSecure(true);
        listener.setSSLEngineConfig(sslEngineConfigurator);
        server.addListener(listener);
    }

    @POST
    @Produces({ MediaType.APPLICATION_XML })
    @Consumes({ MediaType.APPLICATION_XML })
    @Path("foo")
    public Response receivePayload(@Context HttpServletRequest request, MyPayload payload) {
        X509Certificate[] certChain = (X509Certificate[]) request.getAttribute("javax.servlet.request.X509Certificate");
        if (certChain == null || certChain.length == 0){
        LOG.info("X509cert not found");
            return null;
        }
        X509Certificate certificate = certChain[0];
        // get information such as CN from certificate
    }
}
于 2013-07-02T23:28:18.663 に答える