我尝试使用Java建立到Web服务的双向TSL连接,我已经给出了带有私钥和3个证书的证书链的pfx证书。下面是使用Java代码Spring框架:握手失败客户端密钥交换,使用证书链
@Bean
public Client weatherClient(Jaxb2Marshaller marshaller) throws Exception {
Client client = new Client();
client.setDefaultUri(".....");
client.setMarshaller(marshaller);
client.setUnmarshaller(marshaller);
KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(keyStore.getInputStream(), keyStorePassword.toCharArray());
LOGGER.info("Loaded keystore: " + keyStore.getURI().toString());
System.out.println("Loaded keystore: " + keyStore.getURI().toString());
keyStore.getInputStream().close();
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());//KeyManagerFactory.getDefaultAlgorithm()
keyManagerFactory.init(ks, keyStorePassword.toCharArray());
KeyStore ts = KeyStore.getInstance("PKCS12");
ts.load(trustStore.getInputStream(), trustStorePassword.toCharArray());//
LOGGER.info("Loaded trustStore: " + trustStore.getURI().toString());
System.out.println("Loaded trustStore: " + trustStore.getURI().toString());
trustStore.getInputStream().close();
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(ts);
HttpsUrlConnectionMessageSender messageSender = new HttpsUrlConnectionMessageSender();
messageSender.setKeyManagers(keyManagerFactory.getKeyManagers());
messageSender.setTrustManagers(trustManagerFactory.getTrustManagers());
client.setMessageSender(messageSender);
return client;
}
到目前为止,我得到一个客户问候,并和发送的证书的服务器问候,我也得到一个找到的受信任的证书。然后有一个证书请求没有找到任何证书
*** CertificateRequest
Cert Types: RSA, DSS
Cert Authorities:
<CN=Thawte SSL CA, O="Thawte, Inc.", C=US>
....
....
*** ServerHelloDone
Warning: no suitable certificate found - continuing without client authentication
*** Certificate chain
<Empty>
***
我已经将证书单独添加到lib/security/cacerts。 看来,第一个证书交换发生在cacerts密钥库中,因为如果这是证书添加的唯一地方,我会得到相同的行为。看起来,请求正在寻找证书链,但无法找到它,即使我已经用私钥和证书链作为pkcs12导入到KeyStore对象中。任何帮助,将不胜感激
UPDATE
我得到一个握手失败后ClientKeyExchange我认为这是由于上述警告,但我可能是错了。
*** ClientKeyExchange, RSA PreMasterSecret, TLSv1
main, WRITE: TLSv1 Handshake, length = 269
SESSION KEYGEN:
PreMaster Secret:
....
....
0000: B0 E2 38 5E 40 4E 7C C5 ..8^@N..
Server write IV:
0000: 44 40 45 E1 82 45 15 9B [email protected]
main, WRITE: TLSv1 Change Cipher Spec, length = 1
*** Finished
verify_data: { 109, 220, 225, 98, 98, 233, 48, 215, 61, 50, 58, 207 }
***
main, WRITE: TLSv1 Handshake, length = 40
main, READ: TLSv1 Alert, length = 2
main, RECV TLSv1 ALERT: fatal, handshake_failure
%% Invalidated: [Session-1, SSL_RSA_WITH_3DES_EDE_CBC_SHA]
UPDATE
相互认证工作,如果我添加了密钥库作为一个变量-Djavax.net.ssl.keyStore=
但增加了密钥存储作为一个变量,我得到以下。在代码中指定的密钥存储区和信任存储被发现和证书链和信任存储在接着一个空的密钥库中示出和JVM cacerts中被用作可信证书调试
***
found key for : devcert
chain [0] = [
[
Version: V3 ......
***
adding as trusted cert:
Subject:
被示出。
keyStore is :
keyStore type is : jks
keyStore provider is :
init keystore
init keymanager of type SunX509
trustStore is: /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts
trustStore type is : jks
trustStore provider is :
init truststore
adding as trusted cert:
Subject: CN=ubuntu
然后有一个服务器问候 ***服务器问候,使用TLSv1 这对于其证书被发现
***
Found trusted certificate:
but the Certificate Request does find a matching certificate as above, unless it is added as a variable
*** CertificateRequest
Cert Types: RSA, DSS
Cert Authorities:
<CN=Thawte SSL CA, O="Thawte, Inc.", C=US>
....
....
*** ServerHelloDone
Warning: no suitable certificate found - continuing without client authentication
*** Certificate chain
<Empty>
***
行为与密钥库添加为varible -Djavax.net.ssl.keyStore=
*** ServerHelloDone
matching alias: devcert
*** Certificate chain
chain [0] = [
[
Version: V3
我想从程序代码中使用密钥库和信任库,因为希望能够看到动态更改它后面
重新编辑,你将不得不看看服务器的SSL日志,看看那里出了什么问题。如果客户端发送了“证书”消息,则客户端证书已经起作用。 – EJP
感谢您知道,我没有访问服务器,但我猜测客户端密钥交换后的一些数据交换导致错误。也许将错误的数据传递到服务器 –