无法与 Vertx 服务器和客户端建立 SSL 连接
Cannot create SSL connection with Vertx server and client
我正在尝试测试 Vertx HttpServer 和 HttpClient 之间的 SSL 连接。因为我没有任何证书,所以我创建了一些这样的自签名证书:
keytool -genkeypair -alias selfsigned -keyalg RSA -keystore keystore.jks -storepass pass -keysize 2048 -validity 360
我已经生成了一个 public 证书:
keytool -export -alias selfsigned -keystore keystore.jks -rfc -file public.cert
然后我
keytool -import -file public.cert -alias public -keystore trustStore.jks
然后我尝试以我能想象的任何可能的顺序将它们作为 JksOptions 添加到服务器和客户端,并且它们都在客户端生成相同的错误:
Future{cause=Failed to create SSL connection}
我不明白我做错了什么,而且就我所读到的有关密钥库和信任库的内容而言,任何组合都不适用于我的程序。如果我将客户端设置为 trustAll(true)
,连接就会成功。
服务器和客户端的设置如下:
HttpServerOptions httpServerOptions = new HttpServerOptions();
JksOptions options = new JksOptions();
options
.setPassword("pass")
.setPath("src/main/resources/file/keystore.jks");
httpServerOptions
.setSsl(true)
.setKeyStoreOptions(options);
HttpClientOptions httpClientOptions = new HttpClientOptions();
JksOptions options = new JksOptions();
options
.setPassword("pass")
.setPath("src/main/resources/file/trustStore.jks");
HttpClient client = vertx.createHttpClient(httpClientOptions
.setSsl(true)
.setTrustStoreOptions(options)
);
上面的代码出现在 2 个独立的 Verticle 中,并且是 运行 分开的。可能是什么问题?
- 我已经检查过,证书确实出现在密钥库和信任库中
- CN = localhost,导致最终我的客户端 websocket 执行以下操作:
client.webSocket(8080, "127.0.0.1",...
- 我试过设置
.setVerifyHost(false)
,结果一样
- 我已经尝试了其他问题的解决方案,但都没有用
以下是创建自签名证书和使用 in vertx 所需的步骤。
准备密钥库:
keytool -genkey -alias server-alias -keyalg RSA -keypass changeit -storepass changeit -keystore keystore.jks
keytool -export -alias server-alias -storepass changeit -file server.cer -keystore keystore.jks
keytool -import -v -trustcacerts -alias server-alias -file server.cer -keystore cacerts.jks -keypass changeit -storepass changeit
这是vertx代码:
vertx.createHttpServer(new HttpServerOptions()
.setSsl(true)
.setKeyStoreOptions(new JksOptions().setPassword("changeit")
.setPath("keystore.jks")))
.requestHandler(req -> req.response().end("Hello!"))
.listen(9999, "127.0.0.1");
HttpClient client = vertx.createHttpClient(new HttpClientOptions()
.setVerifyHost(false)
.setSsl(true)
.setTrustStoreOptions(new JksOptions().setPassword("changeit")
.setPath("keystore.jks")));
我正在尝试测试 Vertx HttpServer 和 HttpClient 之间的 SSL 连接。因为我没有任何证书,所以我创建了一些这样的自签名证书:
keytool -genkeypair -alias selfsigned -keyalg RSA -keystore keystore.jks -storepass pass -keysize 2048 -validity 360
我已经生成了一个 public 证书:
keytool -export -alias selfsigned -keystore keystore.jks -rfc -file public.cert
然后我
keytool -import -file public.cert -alias public -keystore trustStore.jks
然后我尝试以我能想象的任何可能的顺序将它们作为 JksOptions 添加到服务器和客户端,并且它们都在客户端生成相同的错误:
Future{cause=Failed to create SSL connection}
我不明白我做错了什么,而且就我所读到的有关密钥库和信任库的内容而言,任何组合都不适用于我的程序。如果我将客户端设置为 trustAll(true)
,连接就会成功。
服务器和客户端的设置如下:
HttpServerOptions httpServerOptions = new HttpServerOptions();
JksOptions options = new JksOptions();
options
.setPassword("pass")
.setPath("src/main/resources/file/keystore.jks");
httpServerOptions
.setSsl(true)
.setKeyStoreOptions(options);
HttpClientOptions httpClientOptions = new HttpClientOptions();
JksOptions options = new JksOptions();
options
.setPassword("pass")
.setPath("src/main/resources/file/trustStore.jks");
HttpClient client = vertx.createHttpClient(httpClientOptions
.setSsl(true)
.setTrustStoreOptions(options)
);
上面的代码出现在 2 个独立的 Verticle 中,并且是 运行 分开的。可能是什么问题?
- 我已经检查过,证书确实出现在密钥库和信任库中
- CN = localhost,导致最终我的客户端 websocket 执行以下操作:
client.webSocket(8080, "127.0.0.1",...
- 我试过设置
.setVerifyHost(false)
,结果一样 - 我已经尝试了其他问题的解决方案,但都没有用
以下是创建自签名证书和使用 in vertx 所需的步骤。 准备密钥库:
keytool -genkey -alias server-alias -keyalg RSA -keypass changeit -storepass changeit -keystore keystore.jks
keytool -export -alias server-alias -storepass changeit -file server.cer -keystore keystore.jks
keytool -import -v -trustcacerts -alias server-alias -file server.cer -keystore cacerts.jks -keypass changeit -storepass changeit
这是vertx代码:
vertx.createHttpServer(new HttpServerOptions()
.setSsl(true)
.setKeyStoreOptions(new JksOptions().setPassword("changeit")
.setPath("keystore.jks")))
.requestHandler(req -> req.response().end("Hello!"))
.listen(9999, "127.0.0.1");
HttpClient client = vertx.createHttpClient(new HttpClientOptions()
.setVerifyHost(false)
.setSsl(true)
.setTrustStoreOptions(new JksOptions().setPassword("changeit")
.setPath("keystore.jks")));