使用PKCS12证书的java客户端握手
我使用以下握手代码连接到dc bidden服务器使用PKCS12证书的java客户端握手,java,ssl,handshaking,Java,Ssl,Handshaking,我使用以下握手代码连接到dc bidden服务器 System.setProperty("javax.net.ssl.keyStore",".p12 file path"); System.setProperty("javax.net.ssl.keyStorePassword",keystorePassword); System.setProperty("javax.net.ssl.keyStoreType",""pkcs12""); 我可以用此代码连接到第一台服务器,但下一台服务器除外 to
System.setProperty("javax.net.ssl.keyStore",".p12 file path");
System.setProperty("javax.net.ssl.keyStorePassword",keystorePassword);
System.setProperty("javax.net.ssl.keyStoreType",""pkcs12"");
我可以用此代码连接到第一台服务器,但下一台服务器除外
tomcat忽略最近的属性集,因此我无法连接到具有相同类型dc bidden服务器的下一个服务器
如果“连接https URL”是指
java.net.URL
类和类似new java.net.URL(“https://something“”.openConnection()
返回javax.net.HttpsURLConnection的实现(子类)
以下是我引用的两个示例:
static void SO49993912ExampleClientPKCS12 (String[] args) throws Exception {
FileInputStream fis = new FileInputStream (args[0]);
KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load (fis, args[1].toCharArray()); fis.close();
KeyManagerFactory kf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kf.init (ks, args[1].toCharArray());
SSLContext ctx = SSLContext.getInstance ("TLS");
ctx.init (kf.getKeyManagers(), null /*default TM(s)*/, null);
// method 1
HttpsURLConnection conn1 = (HttpsURLConnection) new URL (args[2]).openConnection();
conn1.setSSLSocketFactory(ctx.getSocketFactory());
conn1.connect(); System.out.println (conn1.getResponseCode()); conn1.disconnect();
// method 2
HttpsURLConnection.setDefaultSSLSocketFactory(ctx.getSocketFactory());
HttpsURLConnection conn2 = (HttpsURLConnection) new URL (args[2]).openConnection();
conn1.connect(); System.out.println (conn2.getResponseCode()); conn2.disconnect();
}
然而,在Java中有很多其他连接https(和其他)URL的方式;如果您实际上是指其他内容,那么您必须更具体。我不知道“dc bidden”是什么意思,但是这些sysprops只在第一个TLS默认连接上读取一次——更确切地说是对
SSLContextImpl.getDefaultKeyManager的第一次调用——并在进程的生命周期内缓存。在那之后改变它们没有效果。如果您希望不同的连接使用不同的密钥库,则需要使用显式的SSLContext
和KeyManager
(尽管您仍然可以在适当的情况下默认使用TrustManager).dc bidden意味着需要使用ssl握手访问站点。我们有数字证书和密码,需要在连接时实现。您有示例说明如何连接这些类型的服务器吗?这取决于您进行连接的方式。对于原始SSLSocket
,通过KeyManagerFactory
从正确的密钥库中创建SSLContext
和init
,然后获取并使用其SSLSocketFactory
。对于[Https]URLConnection
(以及它上面的层)类似地创建SSLSocketFactory
,并将其设置为每个连接对象或作为URL.openConnection
之前的默认值。对于ApacheHttpClient
有几种方法,有些方法取决于版本。对于其他事情,这通常取决于这些事情。我们正在连接https URL。你有没有任何例子,你做的参考,这将是很大的帮助