Я пытаюсь запустить очень простой сервер 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
Вам нужен только сертификат клиента в хранилище доверия сервера для взаимного (двухстороннего) ssl. Если сертификат сервера подписан сам по себе, вам нужно будет добавить сертификат сервера в хранилище доверенных клиентов. –
Взгляните на [этот пример] (https://github.com/jersey/jersey/tree/master/ примеры/https-clientserver-grizzly) –
@peetskillet - вот пример, который я начал с. Единственное различие заключается в том, что я не использую настройку jersey-container-grizzly2-servlet. Просто используйте стандартную версию jersey-container-grizzly2-http в качестве зависимости. Я не думаю, что это будет иметь значение. – jmsimpson68