wake-up-neo.com

Wie kann ich meine .keystore-Datei mit Spring Boot und Tomcat angeben?

Ich versuche, Spring Security so einzurichten, dass es mit der eingebetteten Tomcat-Instanz von Spring Boot funktioniert. Es gibt einige grundlegende Beispiele, die dies tun, aber ich stelle fest, wo sie aufhören - sie führen eine grundlegende Authentifizierung über HTTP (nicht HTTPS) durch.

Ich könnte es wahrscheinlich zum Laufen bringen, wenn ich Zugriff auf die Tomcat-Konfigurationsdateien hätte (server.xml) aber da Spring Boot eine eingebettete Tomcat-Instanz verwendet (was ansonsten eine enorme Bequemlichkeit darstellt), habe ich keinen Zugriff auf die Tomcat-Konfigurationsdateien (zumindest meines Wissens nicht).

Möglicherweise gibt es ein application.properties Einstellung dafür, aber ich konnte es nicht aufspüren. Ich habe Verweise auf ein server.contextPath Feld in application.properties, von dem ich vermute, dass es etwas mit Ersatz-Tomcat-Konfigurationsdateien zu tun hat. Selbst wenn es verwandt ist, würde ich sowieso nicht wissen, wo ich anfangen soll - alle Tomcat-SSL-Anweisungen, die ich gesehen habe, beginnen mit dem Bearbeiten eines vorhandenen server.xml Datei, keine von Grund auf neu erstellen.

Kann dies mit Spring Boot gemacht werden (entweder durch Angabe eines Ausschnitts von server.xml oder durch andere Mittel)? Wenn nicht, was wäre der einfachste Weg, dies zu tun? Ich verstehe, dass ich möglicherweise die Tomcat-Komponente von Spring Boot ausschließen muss, aber ich würde es vorziehen, dies nach Möglichkeit zu vermeiden.

42
Dave

Es stellt sich heraus, dass es einen Weg gibt, dies zu tun, obwohl ich nicht sicher bin, ob ich den "richtigen" Weg gefunden habe, da dies Stunden des Lesens von Quellcode aus mehreren Projekten erforderte. Mit anderen Worten, dies könnte eine Menge dummer Arbeit sein (aber es funktioniert).

Erstens gibt es keine Möglichkeit, an die server.xml im eingebetteten Tomcat zu gelangen, weder um sie zu erweitern noch um sie zu ersetzen. Dies muss programmgesteuert erfolgen.

Zweitens hilft die Einstellung 'require_https' nicht, da Sie auf diese Weise keine Zertifikatsinformationen festlegen können. Es richtet eine Weiterleitung von http nach https ein , aber es gibt Ihnen keine Möglichkeit, https zum Laufen zu bringen, sodass die Weiterleitung nicht hilfreich ist. Verwenden Sie es jedoch zusammen mit den folgenden Elementen, die dazu führen, dass https funktioniert .

Zu Beginn müssen Sie ein EmbeddedServletContainerFactory angeben, wie in den Embedded Servlet Container Support-Dokumenten erläutert. Die Dokumente sind für Java, aber der Groovy würde ziemlich gleich aussehen. Beachten Sie, dass ich es nicht geschafft habe, die in ihrem Beispiel verwendete Annotation @Value Zu erkennen, aber Für groovy fügen Sie dies einfach in eine neue .groovy-Datei ein und fügen Sie diese Datei in die Befehlszeile ein, wenn Sie spring boot starten.

In den Anweisungen heißt es nun, dass Sie die in diesem Code erstellte Klasse TomcatEmbeddedServletContainerFactory anpassen können, damit Sie das Verhalten von web.xml ändern können. Dies ist der Fall, aber für unsere Zwecke ist es wichtig zu wissen, dass Sie dies auch können Verwenden Sie diese Option, um das Verhalten server.xml anzupassen. Wenn Sie die Quelle für die Klasse lesen und mit den eingebetteten Tomcat-Dokumenten vergleichen, werden Sie feststellen, dass dies der einzige Ort ist, an dem Sie dies tun können. Die interessante Funktion ist TomcatEmbeddedServletContainerFactory.addConnectorCustomizers(), die möglicherweise nicht so aussieht wie die Javadocs, Ihnen jedoch das eingebettete Tomcat-Objekt zur Verfügung stellt, um sich selbst anzupassen. Übergeben Sie einfach Ihre eigene Implementierung von TomcatConnectorCustomizer und legen Sie die gewünschten Einstellungen für das angegebene Connector in der Funktion void customize(Connector con) fest. Nun, es gibt ungefähr eine Milliarde Dinge, die Sie mit dem Connector tun können, und ich konnte keine nützlichen Dokumente dafür finden, aber die createConnector() -Funktion in diesem der persönliche Spring- embedded-Tomcat project ist eine sehr praktische Anleitung. Meine Implementierung sah dann so aus:

package com.deepdownstudios.server

import org.springframework.boot.context.embedded.Tomcat.TomcatConnectorCustomizer
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory
import org.springframework.boot.context.embedded.Tomcat.TomcatEmbeddedServletContainerFactory
import org.Apache.catalina.connector.Connector;
import org.Apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.*
import org.springframework.stereotype.*

@Configuration
class MyConfiguration {

@Bean
public EmbeddedServletContainerFactory servletContainer() {
final int port = 8443;
final String keystoreFile = "/path/to/keystore"
final String keystorePass = "keystore-password"
final String keystoreType = "pkcs12"
final String keystoreProvider = "SunJSSE"
final String keystoreAlias = "Tomcat"

TomcatEmbeddedServletContainerFactory factory = 
        new TomcatEmbeddedServletContainerFactory(this.port);
factory.addConnectorCustomizers( new TomcatConnectorCustomizer() {
    void    customize(Connector con) {
        Http11NioProtocol proto = (Http11NioProtocol) con.getProtocolHandler();
            proto.setSSLEnabled(true);
        con.setScheme("https");
        con.setSecure(true);
        proto.setKeystoreFile(keystoreFile);
        proto.setKeystorePass(keystorePass);
        proto.setKeystoreType(keystoreType);
        proto.setProperty("keystoreProvider", keystoreProvider);
        proto.setKeyAlias(keystoreAlias);
    }
});
return factory;
}
}

Das Autowiring wird diese Implementierung aufnehmen und damit ausführen. Nachdem ich meine kaputte Keystore-Datei repariert hatte (stellen Sie sicher, dass Sie keytool mit -storetype pkcs12 Und nicht mit -storepass pkcs12 Aufrufen, wie an anderer Stelle berichtet), funktionierte dies. Außerdem wäre es weitaus besser, die Parameter (Port, Passwort usw.) als Konfigurationseinstellungen zum Testen anzugeben. Ich bin mir sicher, dass dies möglich ist, wenn Sie die @ Value-Annotation für die Zusammenarbeit mit Groovy erhalten.

18
Dave

Ab Spring Boot 1.2 können Sie SSL mit application.properties Oder application.yml Konfigurieren. Hier ist ein Beispiel für application.properties:

server.port = 8443
server.ssl.key-store = classpath:keystore.jks
server.ssl.key-store-password = secret
server.ssl.key-password = another-secret

Gleiches gilt für application.yml:

server:
  port: 8443
  ssl:
    key-store: classpath:keystore.jks
    key-store-password: secret
    key-password: another-secret

Hier ist ein Link zum aktuelle Referenzdokumentation .

57
Willie Wheeler

Bei externen Keystores muss das Präfix "file:" eingegeben werden.

server.ssl.key-store=file:config/keystore 
11
pma

Wenn Sie Ihren connector customizer Nicht implementieren möchten, können Sie die Bibliothek erstellen und importieren ( https://github.com/ycavatars/spring-boot-https-kit ) bietet vordefinierte connector customizer. Laut README müssen Sie nur Ihren Schlüsselspeicher erstellen, connector.https.* Konfigurieren, die Bibliothek importieren und @ComponentScan("org.ycavatars.sboot.kit") hinzufügen. Dann haben Sie eine HTTPS-Verbindung.

0
guest