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

如何修复“java.security.cert.CertificateException:No subject alternative names present”错误?

宓诚
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,现在我需要

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

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


问题答案:

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



 类似资料:
  • ProjectAAA.obj:错误LNK2001:未解析的外部符号" public:_ this call X::class event::class event(unsigned int)"(??0类事件@X@@QAE@I@Z) 我已经定义了不知道如何修复这个LINK错误。 欢迎提出任何建议。 谢谢你 更多信息: 1. 现在我已经完全隔离了错误: 1.

  • 问题内容: 向MySQL发出命令时,出现错误#1064“语法错误”。 这是什么意思? 我该如何解决? 问题答案: 错误#1064表示MySQL无法理解您的命令。要解决这个问题: 阅读错误消息。 它 准确地 告诉您MySQL 在命令中哪里 混淆了。 检查您的命令。 如果您使用的编程语言来创建你的命令,使用,或同等学历,以显示 完整的命令 ,所以你可以看到它。 检查手册。 通过对MySQL的什么比较

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

  • 我正在编程一个需要Hibernate技术的项目。我得到了堆栈痕迹,但我不知道如何修复它。有什么需要帮忙的吗? 这是我的堆栈跟踪,我得到了这两个错误: SLF4J:slf4j-api 1.6.x(或更高版本)与此绑定不兼容。SLF4J:您的绑定是1.5.5或更早版本。SLF4J:将绑定升级到1.6.x版本。或2.0.x 导入org.hibernate.hibernateException;导入org

  • 我附上以下错误: 在此文件javaclazzweb-servlet.xml 此处文件StudentController 此处文件类StudentHibernateDaoImpl 在此存档学生

  • 问题内容: 有没有一种方法可以让IDE自动修复Checkstyle错误,而不必手动修复每个错误? 问题答案: 如果您使用的是Eclipse,则可以。但是,您无法解决所有问题。有两种方法: 右键点击Package Explorer或其他中的Java文件,然后选择“应用Checkstyle改正”。 单击问题视图中的错误,然后选择“快速修复”。这样可以解决问题。

  • 错误是这样的 描述资源路径位置类型 在解决构建路径错误之前无法构建项目abc未知Java问题未绑定类路径容器:'JRE System Library[OSGi/最小值-1.2]'in project'abc'abc构建路径构建路径问题 我想当我去那里的时候,它就发生在安装的Jre那里,我没有看到Jre Im还使用Mac os x 10.10.1 yosemite 我怎样才能解决这个问题?