Загрузка хранилища ключей JCEKS в Vert.x - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь предоставить клиенту / серверу возможность использовать 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.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Я нашел проблему.Я думал, что оставлю решение здесь на будущее.

В дикой догадке я попытался настроить сокет, используя хранилище ключей PKCS12, и это сработало!Хотя документация предполагает, что оба должны работать, работает только PKCS12.Или я все еще что-то упускаю ...

Примечание: У меня все еще есть проблемы с сокетом, потому что я использую псевдонимы в моем хранилище ключей, которые не соответствуютна сервере, на котором я буду его запускать, потому что моя установка не будет знать эту информацию, когда она будет установлена.Но я открою для этого отдельный вопрос.

0 голосов
/ 20 октября 2018

Похоже, что ваше хранилище ключей не в хорошем формате, исключение на самом деле выдается KeyStore самой, используемой в Vertx.Сначала убедитесь, что вы можете открыть байты хранилища ключей из Java.

...