Как использовать хранилище сертификатов Windows с Jetty?

Я пытаюсь использовать Магазин сертификатов Windows от Jetty для связи по протоколу HTTPS.

введите здесь описание изображения

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

Это то, что я сделал:

Загрузите последнюю версию 9.4.26 с https://www.eclipse.org/jetty/download.html

В 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

person flavio.donze    schedule 10.02.2020    source источник


Ответы (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 вы можете указать любой фиктивный путь к файлу, который существует в файловой системе (вы даже можете создать пустой текстовый файл и указать его путь!). В этом случае будет загружен Магазин Windows, и проверка ресурсов на стороне пристани также будет пройдена.

К вашему сведению, когда вы указываете тип хранилища ключей как Windows-MY или Windows-ROOT, он просто игнорирует любой входной поток файла (если передается) при загрузке хранилища ключей. В конечном итоге загружается только одно хранилище ключей, то есть Магазин Windows.

person keenUser    schedule 25.07.2020