我正在尝试实现可与我的C ++ SSL服务器一起使用的Java SSL客户端。我知道SSL服务器正常工作,因为我已经使用CURL SSL客户端对其进行了测试。
我尝试与Java客户端连接时遇到的问题是它似乎没有发送客户端证书,因此服务器抛出一个错误,说它没有收到客户证书。
我似乎正在加载客户端证书和密钥,所以我很困惑为什么服务器没有收到任何证书。
非常感谢有人查看我的Java客户端代码并查看是否有任何事情发生在您身上。
KeyStore keyStore = KeyStore.getInstance("JKS");
InputStream stream = null;
stream = new FileInputStream("C:\\certs\\client.keystore");
keyStore.load(stream, "changeit".toCharArray());
System.out.println("loaded the keystore");
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
PrivateKey key = (PrivateKey) keyStore.getKey("client-identity", "changeit".toCharArray());
System.out.println("private key: " + key);
Certificate cert = (Certificate) keyStore.getCertificate("client-identity");
System.out.println("client cert: " + cert);
kmf.init(keyStore, "changeit".toCharArray());
SSLContext sslCtx = SSLContext.getInstance("TLS");
sslCtx.init(kmf.getKeyManagers(), null, null);
SSLSocketFactory sslSF = (SSLSocketFactory) sslCtx.getSocketFactory();
System.out.println(" Creating and opening new SSLSocket with SSLSocketFactory");
// using createSocket(String hostname, int port)
SSLSocket sslSock = (SSLSocket) sslSF.createSocket("localhost", 1111);
System.out.println(" SSLSocket created");
HandshakeCompletedListener mListener = null;
mListener = new MyListener();
sslSock.addHandshakeCompletedListener(new MyListener());
更新
这可能是个问题。
C:\movrm-contract\https-client>keytool -list -keystore client.keystore -v
keytool error: java.lang.Exception: Keystore file does not exist: client.keystore
java.lang.Exception: Keystore file does not exist: client.keystore
at sun.security.tools.KeyTool.doCommands(KeyTool.java:565)
at sun.security.tools.KeyTool.run(KeyTool.java:171)
at sun.security.tools.KeyTool.main(KeyTool.java:165)
但我不确定如何解决这个问题。我从client.pem和privkey.pem文件创建了JSK文件。将它们导入Java密钥库的正确方法是什么?并且,签名CA证书是否需要位于同一个密钥库中?