我有一个调用外部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
然后应用程序工作
你知道我还需要做什么吗
2条答案
按热度按时间lh80um4z1#
如果api托管在一个ip地址上,ssl证书必须将该ip地址定义为subject备用名称。但是,这对于像let's encrypt这样的服务不起作用。
我想问题的主要原因是您试图通过其ip地址而不是fqdn访问api。将api的url更改为源代码中ip地址的相应dns名称应该会产生任何效果,只要dns名称解析为与颁发通配符证书的域相关的内容(例如。
api.myappdomain.au
).fquxozlt2#
在连接之前尝试运行此代码: