将JCEKS密钥库加载到Vert.x

时间:2018-10-12 12:47:59

标签: java ssl websocket keystore vert.x

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

双向通信有效,这不是问题。

我正在尝试使用TLS来保护连接。当我尝试将成功用于TCP连接的密钥库加载到Vert.x时,会发生问题。在网络套接字上调用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对象。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我找到了问题。以为我将来会把解决方案留在这里。

在一个疯狂的猜测中,我尝试使用PKCS12密钥库设置套接字,并且成功了!即使文档建议两者都应起作用,但只有PKCS12才可以。 或者我仍然想念一些东西...

侧面注释: 我仍然遇到套接字问题,因为我在密钥库中使用的别名与我将在其上运行的服务器不对应,因为设置时设置不知道该信息。但是我将为此另开一个问题。