web-dev-qa-db-ja.com

'disableCNCheck'をtrueに設定しているにもかかわらず、https URLホスト名が共通名(CN)と一致しない

Webサービスを実行しているサーバーの正しいSSL証明書が見つかるように、CXFベースのクライアントを適切に構成できました。

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

Plus、次のコードをクライアントのメインクラスに追加しました(提案に従って このスレッドで ):

  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

理由は何ですか?

つまり、上記の回避策の1つは、クライアントが証明書のURLの不一致を無視できるようにするのに十分なはずですが、私の場合、は機能せず、その組み合わせもありません

どうして?

9
Withheld

私はいくつかの例でCXFを使用しました

<http:tlsClientParameters disableCNCheck="true">

cNチェックを無効にするには十分でした。

クライアントがそのコンジット構成を使用していることを確認しますか?私の理解では、コンジット名のパターンは何らかの方法でエンドポイントURIと一致する必要があります。

エンドポイントが一致するようにコンジット名を次のように設定してみて、それによって何かが変わるかどうかを確認してください。

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

2015年1月2日更新

http-conduit構成名のマッチングには2つのパターン形式があることがわかりました。 1つは、サービスの名前空間とポート名です。サポートされている他の形式は、クライアントの作成に使用されるWSDLで指定されたURLエンドポイントと照合される正規表現です。

引用 Apache CXFユーザーガイドhttp-conduit要素に関して:

この名前には、サービスの名前空間、WSDLポート名(WSDLのwsdl:serviceセクションにあります)、および「.http-conduit」が含まれます。これは次のテンプレートに従います。

{WSDL Namespace}portName.http-conduit

注:これはPORT名であり、サービス名ではありません。

..

Name属性の別のオプションは、エンドポイントの元のURLの正規表現式(例: " http://myserver.example.com :*")です。構成はコンジットの作成時に照合されるため、WSDLで使用されるアドレス、またはJAX-WS Service.create(...)呼び出しに使用されるアドレスを名前に使用できます。

8

プット-Djsse.enableSNIExtension=falseアプリサーバーでVMオプション。

2
Aliti

以下のコードを追加して、disableCNCheckを設定します

 HTTPConduit httpConduit=(HTTPConduit)ClientProxy.getClient(port).getConduit();
        TLSClientParameters tlsCP = new TLSClientParameters();
        tlsCP.setDisableCNCheck(true);
        httpConduit.setTlsClientParameters(tlsCP);

このコードは、低環境でのみ使用してください。高環境では、お勧めしません。

1
Palla