我有一个Java应用程序通过SSL套接字通过套接字连接到另一个Java应用程序,因此我的客户端JVM已经设置了-Djavax.net.ssl.keyStore
和-Djavax.net.ssl.trustStore
属性。
此应用程序需要向需要客户端身份验证的Web服务器发出一些HTTP请求。我可以使用URLConnection
Java返回一个来打开连接HTTPSURLConnectionImpl
。
我要在请求中提供给Web服务器的客户端证书与设置为我的JVM系统属性的客户端证书不同。有没有一种方法可以设置客户端证书。作为请求属性HTTPSURLConnectionImpl
?
直接通过HTTPSURLConnectionImpl
的请求属性设置SSL“客户证书”是不够的,因为还需要数字签名来证明您拥有证书。SSL已经自动执行所有操作,因此使用该层很有意义。
您有两种方法可以解决您的问题。
您可以将客户端密钥和证书添加到JVM KeyStore中,当服务器要求您进行客户端SSL身份验证时,应在运行时将其提取。(SSL /
TLS是为此目的而设计的:服务器将请求由其可信授权机构签名的客户端证书,即使您的KeyStore拥有很多证书,SSL引擎也可以选择正确的证书)。
您可以SSLContext
使用定制的KeyStore
/ TrustStore
s
滚动自己的文件。这有点复杂(我不会详细介绍如何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地址