2015-04-14 4 views
1

Во-первых, я новичок в Spring-Boot и SSL в целом, но я провел несколько дней исследований и в основном пытаюсь получить простое приложение Spring-Boot, настроенное с помощью Client Authentication.Конфигурация аутентификации клиента Spring-Boot.

Я настроил разъем так:

private Connector createSslConnector() { 
    Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); 
    Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler(); 
    try { 
     File keystore = getKeyStoreFile(); 
     File truststore = keystore; 
     connector.setScheme("https"); 
     connector.setSecure(true); 
     connector.setPort(sslPort); 
     protocol.setSSLEnabled(true); 
     protocol.setKeystoreFile(keystore.getAbsolutePath()); 
     protocol.setKeystorePass("changeit"); 
     protocol.setTruststoreFile(truststore.getAbsolutePath()); 
     protocol.setTruststorePass("changeit"); 
     protocol.setKeyAlias("apitester"); 
     protocol.setClientAuth("need"); 
     return connector; 
    } 
    catch (IOException ex) { 
     throw new IllegalStateException("cant access keystore: [" + "keystore" 
       + "] or truststore: [" + "keystore" + "]", ex); 
    } 
} 

И контроллер, который выглядит так:

@RequestMapping("/test/{identifier}") 
@ResponseBody 
ResponseEntity<String> test(HttpServletRequest request, @PathVariable String identifier) { 
    return new ResponseEntity<String>("hello: " + identifier, HttpStatus.OK) 
} 

Однако, как только я запускаю мое приложение, я могу использовать браузер для навигации на localhost: sslport/hello/test/xxxx и получить ответ без загрузки любого сертификата клиента. Я ожидал, что вам будет предложено получить сертификат клиента.

+0

Вы пробовали использовать 'https: // localhost: sslport/hello/test/xxxx'? –

ответ

0

Весенняя обувь по умолчанию использует контейнер tomcat (embedded).

Как окликнул tomcat doc, мы должны установить его истинной для обеспечения распространения действующей цепочки сертификатов от клиента, прежде чем принять соединение. Установка хочет позволит клиенту предоставить сертификат, но не обязательно.

Я сомневаюсь, что «необходимость» имеет значение для контейнера.

protocol.setClientAuth("need"); 
Смежные вопросы