2017-11-02 1 views
0

Ich versuche, eine OAuth2RestTemplate zu verwenden, um ein selbst signiertes Zertifikat für den Zugriff auf Token über HTTPS abgerufen werden, aber ich bin immer noch diesen Fehler:CertificateException: passende Kein Name localhost mit OAuth2RestTemplate NICHT RestTemplate gefunden

javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No name matching localhost found

Dies ist meine Unit-Test, der den Fehler zu werfen:

public class OAuth2ClientTest { 

    private static final Logger logger = LoggerFactory 
      .getLogger(SecurityConfig.class); 

    @Value("${oauth.resource:https://localhost:8443}") 
    private String baseUrl; 

    @Value("${oauth.token:https://localhost:8443/oauth/token}") 
    private String tokenUrl; 

    @Value("${oauth.resource.id:microservice-test}") 
    private String resourceId; 

    @Value("${oauth.resource.client.id:client1}") 
    private String resourceClientId; 

    @Value("${oauth.resource.client.secret:changit}") 
    private String resourceClientSecret; 



    @Test 
    public void execute_post_to_tokenUrl() 
      throws ClientProtocolException, IOException { 

     OAuth2RestTemplate template = template(); 

     ResponseEntity<String> response = template.exchange(
       tokenUrl, 
       HttpMethod.POST, 
       null, 
       String.class); 

     assertThat(response.getStatusCode().value(), equalTo(200)); 
    } 

    private OAuth2RestTemplate template(){ 
     ResourceOwnerPasswordResourceDetails resource = new ResourceOwnerPasswordResourceDetails(); 
     resource.setAccessTokenUri(tokenUrl); 
     resource.setId(resourceId); 
     resource.setClientId(resourceClientId); 
     resource.setClientSecret(resourceClientSecret); 

     resource.setGrantType("password"); 

     resource.setScope(Arrays.asList("openid")); 

     resource.setUsername("[email protected]"); 
     resource.setPassword("user1"); 

     OAuth2RestTemplate template = new OAuth2RestTemplate(resource); 

     ClientHttpRequestFactory factory = template.getRequestFactory(); 

     template.setRequestFactory(requestFactory()); 
     return template; 
    } 

    private HttpComponentsClientHttpRequestFactory requestFactory(){ 

     CloseableHttpClient httpClient 
       = HttpClients.custom() 
       .setSSLHostnameVerifier(new NoopHostnameVerifier()) 
       .build(); 
     HttpComponentsClientHttpRequestFactory requestFactory 
       = new HttpComponentsClientHttpRequestFactory(); 
     requestFactory.setHttpClient(httpClient); 

     return requestFactory; 
    } 
} 

Wenn ich nicht-HTTPS-Verbindung verwenden, funktioniert der OAuth2 Code in Ordnung. Nur nicht mit HTTPS

Antwort

0

Sie müssen ein Zertifikat mit dem Alias ​​"localhost" erstellen, wenn TLS ordnungsgemäß funktionieren soll.
andere Möglichkeit ist, das irgendwo statisch oder in der Testkonfiguration zu setzen:

final HostnameVerifier defaultHostnameVerifier = javax.net.ssl.HttpsURLConnection.getDefaultHostnameVerifier(); 
final HostnameVerifier localhostAcceptedHostnameVerifier = new javax.net.ssl.HostnameVerifier() { 

    public boolean verify (String hostname, javax.net.ssl.SSLSession sslSession) { 
     if (hostname.equals ("localhost")) { 
      return true; 
     } 
     return defaultHostnameVerifier.verify (hostname, sslSession); 
    } 
}; 
javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier (localhostAcceptedHostnameVerifier); 

...

Verwandte Themen