Я пытаюсь предоставить клиенту / серверу возможность использовать 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 ожидает, что хранилище ключей будет структурировано, что оно предполагает и т. Д. И не могу понять, почему это хранилище ключей не принято.
Кроме того, на заметку, почему't Vert.x допускает передачу объекта KeyStore
.