jersey-client 2.22.2 - 如何在 SslConfigurator 上正确设置 SunPKCS11 密钥库?
jersey-client 2.22.2 - How to set SunPKCS11 keystore on SslConfigurator properly?
我一直在尝试让我的 jersey 客户端使用我的 Jersey/Grizzly Rest api 进行 ssl 客户端身份验证。其他客户端与此服务器成功握手,但我使用 Jersey 客户端的 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();
这次我 运行 遇到了很多问题,我找到了实现目标的方法。在您的示例中,我看不到 ClientConfig config
实例的任何使用。这对我有用:
ClientConfig config = new ClientConfig();
config.connectorProvider(new ApacheConnectorProvider());
Client client = ClientBuilder.newBuilder().hostnameVerifier(new MyHostnNameVerifier())
.sslContext(sslContext).withConfig(config).build();
我发现 ApacheConnectorProvider
更适合使用安全层或代理的连接( 是我解决的另一个大问题)。
这段代码确实有效。问题是我的服务器的信任证书不适用于它需要信任的智能卡证书。我将正确的证书添加到服务器上的信任库中,然后它就可以工作了。 ssl 调试消息不是很清楚。
我一直在尝试让我的 jersey 客户端使用我的 Jersey/Grizzly Rest api 进行 ssl 客户端身份验证。其他客户端与此服务器成功握手,但我使用 Jersey 客户端的 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();
这次我 运行 遇到了很多问题,我找到了实现目标的方法。在您的示例中,我看不到 ClientConfig config
实例的任何使用。这对我有用:
ClientConfig config = new ClientConfig();
config.connectorProvider(new ApacheConnectorProvider());
Client client = ClientBuilder.newBuilder().hostnameVerifier(new MyHostnNameVerifier())
.sslContext(sslContext).withConfig(config).build();
我发现 ApacheConnectorProvider
更适合使用安全层或代理的连接( 是我解决的另一个大问题)。
这段代码确实有效。问题是我的服务器的信任证书不适用于它需要信任的智能卡证书。我将正确的证书添加到服务器上的信任库中,然后它就可以工作了。 ssl 调试消息不是很清楚。