49

I'm trying to set up Spring Security to work with Spring Boot's embedded Tomcat instance. There are quite a few basic samples that do this but I'm stuck where they leave off -- they do basic authentication over HTTP (not HTTPS).

I could probably make it work if I had access to the Tomcat configuration files (server.xml) but since Spring Boot uses an embedded Tomcat instance (which is otherwise a huge convenience), I dont have access to the Tomcat configuration files (at least, not to my knowledge).

There may be an application.properties setting for this but I haven't been able to track it down. I've seen references to a server.contextPath field in application.properties that I suspect may have something to do with replacement Tomcat config files. Even if it is related, I wouldn't know where to begin anyway -- all of the Tomcat SSL instructions I've seen start with editing an existing server.xml file, not building one from scratch.

Can this be done with Spring Boot (either by somehow specifying a snippet of server.xml or through other means)? If not, what would be the simplest way to do this? I understand that I may need to exclude the Tomcat component of Spring Boot but I'd prefer to avoid that if possible.

4

5 回答 5

67

从 Spring Boot 1.2 开始,您可以使用application.properties或配置 SSL application.yml。这是一个示例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

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

于 2014-08-29T06:44:03.797 回答
22

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

server.ssl.key-store=file:config/keystore 
于 2017-12-15T08:50:52.120 回答
19

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

首先,无法获取嵌入式 Tomcat 中的 server.xml 来扩充或替换它。这必须以编程方式完成。

其次,“require_https”设置无济于事,因为您无法以这种方式设置证书信息。它确实设置了从 http 到 https 的转发,但它没有为您提供使 https 工作的方法,因此转发没有帮助。但是,将它与下面的东西一起使用,这确实使 https 工作。

首先,您需要按照Embedded Servlet Container Support docsEmbeddedServletContainerFactory中的说明提供一个。这些文档适用于 Java,但 Groovy 看起来几乎相同。请注意,我无法让它识别他们示例中使用的注释,但不需要它。对于 groovy,只需将其放在一个新的 .groovy 文件中,并在启动引导时将该文件包含在命令行中。@Valuespring

现在,说明说您可以自定义TomcatEmbeddedServletContainerFactory您在该代码中创建的类,以便您可以更改 web.xml 行为,这是真的,但对于我们的目的,重要的是要知道您也可以使用它来定制server.xml行为。事实上,阅读该类的源代码并将其与 Embedded Tomcat 文档进行比较,您会发现这是唯一可以这样做的地方。有趣的函数是TomcatEmbeddedServletContainerFactory.addConnectorCustomizers(),它可能看起来不像 Javadocs,但实际上为您提供了 Embedded Tomcat 对象来自定义您自己。只需传递您自己的实现并在函数TomcatConnectorCustomizer中给定的内容上设置您想要的东西。现在,你可以用它做大约十亿件事情,但我找不到有用的文档,但是Connectorvoid customize(Connector con)ConnectorcreateConnector()这个功能在这个家伙个人的 Spring-embedded-Tomcat 项目中是一个非常实用的指南。我的实现最终看起来像这样:

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

自动装配将选择这个实现并运行它。一旦我修复了我破坏的密钥库文件(确保你用 调用 keytool -storetype pkcs12,而不是-storepass pkcs12像其他地方报道的那样),这就奏效了。此外,提供参数(端口、密码等)作为测试的配置设置会更好......我相信如果您可以让@Value 注释与 Groovy 一起使用,这是可能的。

于 2013-10-28T04:44:16.407 回答
0

下面是一个在 Groovy 中实现的定制器的示例:

https://github.com/UniconLabs/orville/blob/master/web/src/main/groovy/org/apereo/openregistry/config/TomcatSslConfiguration.groovy

于 2014-06-22T15:10:13.427 回答
0

如果您不想实现connector customizer的. 根据自述文件,您只需创建密钥库、配置、导入库并添加. 然后您将拥有 HTTPS 连接。connector customizerconnector.https.*@ComponentScan("org.ycavatars.sboot.kit")

于 2014-06-11T07:53:11.150 回答