无法与Vertx服务器和客户端建立SSL连接

时间:2020-09-22 14:30:44

标签: java http ssl vert.x

我正在尝试测试Vertx HttpServer和HttpClient之间的SSL连接。因为我没有任何证书,所以创建了一些自签名证书,如下所示:

keytool -genkeypair -alias selfsigned -keyalg RSA -keystore keystore.jks -storepass pass -keysize 2048 -validity 360

我已经生成了一个公共证书,

keytool -export -alias selfsigned -keystore keystore.jks -rfc -file public.cert

然后我

keytool -import -file public.cert -alias public -keystore trustStore.jks

然后,我尝试将它们作为JksOptions以我可以想象的任何顺序添加到服务器和客户端,并且它们在客户端均产生相同的错误:

未来{原因=无法创建SSL连接}

我不明白我做错了什么,而且我对密钥库和信任库的了解不多,任何组合都不适用于我的程序。如果将客户端设置为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个单独的Verticles中,并且分别运行。可能是什么问题?

  • 我已检查并且证书确实同时出现在密钥库和信任库中
  • CN = localhost,最终导致我的客户端websocket执行以下操作:client.webSocket(8080, "127.0.0.1",...
  • 我尝试设置.setVerifyHost(false),结果相同
  • 我尝试了其他问题中的解决方案,但没有用

1 个答案:

答案 0 :(得分:1)

以下是创建自签名证书和使用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.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")));