我正在尝试为我的客户端/服务器通信提供使用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
对象。
答案 0 :(得分:0)
您的密钥库似乎格式不正确,该异常实际上是由Vertx中使用的KeyStore
本身抛出的。确保首先也可以从Java打开密钥库字节。
答案 1 :(得分:0)
我找到了问题。以为我将来会把解决方案留在这里。
在一个疯狂的猜测中,我尝试使用PKCS12密钥库设置套接字,并且成功了!即使文档建议两者都应起作用,但只有PKCS12才可以。 或者我仍然想念一些东西...
侧面注释: 我仍然遇到套接字问题,因为我在密钥库中使用的别名与我将在其上运行的服务器不对应,因为设置时设置不知道该信息。但是我将为此另开一个问题。