web-dev-qa-db-fra.com

le nom d'hôte de l'URL https ne correspond pas au nom commun (CN) malgré la définition de 'disableCNCheck' sur true

J'ai réussi à configurer correctement mon client CXF afin qu'il trouve le certificat SSL correct pour le serveur sur lequel j'exécute un service Web:

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

Mais ... parce que le certificat concerne un nom de sous-domaine différent de celui de la machine de mon serveur (correspond à la même adresse IP), le message d'erreur suivant s'affiche:

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

So ... puisqu'il s'agit d'un système de développement/test, j'ai juste fait comme le message proposé (définissez la propriété de configuration TLS du client CXF "disableCNCheck" sur true):

<http:tlsClientParameters disableCNCheck="true">

Plus , j'ai ajouté le code suivant à la classe principale de mon client (selon la suggestion dans ce fil ):

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

    });    
  }

Mais ... Je reçois toujours la même erreur:

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

Une idée pourquoi?

Je veux dire, une des solutions de contournement ci-dessus aurait dû être suffisante pour permettre au client d'ignorer la non-concordance de l'URL du certificat, mais dans mon cas, ni ne fonctionne ni sa combinaison.

Pourquoi?

9
Withheld

J'ai utilisé CXF dans plusieurs cas où

<http:tlsClientParameters disableCNCheck="true">

était suffisant pour désactiver la vérification CN.

Êtes-vous certain que votre client utilise cette configuration de conduit? D'après ce que je comprends, le modèle de nom de conduit doit correspondre à l'URI du noeud final d'une manière ou d'une autre.

Essayez de définir le nom du conduit comme suit, de sorte que tout noeud final corresponde et voyez si cela change quoi que ce soit:

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

Mise à jour 2 janv. 2015

Il s'avère que la correspondance du nom de configuration http-conduit a deux formats de modèle. L'une concerne l'espace de noms du service et le nom du port. L'autre format pris en charge est une expression régulière correspondant au point de terminaison d'URL spécifié dans WSDL utilisé pour créer le client.

Citations Guide de l'utilisateur Apache CXF concernant l'élément http-conduit:

Le nom comprend l'espace de noms du service, le nom du port WSDL (comme indiqué dans la section wsdl: service du WSDL) et ".http-conduit". Il suit ce modèle:

{WSDL Namespace}portName.http-conduit

Remarque: c'est le nom du PORT, pas le nom du service.

..

Une autre option pour l'attribut name est une expression reg-ex (par exemple, " http://myserver.example.com : *") pour l'URL ORIGINAL du noeud final. La configuration étant adaptée lors de la création du conduit, l'adresse utilisée dans le WSDL ou utilisée pour l'appel JAX-WS Service.create (...) peut être utilisée pour le nom.

8
David J. Liszewski

Mettez -Djsse.enableSNIExtension=false dans votre serveur d'applications VM Options.

2
Aliti

Ajoutez le code ci-dessous pour définir disableCNCheck

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

Utilisez ce code uniquement dans les environnements inférieurs. Dans les environnements supérieurs, ce n'est pas recommandé.

1
Palla