2013-10-27 13 views
32

Tôi đang cố gắng thiết lập Bảo mật mùa xuân để làm việc với cá thể Tomcat được nhúng của Spring Boot. Có khá nhiều mẫu cơ bản làm điều này nhưng tôi bị kẹt ở nơi chúng bỏ đi - chúng thực hiện xác thực cơ bản qua HTTP (không phải HTTPS).Làm cách nào để chỉ định tệp .keystore của tôi với Spring Boot và Tomcat?

Tôi có thể làm cho nó hoạt động nếu tôi có quyền truy cập vào các tệp cấu hình Tomcat (server.xml) nhưng kể từ khi Spring Boot sử dụng một cá thể Tomcat được nhúng (đó là một tiện ích lớn), tôi không có quyền truy cập vào tệp cấu hình Tomcat (ít nhất, không phải với kiến ​​thức của tôi).

Có thể có cài đặt application.properties cho điều này nhưng tôi chưa thể theo dõi nó. Tôi đã thấy các tham chiếu đến trường server.contextPath trong application.properties mà tôi nghi ngờ có thể có liên quan đến các tệp cấu hình Tomcat thay thế. Ngay cả khi nó có liên quan, tôi sẽ không biết bắt đầu từ đâu - tất cả các hướng dẫn SSL Tomcat mà tôi đã thấy bắt đầu bằng việc chỉnh sửa tệp hiện có server.xml, chứ không phải xây dựng một tệp từ đầu.

Điều này có thể được thực hiện với Khởi động mùa xuân (hoặc bằng cách nào đó chỉ định một đoạn mã server.xml hoặc thông qua các phương tiện khác)? Nếu không, cách đơn giản nhất để làm điều này là gì? Tôi hiểu rằng tôi có thể cần loại trừ thành phần Tomcat của Spring Boot nhưng tôi muốn tránh điều đó nếu có thể.

+1

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

+1

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

Trả lời

17

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.

+2

Cảm ơn bạn đã xem xét tất cả điều này, tôi đã tự hỏi về hỗ trợ https trong khởi động mùa xuân. Có lẽ đây là một hạn chế của khởi động mùa xuân đòi hỏi một báo cáo lỗi? HTTPS là một yêu cầu khá cơ bản đối với bất kỳ ứng dụng web nào, thật lạ khi nó không được tài liệu tốt hơn và được hỗ trợ tốt hơn. – Jay

+2

Điều này được ghi lại trong tài liệu khởi động mùa xuân: https://github.com/spring-projects/spring-boot/blob/master/docs/howto.md – Jay

+0

sự khác biệt giữa việc cung cấp các đặc tính SSL này thông qua application.yml là gì và có việc triển khai TomcatConnectorCustomizer của riêng mình không? – yathirigan

0

Nếu bạn không muốn triển khai connector customizer, bạn có thể tạo và nhập thư viện (https://github.com/ycavatars/spring-boot-https-kit) cung cấp trước được xác định connector customizer. Theo README, bạn chỉ phải tạo kho khóa của mình, định cấu hình connector.https.*, nhập thư viện và thêm @ComponentScan("org.ycavatars.sboot.kit"). Sau đó, bạn sẽ có kết nối HTTPS.

41

Bắt đầu với mùa xuân Boot 1.2, bạn có thể cấu hình SSL sử dụng application.properties hoặc application.yml. Dưới đây là một ví dụ cho application.properties:

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

Cùng một điều với application.yml:

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

Dưới đây là một liên kết đến current reference documentation.

+3

Nó hoạt động thực sự. Spring Boot thật tuyệt vời! – Maksim

+2

sự khác nhau giữa việc cung cấp các đặc tính SSL này thông qua application.yml và việc thực hiện của riêng chúng ta về TomcatConnectorCustomizer (như trong câu trả lời dưới đây) là gì? – yathirigan

+4

Tính đơn giản so với kiểm soát. –

2

Đối keystores bên ngoài, tiền tố với "file:"

server.ssl.key-store=file:config/keystore 
Các vấn đề liên quan