Es stellt sich heraus, dass es einen Weg gibt, dies zu tun, obwohl ich nicht sicher bin, dass ich den "richtigen" Weg gefunden habe, da dies Stunden des Lesens von Quellcode aus mehreren Projekten erforderte. Mit anderen Worten, das könnte eine Menge dummer Arbeit sein (aber es funktioniert).
Erstens gibt es keine Möglichkeit, die eingebettete Tomcat-Datei server.xml abzurufen oder zu ersetzen. Dies muss programmgesteuert erfolgen.
Zweitens hilft die Einstellung 'require_https' nicht, da Sie auf diese Weise keine Cert-Informationen festlegen können. Es tut einrichten Weiterleitung von http zu https, aber es gibt Ihnen keine Möglichkeit, https Arbeit so die Weiterleitung ist nicht hilfreich. Verwenden Sie es jedoch mit dem Zeug, macht https arbeiten.
Um zu beginnen, müssen Sie eine EmbeddedServletContainerFactory
wie in der Embedded Servlet Container Support docs erläutert bereitstellen. Die Dokumente sind für Java, aber das Groovy würde ziemlich gleich aussehen. Beachten Sie, dass ich die in ihrem Beispiel verwendete @Value
Annotation nicht erkennen konnte, sie wird aber nicht benötigt. Für groovy, fügen Sie diese einfach in eine neue .groovy Datei ein und fügen Sie diese Datei in die Befehlszeile ein, wenn Sie spring
booten.
Jetzt sagen die Anweisungen, dass Sie die TomcatEmbeddedServletContainerFactory
Klasse, die Sie in diesem Code erstellt haben, anpassen können, so dass Sie web.xml Verhalten ändern können, und das ist wahr, aber für unsere Zwecke ist es wichtig zu wissen, dass Sie auch verwenden können es, um server.xml
Verhalten zu schneidern. Wenn Sie die Quelle für die Klasse lesen und sie mit den eingebetteten Tomcat-Dokumenten vergleichen, sehen Sie, dass dies der einzige Ort ist, an dem Sie das tun können. Die interessante Funktion ist TomcatEmbeddedServletContainerFactory.addConnectorCustomizers()
, die nicht viel von den Javadocs aussehen mag, aber tatsächlich gibt Ihnen das eingebettete Tomcat-Objekt, um sich anzupassen. Übergeben Sie einfach Ihre eigene Implementierung von TomcatConnectorCustomizer
und stellen Sie die gewünschten Dinge auf die gegebene Connector
in der void customize(Connector con)
Funktion. Nun, es gibt ungefähr eine Milliarde Dinge, die Sie mit der Connector
tun können und ich konnte keine brauchbaren Dokumente dafür finden, aber die createConnector()
Funktion in dieser this guys personal Spring-embedded-Tomcat project ist eine sehr praktische Anleitung.Meine Implementierung sah 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;
}
}
Der Autowiring wird diese Implementierung einen Lauf mit ihm abholen. Sobald ich meine kaputte Keystore-Datei repariert habe (stelle sicher, dass du keytool mit -storetype pkcs12
, nicht -storepass pkcs12
an anderer Stelle anrufst), funktionierte das. Außerdem wäre es viel besser, die Parameter (Port, Passwort, etc) als Konfigurationseinstellungen für das Testen und so weiterzugeben. Ich bin mir sicher, dass es möglich ist, wenn Sie die @Value Annotation mit Groovy arbeiten können.
Ich habe ein anderes Beispiel gefunden, die eine andere 'application.properties' Einstellung verwendet,' server.tomcat.basedir', die mich schlägt als eher mit der eingebetteten Tomcat-Konfiguration zu tun haben. Ich kann es auch nicht tun, aber es ist wahrscheinlich näher an der richtigen Richtung und kann meine Frage klarer machen. – Dave
Kein Glück mit den Umgebungsvariablen der Befehlszeile: '-Djavax.net.ssl.keyStore =/Pfad/zu/keystore' '-Djavax.net.ssl.keyStorePassword = keyStorePass' entweder. – Dave