web-dev-qa-db-ja.com

Spring Boot 2.0で自己署名証明書でHTTPSを有効にする

私は このチュートリアル に従って、テスト目的のために、自己署名証明書を使用してSpring Boot 2.0でHTTPSを有効にします。要約すると、このチュートリアルには次の手順が含まれています。

1. keytoolを使用してキーストアを生成します。

keytool -genkey -alias Tomcat
 -storetype PKCS12 -keyalg RSA -keysize 2048
 -keystore keystore.p12 -validity 3650

2. application.propertiesファイルにいくつかのプロパティを追加して、Spring BootでHTTPSを有効にします。

server.port: 8443
server.ssl.key-store: keystore.p12
server.ssl.key-store-password: mypassword
server.ssl.keyStoreType: PKCS12
server.ssl.keyAlias: Tomcat

3.HTTPをHTTPSにリダイレクトします(オプション)。この部分は無視しました。

しかし、アプリケーションを起動すると、次のエラーが発生しました。

org.Apache.catalina.LifecycleException: Failed to start component [Connector[HTTP/1.1-8443]]
    at org.Apache.catalina.util.LifecycleBase.start(LifecycleBase.Java:167) ~[Tomcat-embed-core-8.5.28.jar:8.5.28]
    at org.Apache.catalina.core.StandardService.addConnector(StandardService.Java:225) ~[Tomcat-embed-core-8.5.28.jar:8.5.28]
    at org.springframework.boot.web.embedded.Tomcat.TomcatWebServer.addPreviouslyRemovedConnectors(TomcatWebServer.Java:255) [spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE]
    at org.springframework.boot.web.embedded.Tomcat.TomcatWebServer.start(TomcatWebServer.Java:197) [spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.startWebServer(ServletWebServerApplicationContext.Java:300) [spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.Java:162) [spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.Java:552) [spring-context-5.0.4.RELEASE.jar:5.0.4.RELEASE]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.Java:140) [spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.Java:752) [spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.Java:388) [spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.Java:327) [spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.Java:1246) [spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.Java:1234) [spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE]
    at epic.gwdg.restgraph.RestgraphApplication.main(RestgraphApplication.Java:10) [classes/:na]
Caused by: org.Apache.catalina.LifecycleException: Protocol handler start failed
    at org.Apache.catalina.connector.Connector.startInternal(Connector.Java:1021) ~[Tomcat-embed-core-8.5.28.jar:8.5.28]
    at org.Apache.catalina.util.LifecycleBase.start(LifecycleBase.Java:150) ~[Tomcat-embed-core-8.5.28.jar:8.5.28]
    ... 13 common frames omitted
Caused by: Java.lang.IllegalArgumentException: Private key must be accompanied by certificate chain
    at org.Apache.Tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.Java:116) ~[Tomcat-embed-core-8.5.28.jar:8.5.28]
    at org.Apache.Tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.Java:87) ~[Tomcat-embed-core-8.5.28.jar:8.5.28]
    at org.Apache.Tomcat.util.net.NioEndpoint.bind(NioEndpoint.Java:225) ~[Tomcat-embed-core-8.5.28.jar:8.5.28]
    at org.Apache.Tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.Java:1150) ~[Tomcat-embed-core-8.5.28.jar:8.5.28]
    at org.Apache.coyote.AbstractProtocol.start(AbstractProtocol.Java:591) ~[Tomcat-embed-core-8.5.28.jar:8.5.28]
    at org.Apache.catalina.connector.Connector.startInternal(Connector.Java:1018) ~[Tomcat-embed-core-8.5.28.jar:8.5.28]
    ... 14 common frames omitted
Caused by: Java.lang.IllegalArgumentException: Private key must be accompanied by certificate chain
    at Java.base/Java.security.KeyStore.setKeyEntry(KeyStore.Java:1170) ~[na:na]
    at org.Apache.Tomcat.util.net.jsse.JSSEUtil.getKeyManagers(JSSEUtil.Java:257) ~[Tomcat-embed-core-8.5.28.jar:8.5.28]
    at org.Apache.Tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.Java:114) ~[Tomcat-embed-core-8.5.28.jar:8.5.28]
    ... 19 common frames omitted

2018-03-16 16:42:30.917  INFO 970 --- [           main] o.Apache.catalina.core.StandardService   : Stopping service [Tomcat]
2018-03-16 16:42:30.931  INFO 970 --- [           main] ConditionEvaluationReportLoggingListener : 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2018-03-16 16:42:30.933 ERROR 970 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

The Tomcat connector configured to listen on port 8443 failed to start. The port may already be in use or the connector may be misconfigured.

Action:

Verify the connector's configuration, identify and stop any process that's listening on port 8443, or configure this application to listen on another port.

2018-03-16 16:42:30.934  INFO 970 --- [           main] ConfigServletWebServerApplicationContext : Closing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@58ce9668: startup date [Fri Mar 16 16:42:26 CET 2018]; root of context hierarchy
2018-03-16 16:42:30.936  INFO 970 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Unregistering JMX-exposed beans on shutdown

Process finished with exit code 1

基本的に、メッセージは次のとおりです。

秘密鍵には証明書チェーンが必要です。

これは自己署名証明書であるため、もちろん、信頼できるチェーンはありません。どうすれば修正できますか?

現在のapplication.propertiesファイルは次のとおりです。

server.port=8443
server.ssl.enabled=true
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-password=123456
server.ssl.key-store-type=PKCS12
server.ssl.key-alias=Tomcat

手伝ってくれてどうもありがとう。

13
Triet Doan

問題は、生成されたキーストアにキーペアがないため、オプション-genkeyを使用するためにオプション-genkeypairで変更する必要があるため、秘密キーがないことです。

-genkeyは秘密鍵を生成し、-genkeypairは鍵ペア(公開鍵と秘密鍵)を生成します。

だから私はこれがうまくいくと思う:

keytool -genkeypair -alias Tomcat -storetype PKCS12 -keyalg RSA -keysize 2048  -keystore keystore.p12 -validity 3650

スプリングブート構成で、「=」を「=」で変更し、キーストアにパスを追加します。keystore.p12がリソースフォルダーにあると想定します。

server.ssl.key-store = classpath:keystore.p12
server.ssl.key-store-password = mypassword
server.ssl.key-store-type = PKCS12
server.ssl.key-alias = Tomcat
14
E2rabi

私はこの恐ろしいPrivate key must be accompanied by certificate chainエラーは、埋め込みTomcatサーバーを使用するSpring Bootアプリケーションでも同様です。それは私をinsaneにしていました。

簡単なタイプミスが私の問題だったことがわかりました:

@Override
public void customize(ConfigurableServletWebServerFactory server) {
    Ssl ssl = new Ssl();
    ssl.setEnabled(true);
    ssl.setKeyStore(keystoreFile);
    ssl.setKeyPassword(keystorePass); // << Should be `setKeyStorePassword` !!!!
    ssl.setKeyStoreType(keystoreType);
    ssl.setKeyAlias(keystoreAlias);

    server.setSsl(ssl);
    server.setPort(sslPort);
}

したがって、この場合、エラーメッセージは役に立ちませんまったくです。これが他の人の助けになることを願っています。正しい場所に正しいパスワード(キーとキーストア)を入れていることを確認してください。プロパティベースのセットアップでも同じ問題が発生する可能性があります。これは、作業対象によって異なります。

8
jocull

1. "-genkeypair"を使用します

keytool -genkeypair -alias Tomcat -storetype PKCS12 -keyalg RSA -keysize 2048  -keystore keystore.p12 -validity 3650
  1. 「server.ssl.key-password」を「server.ssl .key-store-password」に変更します
2
Frank Liu

application.propertiesファイルで小さな間違いを犯しました。変更してください

server.ssl.key-password=your_password

server.ssl.key-store-password=your_password

それで問題なく動作します。それが役に立てば幸い!ありがとうございました!

1
Arun Kumar N

同じ問題がありました。 2番目の回答から変更を加えました。しかし、問題はなくなっていません。作成した後、profilesセクションにkeystore.p12証明書をpom.xmlに含めただけです。

    <profiles>
    <!-- DEVELOPMENT PROFILE -->
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <build>
            <resources>
                <resource>
                    <directory>src/main/resources</directory>
                    <includes>
                        <include>application.properties</include>
                        <include>keystore.p12</include>
                        <include>data/**</include>
                    </includes>
                </resource>
            </resources>
        </build>
    </profile>
</profiles>
0
JenkaBY