2017-08-17 6 views
1

Je suis aux prises avec ce qui me semble fondamental mais je n'arrive pas à le contourner. J'ai une application de démarrage de printemps qui devrait exposer une URL de repos.Appelez WS avec Feign Client et certificat

Je le fais comme:

@RestController 
@RequestMapping(value = "/api") 
public class MdmhController { 

    @Resource 
    private MdmhClient mdmhClient; 


    @RequestMapping(
      method = RequestMethod.GET, 
      value = "/myEntityNames", 
      produces = { MediaType.APPLICATION_JSON_UTF8_VALUE } 
    ) 
    ResponseEntity<Iterable<String>> getMyEntityNames() { 

     MyEntity[] myEntities = 
       mdmhClient.getMyentitis(); 

     Set<String> myEntityNames= new HashSet<>(); 
     for (MyEntity me : myEntities) { 
      myEntityNames.add(me.getName()); 
     } 
     return new ResponseEntity<Iterable<String>>(myEntityNames, HttpStatus.OK); 
    } 
} 

Comme vous pouvez le voir consomme un autre service que je suis en train de mettre en œuvre avec un client feindre:

@Import(FeignClientsConfiguration.class) 
@Component 
public class MdmhClientImpl implements MdmhClient { 

    private final Decoder decoder; 
    private final Encoder encoder; 

    private MdmhClient mdmhClient; 

    @Value("${mdmh.serviceId}") // injected by sprins yaml e.g. url-to-service.com 
    private String mdmhServiceId; 

    @Autowired 
    public MdmhClientImpl(
      final Decoder decoder, final Encoder encoder) { 
     this.decoder = decoder; 
     this.encoder = encoder; 
    } 

    @Override 
    public MyEntity[] getMyEntities() { 

     if (mdmhClient == null) { 
      mdmhClient = Feign.builder() 
        .encoder(encoder) 
        .decoder(decoder) 
        .client(new Client.Default(TrustingSSLSocketFactory.get(), null)) 
        .target(MdmhClient.class, "https://" + mdmhServiceId); 
     } 
     return mdmhClient.getMyEntity(); 
    } 
} 

L'interface ressemble à:

@RestController 
@RequestMapping(value = "/api") 
public interface MdmhClient { 

    @RequestLine("GET mdmh/service/v2/myentities") 
    @Headers({ "accept: application/json" }) 
    MyEntity[] getMyEntities(); 
} 

Lorsque MdmhClient me donne l'exception à mdmhClient.getEntity() appelez:Je sais que pour résoudre ce problème, je dois importer le certificat dans le jre. Je courais Intellij IDE et définir le chemin de jdk de mon projet:

C:\Program Files\Java\jdk1.8.0_65 

je aussi fait appel à la webservice par Firefox:

https://url-to-service.com/mdmh/service/v2/myentities 

et téléchargé le certificat que j'importé à:

C:\Program Files\Java\jdk1.8.0_65\jre\lib\security\cacerts 

Mais je reçois toujours l'erreur. Par frustration j'importais le certificat à tous les jdks installés, toujours pareil.

Je trouve: https://github.com/OpenFeign/feign/blob/master/core/src/test/java/feign/client/TrustingSSLSocketFactory.java

et ajouté à mon MdmhClient comme:

@Override 
public MyEntity[] getMyEntities() { 

    if (mdmhClient == null) { 
     Client client = new Client.Default(
       TrustingSSLSocketFactory.get(), 
       new HostnameVerifier() { 
        @Override 
        public boolean verify(String s, SSLSession sslSession) { 
         return true; 
        } 
       }); 
     mdmhClient = Feign.builder() 
       .encoder(encoder) 
       .decoder(decoder) 
       .client(new Client.Default(TrustingSSLSocketFactory.get(), null)) 
       .target(MdmhClient.class, "https://" + mdmhServiceId); 
    } 
    return mdmhClient.getMyEntities(); 
} 

après ce que je reçois une réponse AccessDenied de mon appelé service.

ERROR [081-exec-3] 17.08.17 08:26:28.868 [email protected]: Servlet.service() for servlet [dispatcherServlet] in context with path [/lic] threw exception [Request processing failed; nested exception is feign.FeignException: status 403 reading MdmhClient#getFamilyVersions(); content: 
<HTML><HEAD> 
<TITLE>Access Denied</TITLE> 
</HEAD> 
<BODY> 
<FONT f... 

Mais je suis sûr à 100% que je n'ai pas besoin d'authentification. Comme je peux entrer l'URL du navigateur sans modifier les en-têtes et obtenir un résultat.

J'espère que vous pouvez m'aider ou me donner quelques conseils pour résoudre ce problème.

Merci

+1

Vous devez supprimer les annotations de votre interface 'MdmhClient' – Sonata

Répondre

1

Il semble que votre client accède au service à travers un serveur proxy. Le serveur proxy requiert une authentification et répond ainsi avec 403 et utilise un certificat différent (chaîne), ce qui ne facilite pas l'importation du certificat que vous avez reçu du service Web.