如何在Jetty中使用Windows证书存储?

3
我正在尝试使用Jetty的Windows证书库来进行HTTPS通信。

enter image description here

在客户端设置Web应用程序后,客户端应该更容易地更新Windows证书存储中过期的证书,而不必创建或更新keyStore文件。

这是我所做的:

https://www.eclipse.org/jetty/download.html下载最新版本9.4.26

start.ini中添加以下行:

jetty.ssl.port=443
jetty.sslContext.keyStoreType=Windows-MY

运行为:

"jre\bin\java" -jar start.jar --module=https,deploy

这是我收到的错误:

java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.eclipse.jetty.start.Main.invokeMain(Main.java:218)
        at org.eclipse.jetty.start.Main.start(Main.java:491)
        at org.eclipse.jetty.start.Main.main(Main.java:77)
Caused by: java.lang.IllegalStateException: no valid keystore
        at org.eclipse.jetty.util.security.CertificateUtils.getKeyStore(CertificateUtils.java:50)
        at org.eclipse.jetty.util.ssl.SslContextFactory.loadKeyStore(SslContextFactory.java:1188)
        at org.eclipse.jetty.util.ssl.SslContextFactory.load(SslContextFactory.java:323)
        at org.eclipse.jetty.util.ssl.SslContextFactory.doStart(SslContextFactory.java:245)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:72)
        at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:169)
        at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:117)
        at org.eclipse.jetty.server.SslConnectionFactory.doStart(SslConnectionFactory.java:92)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:72)
        at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:169)
        at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:117)
        at org.eclipse.jetty.server.AbstractConnector.doStart(AbstractConnector.java:320)
        at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:81)
        at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:231)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:72)
        at org.eclipse.jetty.server.Server.doStart(Server.java:385)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:72)
        at org.eclipse.jetty.xml.XmlConfiguration.lambda$main$0(XmlConfiguration.java:1888)
        at java.security.AccessController.doPrivileged(Native Method)
        at org.eclipse.jetty.xml.XmlConfiguration.main(XmlConfiguration.java:1837)
        ... 7 more

我还尝试添加或更改行,结果相同:

jetty.sslContext.keyStoreType=Windows-MY
jetty.sslContext.trustStoreType=Windows-ROOT

-

jetty.sslContext.keyStoreType=Windows-ROOT

-

jetty.sslContext.keyStoreType=Windows-MY
jetty.sslContext.trustStoreType=Windows-ROOT
jetty.sslContext.keyStorePath=NONE
jetty.sslContext.trustStorePath=NONE
1个回答

1
如果您查看Jetty的源代码,它们期望将某些文件系统资源作为密钥库和信任库路径传递。当密钥库或信任库路径不存在时,将出现以下异常:
Caused by: java.lang.IllegalStateException: no valid keystore
    at rg.eclipse.jetty.util.security.CertificateUtils.getKeyStore(CertificateUtils.java:50)

然而,有一个技巧可以加载Windows商店。您可以指定:
jetty.sslContext.keyStoreType=Windows-MY (or Windows-ROOT)

对于jetty.sslContext.keyStorePath,您可以指定任何存在于文件系统上的虚拟文件路径(甚至可以创建一个空的txt文件并给出其路径)。在这种情况下,Windows Store将被加载,Jetty端资源验证也将通过。
顺便提一下,当您将密钥库类型指定为Windows-MY或Windows-ROOT时,它会简单地忽略任何文件输入流(如果传递了的话),同时加载密钥库。最终只会加载一个密钥库,即Windows Store。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接