当前位置: 首页 > 面试题库 >

如何解决“ java.security.cert.CertificateException:不存在使用者替代名称”错误?

戚翰飞
2023-03-14
问题内容

我有一个Java Web服务客户端,该客户端通过HTTPS使用Web服务。

import javax.xml.ws.Service;

@WebServiceClient(name = "ISomeService", targetNamespace = "http://tempuri.org/", wsdlLocation = "...")
public class ISomeService
    extends Service
{

    public ISomeService() {
        super(__getWsdlLocation(), ISOMESERVICE_QNAME);
    }

当我连接到服务URL(https://AAA.BBB.CCC.DDD:9443/ISomeService)时,出现异常java.security.cert.CertificateException: No subject alternative names present。

要解决此问题,我首先运行openssl s_client -showcerts -connect AAA.BBB.CCC.DDD:9443 > certs.txt并在file中得到以下内容certs.txt

CONNECTED(00000003)
---
Certificate chain
 0 s:/CN=someSubdomain.someorganisation.com
   i:/CN=someSubdomain.someorganisation.com
-----BEGIN CERTIFICATE-----
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-----END CERTIFICATE-----
---
Server certificate
subject=/CN=someSubdomain.someorganisation.com
issuer=/CN=someSubdomain.someorganisation.com
---
No client certificate CA names sent
---
SSL handshake has read 489 bytes and written 236 bytes
---
New, TLSv1/SSLv3, Cipher is RC4-MD5
Server public key is 512 bit
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : RC4-MD5            
    Session-ID: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    Session-ID-ctx:                 
    Master-Key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    Key-Arg   : None
    Start Time: 1382521838
    Timeout   : 300 (sec)
    Verify return code: 21 (unable to verify the first certificate)
---

AFAIK,现在我需要

提取的部分certs.txt之间-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----,
对其进行修改,以使证书名称等于AAA.BBB.CCC.DDD和
然后使用导入结果keytool -importcert -file fileWithModifiedCertificate(fileWithModifiedCertificate操作1和2的结果在哪里)。
它是否正确?

如果是这样,我如何才能使第1步中的证书与基于IP的地址(AAA.BBB.CCC.DDD)一起使用?

更新1( 2013年10月23日15:37 MSK):在回答类似问题时,我阅读以下内容:

如果您不受该服务器的控制,请使用其主机名(前提是在现有证书中至少有一个与该主机名匹配的CN)。

“使用”到底是什么意思?


问题答案:

我通过使用此处介绍的方法禁用HTTPS检查来解决此问题:

我将以下代码放入ISomeService该类中:

static {
    disableSslVerification();
}

private static void disableSslVerification() {
    try
    {
        // Create a trust manager that does not validate certificate chains
        TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return null;
            }
            public void checkClientTrusted(X509Certificate[] certs, String authType) {
            }
            public void checkServerTrusted(X509Certificate[] certs, String authType) {
            }
        }
        };

        // Install the all-trusting trust manager
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

        // Create all-trusting host name verifier
        HostnameVerifier allHostsValid = new HostnameVerifier() {
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        };

        // Install the all-trusting host verifier
        HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (KeyManagementException e) {
        e.printStackTrace();
    }
}

由于我https://AAA.BBB.CCC.DDD:9443/ISomeService仅将用作测试目的,因此这是一个足够好的解决方案。



 类似资料:
  • 我有一个JavaWeb服务客户端,它通过HTTPS使用web服务。 当我连接到服务URL(),我得到了异常。 为了修复它,我首先运行了

  • 问题内容: 我用soket.io安装了nodejs。想要将此代码测试到服务器节点server.js 和client.js 但是当我执行node server.js提示时出现此错误 node_modules \ socket.io-parser \ node_modules \ component-emitter \ index.js:134:20) les \ socket.io-parser \

  • 问题内容: 我正在使用version 。在此工具中,我发布了示例项目(即),并订阅了该项目以获取使用者密钥和机密。该工具还为我提供了可以正常运行的CURL命令。 下面的CURL命令运行正常。 现在我正在努力开发的利用代码将连接到无,即,方式看一下上面的curl命令。到目前为止,我已经开发了以下代码,但是运行时,我看到以下错误。 我面临的错误。 请建议我们如何以不安全的方式连接到SSL站点,就像cu

  • 我写电子邮件类: 但我只得到了这个错误,我不理解这个错误。这意味着什么以及如何解决 错误:错误:在TCPConnectW连接ECONNREFUSED3.209.246.195:2525rap.after连接[作为完成](net.js:1146: 16){errno:-4078,代码:“ESOCKET”,系统调用:“连接”,地址:“3.209.246.195”,端口:2525,命令:“CONN”}

  • 有人能帮我解决这个问题吗?

  • 我已经通过终端在远程ubuntu机器中逐一使用以下命令生成了一个SSL自签名证书: T我已经将添加到本地计算机的cacerts中,使用命令提示符中的keytool作为admin。还将添加到“受信任的根证书颁发机构”中。他发出对Postman上的远程ubuntu机器服务器的HTTPS请求可以正常工作,但在IntelliJ上就不行了,我可以放心地得到: