it-swarm.com.de

Aktivieren Sie HTTPS mit einem selbstsignierten Zertifikat in Spring Boot 2.0

Ich folge diesem Tutorial , um HTTPS in Spring Boot 2.0 mit einem selbstsignierten Zertifikat zu Testzwecken zu aktivieren. Zusammenfassend enthält dieses Lernprogramm die folgenden Schritte:

1.Generieren Sie den Keystore mit keytool.

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

2. Aktivieren Sie HTTPS in Spring Boot, indem Sie einige Eigenschaften in der Datei application.properties hinzufügen.

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

3.Redirect von HTTP zu HTTPS (optional). Ich habe diesen Teil ignoriert.

Wenn ich meine Anwendung starte, bekam ich jedoch folgende Fehlermeldung:

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.ser[email protected]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

Grundsätzlich lautet die Nachricht: 

Der private Schlüssel muss von einer Zertifikatskette begleitet werden.

Dies ist ein selbstsigniertes Zertifikat, daher verfügt es nicht über die vertrauenswürdige Kette. Wie kann ich es reparieren?

Hier ist meine aktuelle application.properties-Datei:

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

Vielen Dank für deine Hilfe.

12
Triet Doan

Das Problem ist, dass Sie in Ihrem generierten Keystore kein Schlüsselpaar haben, so dass es keinen privaten Schlüssel gibt, da Sie die Option -genkey verwenden.

-genkey generiert einen geheimen Schlüssel, während das -genkeypair eine .__ generiert. Schlüsselpaar (ein öffentlicher und ein privater Schlüssel).

Ich denke, das sollte funktionieren: 

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

Ändern Sie in Ihrer Spring-Boot-Konfiguration ":" by "=" und fügen Sie den Pfad zu Ihrem Keystore hinzu. 

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

Ich erhielt diesen schrecklichen Private key must be accompanied by certificate chain-Fehler auch in meiner Spring Boot-Anwendung mit einem eingebetteten Tomcat-Server. Es machte mich verrückt .

Es stellt sich heraus, dass ein einfacher Tippfehler mein Problem war:

@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);
}

Daher ist die Fehlermeldung überhaupt für diesen Fall nicht hilfreich. Ich hoffe das hilft jemand anderem. Stellen Sie sicher, dass Sie die richtigen Passwörter (Schlüssel vs. Schlüsselspeicher) an der richtigen Stelle eingeben. Dasselbe Problem kann in einem auf Eigenschaften basierenden Setup auftreten - es hängt davon ab, womit Sie arbeiten.

4
jocull

1.use "-genkeypair"

keytool -genkeypair -alias Tomcat -storetype PKCS12 -keyalg RSA -keysize 2048  -keystore keystore.p12 -validity 3650
  1. Ändern Sie "server.ssl.key-password" in "server.ssl. key-store-password ".
1
Frank Liu

Sie haben einen kleinen Fehler in der Datei application.properties gemacht. Bitte austauschen

server.ssl.key-password=your_password

zu

server.ssl.key-store-password=your_password

Es wird dann gut funktionieren. Ich hoffe es hilft! Danke!

1
Arun Kumar N

Ich hatte das gleiche Problem. Ich habe die Änderungen von der zweiten Antwort vorgenommen. Aber das Problem war nicht verschwunden ... Nach allem was ich gemacht habe, habe ich gerade mein keystore.p12 certificate in pom.xml in profiles eingefügt 

    <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