如何使用Spring Boot和Tomcat指定我的.keystore文件?

我正在尝试设置Spring Security以与Spring Boot的嵌入式Tomcat实例一起使用。 有很多基本示例可以执行此操作,但我被困在它们的后面,它们通过HTTP(不是HTTPS)执行基本身份验证。

如果可以访问Tomcat配置文件(server.xml),我可能可以使它工作,但是由于Spring Boot使用嵌入式Tomcat实例(否则非常方便),因此我无权访问Tomcat配置文件(至少不是) 据我所知)。

可能有server.xml的设置,但我无法对其进行跟踪。 我已经看到application.properties中对server.contextPath字段的引用,我怀疑这可能与替换Tomcat配置文件有关。 即使是相关的,我也不知道从哪里开始-我看到的所有Tomcat SSL指令都是从编辑现有的server.xml文件开始的,而不是从头开始构建。

可以使用Spring Boot来做到这一点(通过某种方式指定server.xml的片段或通过其他方式)吗? 如果没有,最简单的方法是什么? 我知道我可能需要排除Spring Boot的Tomcat组件,但如果可能的话,我宁愿避免这样做。

Dave asked 2020-08-09T18:50:24Z
5个解决方案
58 votes

从Spring Boot 1.2开始,您可以使用application.ymlapplication.yml配置SSL。这是application.properties的示例:

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

application.yml相同:

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

这是当前参考文档的链接。

Willie Wheeler answered 2020-08-09T18:50:38Z
18 votes

事实证明,有一种方法可以执行此操作,尽管我不确定自己是否找到了“正确的”方法,因为这需要花费多个小时从多个项目中读取源代码。 换句话说,这可能是很多愚蠢的工作(但它可以工作)。

首先,无法获得嵌入式Tomcat中的server.xml,无法对其进行扩充或替换。 这必须以编程方式完成。

其次,“ require_https”设置无济于事,因为您不能以这种方式设置证书信息。 它确实设置了从http到https的转发,但是它没有让您使用https的方法,因此转发无济于事。 但是,将其与以下内容配合使用,可使https工作。

首先,您需要提供一个-storetype pkcs12,如嵌入式Servlet容器支持文档中所述。 这些文档是针对Java的,但是Groovy看起来几乎一样。 请注意,我无法识别示例中使用的-storepass pkcs12批注,但并非必需。 对于groovy,只需将其放入一个新的.groovy文件中,并在启动TomcatEmbeddedServletContainerFactory.addConnectorCustomizers()启动时将该文件包含在命令行中。

现在,说明说明您可以自定义在该代码中创建的-storetype pkcs12类,以便可以更改web.xml行为,这是正确的,但是出于我们的目的,重要的是要知道您也可以使用它来定制-storepass pkcs12行为。实际上,阅读该类的源代码并将其与Embedded Tomcat文档进行比较,您会发现这是唯一的实现方式。有趣的功能是TomcatEmbeddedServletContainerFactory.addConnectorCustomizers(),从Javadocs来看它可能看起来并不多,但实际上为您提供了嵌入式Tomcat对象以自定义您自己。只需传递您自己的TomcatConnectorCustomizer实现,然后在void customize(Connector con)函数中在给定的Connector上设置所需的内容即可。现在,您可以使用Connector进行大约十亿的操作,但我找不到有用的文档,但是此人的Spring嵌入式Tomcat项目中的createConnector()函数是非常实用的指南。我的实现最终看起来像这样:

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

Autowiring将自动执行此实现。 一旦我修复了损坏的密钥库文件(确保您使用-storetype pkcs12而不是其他地方报告的-storepass pkcs12调用keytool),就可以了。 另外,最好提供参数(端口,密码等)作为测试的配置设置,等等。我敢肯定,如果您可以使用@Value批注来与Groovy一起使用,那是有可能的。

Dave answered 2020-08-09T18:51:24Z
11 votes

对于外部密钥库,前缀为“ file:”

server.ssl.key-store=file:config/keystore 
pma answered 2020-08-09T18:51:44Z
0 votes

如果您不想实现connector customizer,则可以构建和导入提供预定义的connector customizer的库([https://github.com/ycavatars/spring-boot-https-kit)]。根据自述文件,您可以 只需创建您的密钥库,配置connector.https.*,导入库并添加@ComponentScan("org.ycavatars.sboot.kit")。然后您将具有HTTPS连接。

guest answered 2020-08-09T18:52:04Z
-1 votes

这是在Groovy中实现的定制程序的示例:

[HTTPS://GitHub.com/UN icon labs/Orville/blob/master/Web/双人床/卖弄/groovy/org/AP而EO/open registry/config/tomcat SSL configuration.groovy]

Dmitriy Kopylenko answered 2020-08-09T18:52:28Z
translate from https://stackoverflow.com:/questions/19613562/how-can-i-specify-my-keystore-file-with-spring-boot-and-tomcat