深入研究代码,这是我用来创建 SSLContext 的方法
private static SSLContext createContext(String keystore_path, String truststore_path, String password) throws Exception {
final KeyStore key_store = KeyStore.getInstance("JKS");
final KeyStore trust_store = KeyStore.getInstance("JKS");
final char[] passphrase = password.toCharArray();
key_store.load(new FileInputStream(keystore_path), passphrase);
trust_store.load(new FileInputStream(truststore_path), passphrase);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(key_store, passphrase);
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(trust_store);
SSLContext ssl_ctx = SSLContext.getInstance("TLSv1");
ssl_ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
return ssl_ctx;
}
然后使用生成的 SSLContext 来创建我用来加密网络通信的 SSLEngine 实例。既然这已经解决了,我已经尝试了 3 种不同的方法来创建 SSLContext,但只有一种有效。我想了解其他 2 个失败的原因,以及如何使它们工作(如果可能)。在 SSL 握手期间,两个失败的都失败了。
方法#1(有效)
我的 SSL 握手在使用我自己的信任库和密钥库时起作用,如下所示:
ssl_ctx = createContext(my_keystore_file, my_truststore_filepath, my_password);
方法#2(不起作用)
final String default_store_path = System.getProperties().getProperty("java.home") + File.separator + "lib"
+ File.separator + "security" + File.separator + "cacerts";
final String default_password = "changeit";
ssl_ctx = createContext(default_store_path, default_store_path, default_password);
在这种情况下,我得到以下异常:
Exception in thread "main" javax.net.ssl.SSLHandshakeException: no cipher suites in common
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:131)
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:307)
...
方法#3(不起作用)
ssl_ctx = SSLContext.getDefault();
但是这次我遇到了以下异常:
Exception in thread "main" javax.net.ssl.SSLHandshakeException: No available authentication scheme
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:131)
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:307)
附带说明一下,我对使用 Grizzly 等第三方库不感兴趣。谢谢!