0

深入研究代码,这是我用来创建 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 等第三方库不感兴趣。谢谢!

4

0 回答 0