当前位置: 首页 > 知识库问答 >
问题:

如何修复“java.security.cert.CertificateException:不存在主题替代名称”错误?

蒙光华
2023-03-14

我有一个JavaWeb服务客户端,它通过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。安全cert.CertificateException:不存在主题备选名称

为了修复它,我首先运行了opensslsu客户端-showcerts-connectaaa。BBB。CCC。DDD:9443

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)
---

好了,现在我需要

  1. 提取证书的部分。txt介于----开始证书-------结束证书---

这样做正确吗?

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

更新1(23.10.2013 15:37 MSK):在对类似问题的回答中,我阅读了以下内容:

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

“用”到底是什么意思?


共有3个答案

丁嘉庆
2023-03-14

这是一个老问题,但我在从JDK1.8.0_144迁移到JDK1.8.0_191时遇到了同样的问题

我们在更改日志中发现了一个提示:

变更日志

我们添加了以下附加系统属性,这有助于解决此问题:

-Dcom.sun.jndi.ldap.object.disableEndpointIdentification=true
吴城
2023-03-14

我也有同样的问题,用这个代码解决了。我将此代码放在第一次调用Web服务之前。

javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(
  new javax.net.ssl.HostnameVerifier(){

      public boolean verify(String hostname,
             javax.net.ssl.SSLSession sslSession) {
          return hostname.equals("localhost"); // or return true
      }
  });

它很简单,工作正常。

这是原始来源。

叶卓君
2023-03-14

我通过使用此处介绍的方法禁用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仅用于测试目的,所以它是一个足够好的解决方案,但在生产中不这样做。

请注意,您还可以为“一次一个连接”禁用SSL,例如:

 // don't call disableSslVerification but use its internal code:
 HttpURLConnection conn = (HttpURLConnection) url.openConnection();
 if (conn instanceof HttpsURLConnection) {
    HttpsURLConnection httpsConn = (HttpsURLConnection) conn;
    httpsConn.setHostnameVerifier(allHostsValid);
    httpsConn.setSSLSocketFactory(sc.getSocketFactory());
 }
 类似资料:
  • 问题内容: 我有一个Java Web服务客户端,该客户端通过HTTPS使用Web服务。 当我连接到服务URL 要解决此问题,我首先运行: AFAIK,现在我需要 提取的部分certs.txt之间-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----, 对其进行修改,以使证书名称等于AAA.BBB.CCC.DDD和 然后使用导入结果keytool

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

  • 尝试了许多解决办法,但都无济于事 参考:在当前主题中找不到样式“协调器LayoutStyle” 但没有帮助 底部App Bar材质设计 应用程序条:底部材质设计

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

  • 。 不管我怎么努力都解决不了这个问题。我不知道为什么会这样,我真的厌倦了。我是初学者,这个问题让我发疯。我试着改变 -->到false 可能是执行方法上的问题,我不知道。可能是我的SDK版本有问题。我试过迁移到AndroidX,但没有成功。

  • 我正在使用cogs来缩短和组织我的discord机器人。然而,在尝试“事件”cog时,我遇到了一个名称错误,即没有定义changePlaying,尽管它实际上是关于on_ready命令的 我忘了输入discord。ext并因此导入了该文件。B:我已经尝试过在changePlaying事件中更改可能状态列表的位置 嗯,我认为很明显预期的结果是什么,但要澄清机器人应该启动。它确实在线,并听取命令,但状