当前位置: 首页 > 面试题库 >

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

胡景焕
2023-03-14
问题内容

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

此应用程序需要向需要客户端身份验证的Web服务器发出一些HTTP请求。我可以使用URLConnectionJava返回一个来打开连接HTTPSURLConnectionImpl

我要在请求中提供给Web服务器的客户端证书与设置为我的JVM系统属性的客户端证书不同。有没有一种方法可以设置客户端证书。作为请求属性HTTPSURLConnectionImpl


问题答案:

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

您有两种方法可以解决您的问题。

通过配置

您可以将客户端密钥和证书添加到JVM KeyStore中,当服务器要求您进行客户端SSL身份验证时,应在运行时将其提取。(SSL /
TLS是为此目的而设计的:服务器将请求由其可信授权机构签名的客户端证书,即使您的KeyStore拥有很多证书,SSL引擎也可以选择正确的证书)。

通过代码

您可以SSLContext使用定制的KeyStore/ TrustStores
滚动自己的文件。这有点复杂(我不会详细介绍如何Keystore在Java中构建实例),但是要点在这里:

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 !
}


 类似资料:
  • 我正在尝试访问具有客户端证书的url,并使用以下内容生成密钥: 和密钥存储: 并尝试连接: }

  • 我正在编写一个rest客户机,它使用服务器的POST restful sevice。现在服务需要2个参数作为'form-data'中请求的一部分。 如果您有跨邮递员rest客户机,我们有一个选项来设置表单数据,并给出键值对参数。 现在,如何发送两个参数,即“文件名”,“文件版本”和它们的值作为表单数据的一部分?

  • 客户端的HTTP/HTTPS请求。 进程:主进程​ ClientRequest是由EventEmitter来实现Writable Stream​ new ClientRequest(options) 作用:发起新的HTTP/HTTPS请求 options(Object | String) - options是String时即请求URL。 options 是Object时则按以下属性请求: meth

  • 我在外设模式下使用Nexus 9。我创建了一个GATT服务器实例: 我创建了一个BluetoothGattService BluetoothGattServerCallBack的实例: 现在,当我尝试将GATT客户端连接到此服务器时,BluetoothGattServerCallback的onConnectionStateChange()方法从未被调用。 来自客户端应用程序的代码: 连接到运行在N

  • 我对客户端如何连接到其struct sockaddr_in设置为ADDRESS.sin_addr的服务器感到非常困惑。s_addr=htonl(INADDR_ANY); 绑定调用后,服务器监听套接字将被设置为INADDR_ANY,客户端将如何连接到设置为INADDR_ANY的套接字? 在connect()系统调用之前,客户端将传递到sockaddr_instruct的地址是什么?是服务器的ip地址