2016-10-11 3 views
1

Je n'arrive pas à envoyer une simple demande SOAP et à obtenir une réponse dans mon projet java.Problème de connexion au service SOAP via Java et IntelliJ

Je suis encore assez nouveau pour faire cela via Java donc j'ai regardé tutoriel this depuis que j'utilise également spring-boot dans le reste de mon projet.

Actuellement, je reçois cette erreur (j'ai dû supprimer des détails liés à la société et remplacer par des chaînes génériques pour les coller ici.J'ai dû supprimer mon wsdl réel et le nom d'hôte réel):

[INFO] --- maven-jaxb2-plugin:0.12.3:generate (default) @ dcc-vm-validation --- 
[INFO] Up-to-date check for source resources [[myWsdl, file:pom.xml]] and taret resources [[]]. 
[WARNING] The URI [myWsdl] seems to represent an absolute HTTP or HTTPS URL. Getting the last modification timestamp is only possible if the URL is accessible and if the server returns the [Last-Modified] header correctly. This method is not reliable and is likely to fail. In this case the last modification timestamp will be assumed to be unknown. 
[ERROR] Could not retrieve the last modification timestamp for the URI [myWsdl] from the HTTP URL connection. The [Last-Modified] header was probably not set correctly. 
[WARNING] Last modification of the URI [myWsdl] is not known. 
[INFO] Sources are not up-to-date, XJC will be executed. 
[ERROR] Error while parsing schema(s).Location []. 
com.sun.istack.SAXParseException2; IOException thrown when processing "myWsdl". Exception: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No name matching hostname found. 

Voici ma section « construction » de mon pom:

<build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 

      <plugin> 
       <groupId>org.jvnet.jaxb2.maven2</groupId> 
       <artifactId>maven-jaxb2-plugin</artifactId> 
       <version>0.12.3</version> 

       <executions> 
        <execution> 
         <goals> 
          <goal>generate</goal> 
         </goals> 
        </execution> 
       </executions> 

       <configuration> 
        <schemaLanguage>WSDL</schemaLanguage> 
        <generatePackage>package.wsdl</generatePackage> 

        <schemas> 
         <schema> 
          <url>myWsdl</url> 
         </schema> 
        </schemas> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

Après avoir fait des recherches sur ce que cette erreur spécifique signifie que je suis en mesure de télécharger le certificat auto-signé de l'emplacement wsdl (via Chrome) sur mon bureau. J'ai ensuite utilisé keytool pour ajouter ce cert spécifique à mon fichier cacerts (je me suis assuré que l'alias cert correspondait au nom d'hôte dans l'erreur ci-dessus). D'après ce qu'on m'a dit, cela réglerait mes problèmes de connexion, mais ce n'est pas le cas. Je vois toujours la même erreur que ci-dessus en disant qu'il ne peut pas trouver mon nom d'hôte.

Qu'est-ce qui me manque ici?

Alternativement, j'ai également lu au sujet de bypassing certs tout à fait. C'est aussi une approche à laquelle je ne m'opposerais pas car ce projet sur lequel je travaille est UNIQUEMENT interne et sera situé sur l'intranet de l'entreprise. Il ne sera accessible à personne d'autre que les employés, de sorte que les risques de sécurité peuvent essentiellement être ignorés. Je sais que cela est considéré comme une mauvaise pratique, mais j'ai déjà lu les risques et discuté avec mon patron et il ira bien si nous suivons cette voie aussi.

j'ai pu trouver ce petit bout de code qui semble faire le travail:

static { 
      javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(new javax.net.ssl.HostnameVerifier() { 
       public boolean verify(String hostname, javax.net.ssl.SSLSession session) { 
        if (hostname.equals(myHostname)) { 
         return true; 
        } 

        return false; 
       } 
      }); 
     } 

mais dans tous les exemples que je trouve qu'il n'a jamais précisé où le mettre. Il vient de dire que c'est ce dont vous avez besoin pour ignorer les erreurs SSL et auto-signées. Où pourrais-je mettre cela en corrélation avec mon code et existe-t-il un moyen spécifique de le faire puisque j'essaie de le faire via spring/jaxb?

Nous sommes désolés pour le mur à longues parois! Juste essayer d'apprendre quelque chose de nouveau ici :)

+0

Etes-vous capable de faire une demande de réponse d'un client différent, par exemple POSTMAN ou SOAPUI ou Boomerang? –

+0

Oui. Je suis en mesure d'envoyer une demande et obtenir une réponse valide à la fois avec SoapUI et Postman. J'ai essayé de refléter les en-têtes correctement dans le code java car il y a une autorisation de base qui arrive aussi bien mais je ne suis pas sûr que je suis encore en train de frapper cette partie quand je reçois cette erreur. – user1818298

+0

Vous avez raison, vous n'obtenez pas autant d'authentification de base (ou autre authentification HTTP). L'alias dans le fichier de clés certifiées n'a pas d'importance; ce qui compte est le nom d'hôte dans l'URL (que vous avez expurgée) et le nom d'hôte dans le cert. Vous avez déjà fait une copie locale du cert; regardez-le avec 'keytool -printcert' et utilisez soit le CN propriétaire (CommonName), soit l'un des noms (ou éventuellement des adresses) de SubjectAlternativeName si présent. Ne changez PAS le nom de domaine en adresse ou vice versa; dans de nombreux contextes réseau, ils sont équivalents mais pas pour HTTPS. –

Répondre

0

Je ne recommande généralement pas la compilation d'URL absolues. Cela rend les constructions instables et introduit des problèmes comme celui que vous souffrez.

Une meilleure solution consiste à télécharger et stocker les ressources connexes localement dans le projet et à utiliser catalog files pour réécrire les URL.

Je suppose une URL absolue comme http://www.my.org/wsdl/my.wsdl. Téléchargez les ressources de http://www.my.org et stockez-les sous src/main/resource/www.my.org.

Puis écrire un fichier src/main/resources/catalog.cat comme:

REWRITE_SYSTEM "http://www.my.org" "www.my.org" 

Configurer dans le plug-in:

<configuration> 
    <catalog>src/main/resources/catalog.cat</catalog> 
    <schemaLanguage>WSDL</schemaLanguage> 
    <schemas> 
     <schema> 
      <url>http://www.my.org/wsdl/my.wsdl</url> 
     </schema> 
    </schemas> 
</configuration> 

XJC va réécrire l'URL de votre http://www.my.org/wsdl/my.wsdl comme src/main/resources/www.my.org/wsdl/my.wsdl.

Il ya quelques mises en garde à cela, comme vous ne serez pas en mesure de mélanger les URL relatives et absolues, mais à la fin c'est beaucoup plus stable que de compter sur une ressource externe dans la construction. Vous voulez vraiment que les constructions soient stables et reproductibles. Pensez à ce qui se passe si quelqu'un va mettre à jour my.wsdl sur le serveur. Je suis l'auteur de la maven-jaxb2-plugin.