2015-11-20 2 views
2

Я пытаюсь запустить очень простой сервер Grizzly и разрешить односторонние SSL-соединения (HTTPS) для доступа к службам REST для jax-rs. В конце концов я хочу двухстороннюю защиту SSL.Как настроить базовую конфигурацию Jersey/Grizzly 2.21 SSL

Я прошел через многие примеры, и я просто не могу заставить работать. Я продолжаю работать с ошибкой SSL Handshake. Очевидно, я должен делать что-то глупое. Любая помощь приветствуется.

Вот мой код, чтобы начать свой встроенный сервер Grizzly с помощью классов оболочки Джерси:

public static HttpServer startHttpsServer(URI listenerURI) throws IOException { 
    ResourceConfig resourceConfig = new ResourceConfig().packages("ws.argo.experiment.ssl"); 

    // First I tried this configuration using the certs from the Jersey sample code 
    // Grizzly ssl configuration 
    SSLContextConfigurator sslContext = new SSLContextConfigurator(); 

    // set up security context 
    sslContext.setKeyStoreFile("./src/main/resources/keystore_server"); // contains server keypair 
    sslContext.setKeyStorePass("asdfgh"); 
    sslContext.setTrustStoreFile("./src/main/resources/truststore_server"); // contains client certificate 
    sslContext.setTrustStorePass("asdfgh"); 

    // Then I tried just using a default config - didn't work either 
    // sslContext = SSLContextConfigurator.DEFAULT_CONFIG; 


    if (!sslContext.validateConfiguration(true)) { 
    LOGGER.severe("Context is not valid"); 

    } 

    LOGGER.finer("Starting Jersey-Grizzly2 JAX-RS secure server..."); 
    HttpServer httpServer; //= GrizzlyHttpServerFactory.createHttpServer(listenerURI, resourceConfig, false); 


    httpServer= GrizzlyHttpServerFactory.createHttpServer(
     listenerURI, 
     resourceConfig, 
     true, 
     new SSLEngineConfigurator(sslContext).setClientMode(false).setNeedClientAuth(false) 
    ); 



    httpServer.getServerConfiguration().setName("Test HTTPS Server"); 
    httpServer.start(); 
    LOGGER.info("Started Jersey-Grizzly2 JAX-RS secure server."); 

    return httpServer; 
} 

Я также попытался заменить SSLEngineConfigurator (SSLContext) .setClientMode (ложь) .setNeedClientAuth (ложь) с нулевым, чтобы увидеть, если это поможет. Неа.

Я всегда получаю следующее сообщение об ошибке:

grizzly-nio-kernel(3) SelectorRunner, fatal error: 40: no cipher suites in common 
javax.net.ssl.SSLHandshakeException: no cipher suites in common 
%% Invalidated: [Session-2, SSL_NULL_WITH_NULL_NULL] 
grizzly-nio-kernel(3) SelectorRunner, SEND TLSv1.2 ALERT: fatal, description = handshake_failure 
grizzly-nio-kernel(3) SelectorRunner, WRITE: TLSv1.2 Alert, length = 2 
grizzly-nio-kernel(3) SelectorRunner, fatal: engine already closed. Rethrowing javax.net.ssl.SSLHandshakeException: no cipher suites in common 
+0

Вам нужен только сертификат клиента в хранилище доверия сервера для взаимного (двухстороннего) ssl. Если сертификат сервера подписан сам по себе, вам нужно будет добавить сертификат сервера в хранилище доверенных клиентов. –

+0

Взгляните на [этот пример] (https://github.com/jersey/jersey/tree/master/ примеры/https-clientserver-grizzly) –

+0

@peetskillet - вот пример, который я начал с. Единственное различие заключается в том, что я не использую настройку jersey-container-grizzly2-servlet. Просто используйте стандартную версию jersey-container-grizzly2-http в качестве зависимости. Я не думаю, что это будет иметь значение. – jmsimpson68

ответ

2

Я видел этот тип рукопожатия вопроса возникает в других постах при попытке запустить этот вопрос с землей. Во всех этих сообщениях рукопожатия алгоритм ключа сервера никогда не обсуждался - я бы хотел, чтобы это было так. Это спасло бы меня пару часов. Проблема, вызвавшая вышеупомянутые ошибки, исходила из предположения, что хранилища ключей, созданные в рамках проекта образца Джерси, будут работать. Проблема с ключом сервера.

Примеры сертификатов сервера генерируются с использованием алгоритма DSA. По-видимому, это проблема.

Я воссоздал ключи сервера, используя алгоритм RSA и прочность 2048 бит. Я перезапустил сервер, и все началось, как и следовало ожидать.

Ошибка заключалась в том, что я предположил, что «образцы» будут работать. К сожалению.

3

Чтобы добавить комментарий к JMS, его ответ также решает мою проблему. Вот команда, которую я использовал для создания сертификата RSA.

keytool -genkey -keystore ./keystore_client -alias clientKey -keyalg RSA -keypass changeit -storepass changeit -dname "CN=Client, OU=Jersey, O=changeit, L=KL, ST=SEL, C=MY" 
keytool -export -alias clientKey -storepass changeit -keystore ./keystore_client -file ./client.cert 
keytool -import -alias clientCert -file ./client.cert -storepass changeit -keystore ./truststore_server 


keytool -genkey -keystore ./keystore_server -alias serverKey -keyalg RSA -keyalg RSA -keypass changeit -storepass changeit -dname "CN=changeit, OU=Jersey, O=changeit, L=KL, ST=SEL, C=MY" 
keytool -export -alias serverKey -storepass changeit -keystore ./keystore_server -file ./server.cert 
keytool -import -alias serverCert -file ./server.cert -storepass changeit -keystore ./truststore_client 
Смежные вопросы