将 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 有效。
或者我仍然缺少一些东西...
旁注:
我仍然遇到套接字问题,因为我在我的密钥库中使用的别名与服务器不对应我将 运行 它打开,因为我的设置在它时不知道该信息已成立。但我会为此打开一个单独的问题。
我正在尝试为我的 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 有效。 或者我仍然缺少一些东西...
旁注: 我仍然遇到套接字问题,因为我在我的密钥库中使用的别名与服务器不对应我将 运行 它打开,因为我的设置在它时不知道该信息已成立。但我会为此打开一个单独的问题。