将 JCEKS 密钥库加载到 Vert.x

Loading a JCEKS keystore into Vert.x

我正在尝试为我的 client/server 通信提供使用 WebSockets 的选项。我有一些使用 Vert.x 的经验,并选择将其用作此框架(注意:我不拘泥于此!)。

双向通信正常,这不是问题。

我正在尝试使用 TLS 来保护连接。当我尝试将我成功用于 TCP 连接的密钥库加载到 Vert.x 时,会出现问题。在 Web 套接字上调用 listen() 时,出现以下异常和堆栈跟踪:

io.vertx.core.VertxException: java.io.IOException: Invalid keystore format

    at io.vertx.core.net.impl.SSLHelper.createContext(SSLHelper.java:297)
    at io.vertx.core.net.impl.SSLHelper.getContext(SSLHelper.java:457)
    at io.vertx.core.net.impl.SSLHelper.validate(SSLHelper.java:482)
    at io.vertx.core.http.impl.HttpServerImpl.listen(HttpServerImpl.java:243)
    at io.vertx.core.http.impl.HttpServerImpl.listen(HttpServerImpl.java:211)
    at example.VertxSslTest.testServerSocket(VertxSslTest.java:50)
    <22 internal calls>
Caused by: java.io.IOException: Invalid keystore format
    at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:658)
    at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:56)
    at sun.security.provider.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:224)
    at sun.security.provider.JavaKeyStore$DualFormatJKS.engineLoad(JavaKeyStore.java:70)
    at java.security.KeyStore.load(KeyStore.java:1445)
    at io.vertx.core.net.impl.KeyStoreHelper.loadJKSOrPKCS12(KeyStoreHelper.java:269)
    at io.vertx.core.net.impl.KeyStoreHelper.create(KeyStoreHelper.java:83)
    at io.vertx.core.net.KeyCertOptions.getKeyManagerFactory(KeyCertOptions.java:43)
    at io.vertx.core.net.impl.SSLHelper.getKeyMgrFactory(SSLHelper.java:302)
    at io.vertx.core.net.impl.SSLHelper.createContext(SSLHelper.java:255)
    ... 27 more

我的简单测试设置,只是试图打开一个套接字:

public void testServerSocket() throws Exception {
    ClassLoader cl = Thread.currentThread().getContextClassLoader();
    URL url = cl.getResource("keystore.ks");
    Path path = Paths.get(url.toURI());
    byte[] keystoreBytes = Files.readAllBytes(path);

    Buffer buffer = Buffer.buffer(keystoreBytes);
    HttpServerOptions options = new HttpServerOptions()
            .setSsl(true)
            .setKeyStoreOptions(new JksOptions()
                    .setValue(buffer)
                    .setPassword("password"));
    Vertx vertx = Vertx.vertx();

    vertx.createHttpServer(options)
            .websocketHandler(this::connected)
            .listen(8080);
}

我找不到任何关于 Vert.x 期望密钥库的结构、它假定的内容等的任何信息。并且无法弄清楚为什么不接受此密钥库。

另外,附带说明一下,为什么 Vert.x 不允许传递 KeyStore 对象。

看起来你的密钥库格式不正确,异常实际上是由 Vertx 中使用的 KeyStore 本身抛出的。确保您也可以先从 Java 打开密钥库字节。

我发现了问题。以为我会把解决方案留在这里以备将来使用。

我胡乱猜测,尝试使用 PKCS12 密钥库设置套接字,结果成功了!尽管文档表明两者都应该有效,但只有 PKCS12 有效。 或者我仍然缺少一些东西...

旁注: 我仍然遇到套接字问题,因为我在我的密钥库中使用的别名与服务器不对应我将 运行 它打开,因为我的设置在它时不知道该信息已成立。但我会为此打开一个单独的问题。