Java 可信 SSL 证书管理

Man*_*iz 6 java macos ssl ssl-certificate java-web-start

我是 Java Web Start 的新手,目前我正在为专用服务器开发的小程序上遇到一些奇怪的行为。

我正在尝试在下载之前动态检查是否忽略服务器的 SSL 证书。为此,我正在使用

public class TrustModifier {
    private static SSLSocketFactory factory;
    private static final HostnameVerifier TRUSTING_HOSTNAME_VERIFIER = new HostnameVerifier() {
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    };

    public TrustModifier() {
    }

    public static void relaxHostChecking(URLConnection conn) {
        if (conn instanceof HttpsURLConnection) {
            try {
                HttpsURLConnection httpsConnection = (HttpsURLConnection)conn;
                httpsConnection.setSSLSocketFactory(getFactory());
                httpsConnection.setHostnameVerifier(TRUSTING_HOSTNAME_VERIFIER);
            } catch (Exception var2) {
            }
        }

    }

    private static synchronized SSLSocketFactory getFactory() throws Exception {
        if (factory == null) {
            SSLContext ctx = SSLContext.getInstance("TLS");
            ctx.init((KeyManager[])null, new X509TrustManager[]{new X509TrustManager() {
                public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
                }

                public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
                }

                public X509Certificate[] getAcceptedIssuers() {
                    return null;
                }
            }}, (SecureRandom)null);
            factory = ctx.getSocketFactory();
        }

        return factory;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我试图忽略证书时小程序工作正常,但是当我不想忽略它们时,即使服务器具有不受信任的(自签名)证书,下载仍然发生。

做了一些研究,我发现 Java 有可能将其受信任的证书与 MacOS 的受信任证书绑定,但无法验证这一点。我的 Mac 设置为Always trust我服务器的证书。有谁知道 Java 可信证书在 MacOS 中是如何准确处理的,这是否可能是即使服务器使用自签名证书仍会发生下载的原因?