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

尽管将'disableCNCheck'设置为true,https URL主机名仍与通用名(CN)不匹配

戴建义
2023-03-14
问题内容

我设法正确配置了基于CXF的客户端,以便它为运行Web服务的服务器找到正确的SSL证书:

  <http:conduit name="https://myserver/myws/register/soap?wsdl:{http://glob.reg.com/myws}.http-conduit">

    <http:tlsClientParameters>
      <sec:keyManagers keyPassword="changeit">
        <sec:keyStore type="JKS" password="changeit"
                  file="C:\Program Files (x86)\Java\jdk1.6.0_45\jre\lib\security\cacerts"/> 
       </sec:keyManagers>
      <sec:trustManagers>
        <sec:keyStore type="JKS" password="changeit"
                  file="C:\Program Files (x86)\Java\jdk1.6.0_45\jre\lib\security\cacerts"/> 
      </sec:trustManagers>
      <sec:cipherSuitesFilter>
        <!-- these filters ensure that a ciphersuite with
             export-suitable or null encryption is used,
             but exclude anonymous Diffie-Hellman key change as
             this is vulnerable to man-in-the-middle attacks -->
        <sec:include>.*_EXPORT_.*</sec:include>
        <sec:include>.*_EXPORT1024_.*</sec:include>
        <sec:include>.*_WITH_DES_.*</sec:include>
        <sec:include>.*_WITH_AES_.*</sec:include>
        <sec:include>.*_WITH_NULL_.*</sec:include>
        <sec:exclude>.*_DH_anon_.*</sec:exclude>
      </sec:cipherSuitesFilter>
    </http:tlsClientParameters>
    <http:authorization>
      <sec:UserName>Betty</sec:UserName>
      <sec:Password>password</sec:Password>
    </http:authorization>
    <http:client AutoRedirect="true" Connection="Keep-Alive"/>

  </http:conduit>

但是…由于证书用于与我的服务器计算机不同的子域名(映射到相同的IP地址),因此出现以下错误:

Caused by: java.io.IOException: The https URL hostname does not match the Common Name (CN) on the server certificate in the client's truststore.  Make sure serv
er certificate is correct, or to disable this check (NOT recommended for production) set the CXF client TLS configuration property "disableCNCheck" to true.
        at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.onFirstWrite(HTTPConduit.java:1234)
        at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.onFirstWrite(URLConnectionHTTPConduit.java:183)
        at org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutputStream.java:47)
        at org.apache.cxf.io.AbstractThresholdOutputStream.write(AbstractThresholdOutputStream.java:69)
        at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1293)
        ... 18 more

所以… 由于这是一个开发/测试系统,我按照建议的方式进行操作(将CXF客户端TLS配置属性“ disableCNCheck”设置为true):

<http:tlsClientParameters disableCNCheck="true">

另外 ,我在客户端的主类中添加了以下代码(根据该线程中的建议):

  static {
    HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier()
    {
      @Override
      public boolean verify(String hostname, SSLSession session)
      {
        return true;
      }

    });    
  }

但是… 我仍然遇到相同的错误:

Caused by: java.io.IOException: The https URL hostname does not match the Common Name (CN) on the server certificate in the client's truststore.  Make sure serv
er certificate is correct, or to disable this check (NOT recommended for production) set the CXF client TLS configuration property "disableCNCheck" to true.
        at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.onFirstWrite(HTTPConduit.java:1234)
        at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.onFirstWrite(URLConnectionHTTPConduit.java:183)
        at org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutputStream.java:47)
        at org.apache.cxf.io.AbstractThresholdOutputStream.write(AbstractThresholdOutputStream.java:69)
        at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1293)
        ... 18 more

知道为什么吗?

我的意思是,上述变通办法之一应该足以让客户端忽略证书URL不匹配,但是就我而言, 这既无效也不可行

为什么?


问题答案:

我曾在以下几种情况下使用过CXF:

<http:tlsClientParameters disableCNCheck="true">

足以禁用CN检查。

您确定您的客户端正在使用该管道配置吗?我的理解是管道名称模式需要以某种方式匹配端点URI。

尝试按以下方式设置管道名称,以使任何端点都匹配,并查看是否更改了任何内容:

<http:conduit name="*.http-conduit">

2015年1月2日更新

事实证明,http- conduit配置名称匹配具有两种模式格式。一种涉及服务的名称空间和端口名称。另一种受支持的格式是与用于创建客户端的WSDL中指定的URL端点匹配的正则表达式。

引用有关元素的Apache CXFhtml" target="_blank">用户指南http- conduit

该名称包括服务的名称空间,WSDL端口名称(在WSDL的wsdl:service部分中找到)和“ .http-conduit”。它遵循以下模板:

{WSDL Namespace}portName.http-conduit

注意:这是端口名称,而不是服务名称。

..

名称属性的另一个选项是终结点的原始URL的正则表达式(例如,“
http://myserver.example.com:*
”)。该配置在管道创建时匹配,因此名称中可以使用WSDL中使用的地址或JAX-WS Service.create(…)调用中使用的地址。



 类似资料:
  • 在处理上述异常的过程中,发生了另一个异常: 跟踪(最近的调用为last):文件“/home/esadm/env/lib/python3.7/site-packages/ellasticsearch/connection/http_urllib3.py”,第233行,在perform_request方法中,url,body,retries=retry(False),headers=request_h

  • 我被困在如何修复这个SSL错误上—— 我的SSL证书在Chrome上运行良好,但在Safari和Firefox上,如果我去www.domain.com而不是domain.com,就会出现主机名不匹配的错误 我已经使用Certbot为我的domain.com和www.domain.com域设置了SSL证书 当我在nginx上检查以确保证书存在时,我运行< code>sudo certbot - ng

  • 问题内容: 谁能解释一下主机名和规范主机名之间的区别? 我当前正在使用InetAddress类使用IP地址获取主机名。我遇到了这两个API。所以我只是想知道,我应该选择哪一个? 问题答案: 两者之间有一些区别: 将尝试解析FQDN。因此,您将获得 _foo.mycompany.com, 而可能仅返回 _foo 。 将始终进行反向DNS查找,而如果在构造函数中提供了主机名,则将返回存储的主机名。 如

  • 问题内容: 我正在尝试使用带有自签名证书的Node.js 0.8.8创建TLS服务器/客户端设置。 基本的服务器代码如下所示 现在,当我尝试连接到该服务器时,我使用以下代码: 如果我删除线 从客户端代码,Node.js抛出一个错误告诉我。据我了解,这是由于它是一个自签名证书,并且没有其他方信任此证书。 如果我删除 同样,错误也消失了-但等于错误,实际上意味着我的连接未加密。无论如何,使用我可以访问

  • 我就是不能理解这个错误。什么是客户的信任库?[我正确插入了证书]但我不确定它是否有效,因为当我在电脑上安装它时,我发现类似此证书的内容已过期。 堆栈跟踪是: 作者:爪哇。伊奥。IOException:IOException调用https://192.168.238.46:8400/yaghut/soap/soap_tosan:https URL主机名与客户端信任库中服务器证书上的公用名(CN)不匹

  • 您可能已经注意到,&字段都为空。原因是,服务器实际上没有域或主机名。在这种情况下我该怎么办? 我有一个记录指向和记录指向 我可以在中使用作为和吗?因为指向另一个具有另一个IP的VPS,它只负责web托管。