jersey-client 2.22.2 - 如何在 SslConfigurator 上正确设置 SunPKCS11 密



我一直在尝试让我的球衣客户端使用我的泽西/灰熊休息 API 进行 ssl 客户端身份验证。 其他客户端使用此服务器成功握手,但我在使用泽西客户端的 Java 客户端时遇到问题。 当我运行下面的代码时,密钥库已成功加载,当调用 SslConfigurator 的 createSSLContext() 时,ssl 调试输出显示正确访问此密钥库并找到我的私钥。

但是,当使用客户机的 WebTarget 时,SSL 调试输出显示握手发生在缺省密钥库 JKS 上。 为什么 ClientBuilder 不使用 SSLContext 中的此密钥库?

File tmpConfigFile = File.createTempFile("pkcs11-", "conf");
        tmpConfigFile.deleteOnExit();
        PrintWriter configWriter = new PrintWriter(new FileOutputStream(tmpConfigFile), true);
        configWriter.println("name=ActiveClient");
        configWriter.println("library="C:\\Program Files\\ActivIdentity\\ActivClient\\acpkcs211.dll"");
        configWriter.println("slotListIndex=0");
        SunPKCS11 provider = new SunPKCS11(tmpConfigFile.getAbsolutePath());
        Security.addProvider(provider);
        //  KeyStore keyStore = KeyStore.getInstance("PKCS11", provider);
        KeyStore keyStore = KeyStore.getInstance("PKCS11");
        keyStore.load(null, null);
        ClientConfig config = new ClientConfig();
        SslConfigurator sslConfig = SslConfigurator.newInstance()
                .keyStore(keyStore)
                .keyStorePassword("mypin")
                .keyStoreType("PKCS11")
                .trustStoreFile(TRUSTORE_CLIENT_FILE)
                .trustStorePassword(TRUSTSTORE_CLIENT_PWD)
                .securityProtocol("TLS");

        final SSLContext sslContext = sslConfig.createSSLContext();
        Client client = ClientBuilder
                .newBuilder().hostnameVerifier(new MyHostnNameVerifier())
                .sslContext(sslContext)
                .build();
        WebTarget target = client.target("https://localhost:8443/appname/resources/employees?qparam=something");  
     Response res = target.request().accept(MediaType.APPLICATION_JSON).get();

这段代码确实有效。 问题是我的服务器的信任证书不可用于它需要信任的智能卡证书。 我将正确的证书添加到服务器上的信任库中,然后它就可以工作了。 ssl 调试消息不是很清楚。

这次我遇到了很多问题,我找到了实现目标的方法。在您的示例中,我看不到ClientConfig config实例的任何用途。这对我有用:

    ClientConfig config = new ClientConfig();
    config.connectorProvider(new ApacheConnectorProvider());
    Client client = ClientBuilder.newBuilder().hostnameVerifier(new MyHostnNameVerifier())
            .sslContext(sslContext).withConfig(config).build();

我发现ApacheConnectorProvider更适合使用安全层或代理的连接(女巫是我解决的另一个大问题)。

最新更新