Использовать сертификат ssl в приложении весенней загрузки - PullRequest
0 голосов
/ 19 апреля 2019

Я следовал этому руководству по использованию самозаверяющего сертификата, и это сработало до сих пор.

Затем я купил SSL-сертификат у своего провайдера и попытался его использовать.Я получаю сообщение об ошибке:

2019-04-19 17:45:36.385 ERROR 9245 --- [  restartedMain] org.apache.catalina.util.LifecycleBase   : Failed to start component [Connector[HTTP/1.1-8443]]

org.apache.catalina.LifecycleException: Protocol handler start failed
    at org.apache.catalina.connector.Connector.startInternal(Connector.java:1004) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.apache.catalina.core.StandardService.addConnector(StandardService.java:226) [tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.addPreviouslyRemovedConnectors(TomcatWebServer.java:259) [spring-boot-2.1.2.RELEASE.jar:2.1.2.RELEASE]
    at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:197) [spring-boot-2.1.2.RELEASE.jar:2.1.2.RELEASE]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.startWebServer(ServletWebServerApplicationContext.java:311) [spring-boot-2.1.2.RELEASE.jar:2.1.2.RELEASE]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:164) [spring-boot-2.1.2.RELEASE.jar:2.1.2.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549) [spring-context-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142) [spring-boot-2.1.2.RELEASE.jar:2.1.2.RELEASE]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775) [spring-boot-2.1.2.RELEASE.jar:2.1.2.RELEASE]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) [spring-boot-2.1.2.RELEASE.jar:2.1.2.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:316) [spring-boot-2.1.2.RELEASE.jar:2.1.2.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260) [spring-boot-2.1.2.RELEASE.jar:2.1.2.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248) [spring-boot-2.1.2.RELEASE.jar:2.1.2.RELEASE]
    at de.tki.chinese.ChineseApplication.main(ChineseApplication.java:24) [classes/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_73]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_73]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_73]
    at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_73]
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) [spring-boot-devtools-2.1.2.RELEASE.jar:2.1.2.RELEASE]
Caused by: java.lang.IllegalArgumentException: DerInputStream.getLength(): lengthTag=109, too big.
    at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:114) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.java:85) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:224) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1085) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:1171) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:568) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.apache.catalina.connector.Connector.startInternal(Connector.java:1001) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
    ... 19 common frames omitted
Caused by: java.io.IOException: DerInputStream.getLength(): lengthTag=109, too big.
    at sun.security.util.DerInputStream.getLength(DerInputStream.java:561) ~[na:1.8.0_73]
    at sun.security.util.DerValue.init(DerValue.java:365) ~[na:1.8.0_73]
    at sun.security.util.DerValue.<init>(DerValue.java:320) ~[na:1.8.0_73]
    at sun.security.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:1914) ~[na:1.8.0_73]
    at java.security.KeyStore.load(KeyStore.java:1445) ~[na:1.8.0_73]
    at org.apache.tomcat.util.net.SSLUtilBase.getStore(SSLUtilBase.java:178) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.apache.tomcat.util.net.SSLHostConfigCertificate.getCertificateKeystore(SSLHostConfigCertificate.java:204) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.apache.tomcat.util.net.jsse.JSSEUtil.getKeyManagers(JSSEUtil.java:203) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:112) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
    ... 25 common frames omitted

2019-04-19 17:45:36.405  INFO 9245 --- [  restartedMain] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2019-04-19 17:45:36.414  INFO 9245 --- [  restartedMain] ConditionEvaluationReportLoggingListener : 

Я создал хранилище ключей следующим образом:

MacBook-Pro:keystore tobias$ keytool -import -alias tomcat -file hanzien_de.key -keystore keystore_hanzien.de.p12 -storepass xxxxx

Затем я использовал это хранилище ключей в своем файле application.properties:

# ==============================================================
# = ssh
# ==============================================================
# Tell Spring Security (if used) to require requests over HTTPS
security.require-ssl=true

# The format used for the keystore 
server.ssl.key-store-type=PKCS12
# The path to the keystore containing the certificate
server.ssl.key-store=classpath:keystore/keystore_hanzien.de.p12
#server.ssl.key-store=classpath:keystore/hanzien_de.pfx
# The password used to generate the certificate
server.ssl.key-store-password=xxxxx
# The alias mapped to the certificate
server.ssl.key-alias=tomcat

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 20 апреля 2019

Во-первых, вы, кажется, используете Java 8 (8u73). Через 8 keytool по умолчанию используется формат JKS , а не PKCS12. (9 up делает по умолчанию PKCS12.) Вот почему причиной вашего исключения является DerStuff; Формат PKCS12 - это / использует DER, а JKS - нет. Либо укажите -storetype pkcs12 в команде keytool, либо укажите ..key-store-type=JKS в конфигурации вашего приложения (и, предпочтительно, измените имя, чтобы оно не вводило людей в заблуждение и не вводило в заблуждение людей).

Во-вторых, keytool -import в новом хранилище ключей (или записи) импортирует только сертификат в качестве записи 'trustcert', которую можно использовать только для проверки других сторон. TLS-сервер (или SSL до его устаревания), такой как Tomcat, или вообще любой проверяющий, должен иметь запись 'privatekey', содержащую сертификат И соответствующий PRIVATEKEY И обычно ЦЕПЬ CERT (S) . Чтобы быть точным, стандарты TLS требуют, чтобы сервер отправлял / все цепочечные сертификаты, необходимые для проверки сущности = серверный сертификат, опционально исключая корень или привязку; JSSE обычно отправляет сертификаты, которые находятся в PrivateKeyEntry, поэтому вы должны поместить туда необходимые сертификаты. Для любого общедоступного центра сертификации (например, Verisign ^ WSymantec ^ WDigicert, GoDaddy, LetsEncrypt / Identrust), начиная примерно с 1990 года, требуется как минимум один цепной сертификат, иногда два, а в редких случаях - больше. Для частного ЦС это может варьироваться в зависимости от ЦС. Если сервер не отправляет требуемые цепные сертификаты, некоторые клиенты могут по-прежнему иметь возможность проверить некоторые сертификаты; в частности, браузеры могут часто «заполнять» отсутствующие цепочки сертификатов из общедоступных ЦС. Это создает ситуацию, когда некоторые подключения к вашему серверу устанавливаются успешно, в то время как другие подключения к тому же серверу завершаются неудачно, что может сбивать с толку и расстраивать пользователей и не рекомендуется.

Если ваш .key файл фактически содержит только сертификат, его имя .key вводит в заблуждение и вводит в заблуждение. Если он содержит сертификат и , тогда ключ в PEM , Java может читать и отделять часть сертификата и игнорировать ключ; это позволяет запускать keytool, но создает результирующий файл, который Tomcat не может использовать для приема соединений TLS / SSL. (В зависимости от версии и, возможно, конфигурации, он может выдать довольно конкретное исключение, например «не ключ» или «ключ не найден», или он может просто отклонить все попытки подключения с handshake_failure.) Если он содержит только ключ или затем нажмите сертификат или не PEM, команда keytool потерпит неудачу, а ваша, очевидно, нет.

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

  • если у вас есть openssl командная строка, используйте ее для преобразования ключа + сертификата (ов) в PKCS12. (openssl pkcs12 -export будет включать цепочку сертификатов (сертификатов), если вы предоставите их / их явно, или явно укажете -chain и предоставите или по умолчанию хранилище доверенных сертификатов, содержащее его / их.) Существуют десятки существующих стековых Q и As, возвращаясь ко многим лет, охватывающих эту распространенную и популярную альтернативу.

  • используйте keytool до сгенерируйте пару ключей (уже в формате хранилища ключей, поддерживаемом Java) и CSR и получите сертификат, выданный для , что CSR, а затем используйте keytool -import либо (1) импортировать сертификаты цепочки CA как доверенные, а затем сертификат сервера в существующую запись приватного ключа , которая автоматически заполняет цепочку, либо (2) импортировать целое Цепочка ЦС напрямую к существующей записи приватного ключа . Существует много существующих Qs и As на эту альтернативу, а также собственный документ Sun / Oracle для Java и адаптированные версии от каждого CA (или почти).

  • напишите, или найдите, и используйте программу, которая явно загружает приватный ключ и сертификаты из любого формата (форматов), которые у вас есть, в запись «приватного ключа» в поддерживаемом хранилище ключей. Это больше работы, и есть только несколько вопросов и ответов по этому вопросу.

0 голосов
/ 19 апреля 2019

Если вы используете Maven, это, вероятно, происходит из-за фильтрации Maven во всей вашей папке ресурсов. Фильтрация ресурсов Maven (позволяющая включать переменные в файлы ресурсов) может испортить ваши двоичные файлы - и сертификаты особенно чувствительны к изменениям.

Подробнее о фильтрации ресурсов maven: http://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...