Nó chỉ ra rằng có một cách để làm điều này, mặc dù tôi không chắc chắn tôi đã tìm thấy cách 'thích hợp' kể từ giờ yêu cầu đọc mã nguồn từ nhiều dự án. Nói cách khác, điều này có thể là rất nhiều công việc câm (nhưng nó hoạt động).
Trước tiên, không có cách nào để lấy tệp server.xml trong Tomcat được nhúng, hoặc để tăng thêm hoặc thay thế nó. Điều này phải được thực hiện theo chương trình.
Thứ hai, cài đặt 'require_https' không hữu ích vì bạn không thể đặt thông tin cert theo cách đó. Nó không thiết lập chuyển tiếp từ http đến https, nhưng nó không cung cấp cho bạn cách để thực hiện công việc https để chuyển tiếp không hữu ích. Tuy nhiên, hãy sử dụng công cụ này với nội dung bên dưới, mà làm làm cho công việc https.
Để bắt đầu, bạn cần cung cấp EmbeddedServletContainerFactory
như được giải thích trong Embedded Servlet Container Support docs. Các tài liệu dành cho Java nhưng Groovy sẽ trông khá giống nhau. Lưu ý rằng tôi đã không thể làm cho nó nhận ra chú thích @Value
được sử dụng trong ví dụ của chúng nhưng không cần thiết. Đối với groovy, chỉ cần đặt điều này trong một tệp .groovy mới và bao gồm tệp đó trên dòng lệnh khi bạn khởi động khởi động spring
.
Bây giờ, hướng dẫn nói rằng bạn có thể tùy chỉnh lớp TomcatEmbeddedServletContainerFactory
mà bạn đã tạo trong mã đó để bạn có thể thay đổi hành vi web.xml, và điều này là đúng, nhưng với mục đích của chúng tôi, điều quan trọng là phải biết rằng bạn cũng có thể sử dụng nó để điều chỉnh hành vi server.xml
. Thật vậy, đọc nguồn cho lớp và so sánh nó với tài liệu Embedded Tomcat, bạn thấy rằng đây là nơi duy nhất để làm điều đó. Hàm thú vị là TomcatEmbeddedServletContainerFactory.addConnectorCustomizers()
, có thể không giống nhiều từ Javadocs nhưng thực sự cung cấp cho bạn đối tượng Tomcat được nhúng để tùy chỉnh chính mình. Đơn giản chỉ cần thực hiện của riêng bạn của TomcatConnectorCustomizer
và thiết lập những điều bạn muốn trên Connector
nhất định trong các chức năng void customize(Connector con)
. Bây giờ, có khoảng một tỷ điều bạn có thể làm với Connector
và tôi không thể tìm thấy tài liệu hữu ích cho nó nhưng chức năng createConnector()
trong this guys personal Spring-embedded-Tomcat project này là một hướng dẫn rất thiết thực.Việc triển khai của tôi đã kết thúc như sau:
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;
}
}
Tự động sẽ thực hiện việc triển khai này. Khi tôi đã sửa tệp keystore busted của mình (hãy đảm bảo bạn đã gọi cho keytool với -storetype pkcs12
, không phải là -storepass pkcs12
như được báo cáo ở nơi khác), điều này đã hiệu quả. Ngoài ra, sẽ tốt hơn nếu cung cấp các tham số (cổng, mật khẩu, vv) làm cài đặt cấu hình để thử nghiệm và như vậy ... Tôi chắc chắn có thể nếu bạn có thể nhận chú thích @Value để làm việc với Groovy.
Tôi đã tìm thấy một ví dụ sử dụng một khác nhau 'application.properties' thiết lập, 'server.tomcat.basedir', đó đập vào mắt tôi như là có nhiều khả năng liên quan đến cấu hình Tomcat được nhúng. Tôi không thể làm cho nó để làm bất cứ điều gì, nhưng nó có thể gần gũi hơn với đúng hướng và có thể làm cho câu hỏi của tôi rõ ràng hơn. – Dave
Không may mắn với các biến môi trường dòng lệnh: '-Djavax.net.ssl.keyStore =/path/to/keystore'' -Djavax.net.ssl.keyStorePassword = keyStorePass' một trong hai. – Dave