javax.net.ssl.sslhandshakeexception:java.security.cert.certificateeexception:没有与ip地址匹配的使用者替代名称

dldeef67  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(352)

我有一个调用外部api的java应用程序,它托管在如下地址https://10.20.30.40:1234/test/myurl
这有一个域名基础证书,其cn类似于*.myappdomain.au
我们已经在linux服务器上注册了证书。我甚至试着用下面的代码加载证书,但它没有用,我们得到相同的错误

private static SSLSocketFactory createSSLSocketFactory(String certificatePath) throws IOException, CertificateException, KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
        File crtFile = new File(certificatePath);

        Certificate certificate = CertificateFactory.getInstance("X.509").generateCertificate(new FileInputStream(crtFile));

        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
        keyStore.load(null, null);
        keyStore.setCertificateEntry("server", certificate);

        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        trustManagerFactory.init(keyStore);

        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, trustManagerFactory.getTrustManagers(), null);

        return sslContext.getSocketFactory();
    }

我尝试过的一件事是在主机中添加条目,比如10.20.30.40 myappdomain.au,然后使用url,比如https://myappdomain.au:1234/test/myurl
然后应用程序工作
你知道我还需要做什么吗

lh80um4z

lh80um4z1#

如果api托管在一个ip地址上,ssl证书必须将该ip地址定义为subject备用名称。但是,这对于像let's encrypt这样的服务不起作用。
我想问题的主要原因是您试图通过其ip地址而不是fqdn访问api。将api的url更改为源代码中ip地址的相应dns名称应该会产生任何效果,只要dns名称解析为与颁发通配符证书的域相关的内容(例如。 api.myappdomain.au ).

fquxozlt

fquxozlt2#

在连接之前尝试运行此代码:

public static void trustAllCerts() {
    TrustManager[] trustAllCerts = new TrustManager[]{
            new X509TrustManager() {
                public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                    return null;
                }
                public void checkClientTrusted(
                    java.security.cert.X509Certificate[] certs, String authType) {
                }
                public void checkServerTrusted(
                    java.security.cert.X509Certificate[] certs, String authType) {
                }
            }
        };

    try {
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    } catch (Exception e) {

        e.printStackTrace();

    }
}

相关问题