我正在尝试启动并运行一个非常基本的Grizzly服务器,以允许单向SSL(HTTPS)连接访问jax-rs REST服务。最终我想要双向SSL安全性。
我已经浏览了很多例子,但我无法得到任何工作。我一直遇到SSL握手错误。显然,我必须做一些愚蠢的事情。任何帮助表示赞赏。
以下是使用Jersey包装器类启动嵌入式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;
}
我还尝试用null替换SSLEngineConfigurator(sslContext).setClientMode(false).setNeedClientAuth(false)以查看是否有帮助。不。
我总是收到以下错误:
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 :(得分:4)
要在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
答案 1 :(得分:2)
我已经看到这种类型的握手问题出现在其他帖子中,同时试图将此问题解决。在所有这些握手帖子中,从未讨论过服务器密钥算法 - 我希望它已经存在。这本来可以节省我几个小时。导致上述错误的问题源于假设作为Jersey示例项目的一部分创建的密钥库可以工作。服务器密钥就是问题所在。
使用DSA算法生成样本服务器证书。显然这是一个问题。
我使用RSA算法和2048位强度重新创建了服务器密钥。我重新启动了服务器,一切都开始像预期的那样工作。
错误是我假设"样本"钥匙会起作用。糟糕。