Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java HTTP连接中将客户端证书设置为请求属性?_Java_Url_Https_Certificate - Fatal编程技术网

在Java HTTP连接中将客户端证书设置为请求属性?

在Java HTTP连接中将客户端证书设置为请求属性?,java,url,https,certificate,Java,Url,Https,Certificate,我有一个Java应用程序,它通过带有SSL的套接字连接到另一个Java应用程序,因此我的客户机JVM已经设置了-Djavax.net.SSL.keyStore和-Djavax.net.SSL.trustStore属性 此应用程序需要向需要客户端身份验证的web服务器发出一些HTTP请求。我可以使用Java中的URLConnection打开连接,该连接返回HTTPSURLConnectionImpl 我希望在请求中向web服务器提供的客户端证书与设置为我的JVM系统属性的证书不同。有没有办法将客户

我有一个Java应用程序,它通过带有SSL的套接字连接到另一个Java应用程序,因此我的客户机JVM已经设置了
-Djavax.net.SSL.keyStore
-Djavax.net.SSL.trustStore
属性

此应用程序需要向需要客户端身份验证的web服务器发出一些HTTP请求。我可以使用Java中的
URLConnection
打开连接,该连接返回
HTTPSURLConnectionImpl

我希望在请求中向web服务器提供的客户端证书与设置为我的JVM系统属性的证书不同。有没有办法将客户端证书设置为
HTTPSURLConnectionImpl
中的请求属性?

直接通过
HTTPSURLConnectionImpl
的请求属性设置SSL“客户端证书”是不够的,因为还需要数字签名来证明您拥有证书。SSL已经自动完成了所有这些,因此使用该层是有意义的

你有两种方法来解决未来的问题

通过配置 您可以将客户端密钥和证书添加到JVM密钥库中,当服务器请求您的客户端SSL身份验证时,应该在运行时获取该密钥和证书。(SSL/TLS就是为此而设计的:服务器将请求由其受信任的机构签署的客户端证书,这允许SSL引擎选择正确的证书,即使您的密钥库中有许多证书)

通过代码 您可以使用定制的
KeyStore
/
TrustStore
滚动您自己的
SSLContext
。 这有点复杂(我不会详细说明如何在Java中构建
Keystore
实例),但其要点如下:

public static void main(String[] args) throws Exception {

KeyStore clientKeyStore = ... // Whatever
KeyStore clientTrustStore = ... // Whatever you need to load

// We build the KeyManager (SSL client credentials we can send)
KeyManagerFactory keyFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyFactory.init(clientKeyStore, "password".toCharArray());
KeyManager[] km = keyFactory.getKeyManagers();

// We build the TrustManager (Server certificates we trust)
TrustManagerFactory trustFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustFactory.init(clientTrustStore);
TrustManager[] tm = trustFactory.getTrustManagers();

// We build a SSLContext with both our trust/key managers
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(km, tm, null);
SSLSocketFactory sslSf = sslContext.getSocketFactory();

// We prepare a URLConnection 
URL url = new URL("https://www.google.com");
URLConnection urlConnection = url.openConnection();
// Before actually opening the sockets, we affect the SSLSocketFactory
HttpsURLConnection httpsUrlConnection = (HttpsURLConnection) urlConnection;
httpsUrlConnection.setSSLSocketFactory(sslSf);

// Ready to go !
}

在HTTP头中发送它是不够的。它不能确定你的身份。您必须通过SSL机制发送它,以便执行与之相关的其他SSL步骤,以便提供安全身份验证。这是可能的,但不充分,而且客户端证书不是密钥,否则答案很好。谢谢。滚动我自己的SSLContext对我来说是正确的方法,并且允许一些灵活性。您能发布并共享您的最终解决方案吗?