当前位置: 首页 > 知识库问答 >
问题:

如何用spring boot和Tomcat指定我的.keystore文件?

申屠亦
2023-03-14

我正在尝试设置spring安全,以便与spring boot的嵌入式Tomcat实例一起工作。有相当多的基本示例可以执行此操作,但我仍然停留在它们离开的地方--它们通过HTTP(而不是HTTPS)执行基本身份验证。

如果我有权访问Tomcat配置文件(server.xml)的话,我可能会让它正常工作,但由于spring boot使用嵌入式Tomcat实例(这在其他方面非常方便),所以我没有访问Tomcat配置文件的权限(至少我不知道)。

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

这可以用spring boot(通过某种方式指定server.xml的一个片段或通过其他方式)来完成吗?如果没有,那么最简单的方法是什么呢?我知道我可能需要排除spring boot的Tomcat组件,但如果可能的话,我更愿意避免。

共有2个答案

乌和畅
2023-03-14

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

首先,没有办法在嵌入式Tomcat中获取server.html" target="_blank">xml,既可以扩充它,也可以替换它。这必须以编程方式完成。

其次,'require_https'设置没有帮助,因为您不能这样设置证书信息。它确实设置了从http到https的转发,但是它并没有提供一种使https工作的方法,所以转发没有帮助。但是,使用它与下面的东西,这确实使https工作。

首先,您需要提供embeddedServletContainerFactory,如嵌入式Servlet容器支持文档中所述。这些文档是针对Java的,但Groovy看起来几乎是一样的。请注意,我还不能让它识别示例中使用的@value注释,但这是不需要的。对于groovy,只需将其放入一个新的.groovy文件中,并在启动spring引导时将该文件包含在命令行中。

现在,说明说您可以自定义在该代码中创建的TomCatEmbeddedServletContainerFactory类,以便更改web.xml行为,这是正确的,但对于我们的目的来说,了解您还可以使用它来定制Server.xml行为是很重要的。实际上,阅读该类的源代码并将其与嵌入的Tomcat文档进行比较,您会发现这是唯一可以做到这一点的地方。有趣的函数是TomCatEmbeddedServletContainerFactor.AddConnectorCustomizers(),它看起来与Javadocs不太像,但实际上提供了嵌入的Tomcat对象,以便自定义。只需传递您自己的TomcatConnectorCustomizer实现,并在void customize(ConnectorCon)函数中的给定Connector上设置您想要的东西。现在,您可以使用connector做大约10亿件事情,我找不到有用的文档,但这个家伙的个人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将会带着这个实现运行一次。一旦我修复了损坏的密钥库文件(确保使用-storeTypePKCS12调用keytool,而不是其他地方报告的-storePass PKCS12),这就成功了。此外,提供参数(端口、密码等)作为测试的配置设置会更好。如果您能够使用@value注释来使用Groovy,我相信这是可能的。

於炯
2023-03-14

从spring boot 1.2开始,您可以使用application.propertiesapplication.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

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

 类似资料:
  • 问题内容: 我正在尝试设置Spring Security以与Spring Boot的嵌入式Tomcat实例一起使用。有很多基本示例可以执行此操作,但我被困在它们的后面,他们通过HTTP(不是HTTPS)执行基本身份验证。 如果可以访问Tomcat配置文件(),我可能可以使它工作,但是由于Spring Boot使用嵌入式Tomcat实例(否则非常方便),因此我无权访问Tomcat配置文件(至少不能访

  • 我如何创建(和访问)基于SpringMVC服务Web内容的可部署war指南? 感觉这些步骤都成功了,但是当尝试查看页面时,返回了404错误。。。可能我只是试图访问错误的url? 本教程在创建和运行jar时效果非常好,但是当我试图从war访问网页时,它会导致404错误。 第一步。创建一个可部署的war文件 使应用程序类扩展SpringBootServletializer 这将导致打包可执行jar和w

  • null 为了使SSL在客户机和服务器之间工作,我只需要在使用终端命令(Keytool和openssl)生成用于相互身份验证的keystore和truststore的逐步指南中得到帮助。

  • 我的WAR正在使用一个log4j FileAppender,该文件是通过WAR中的目录下的文件配置的。 我已将log4j追加器配置为: 通过此配置,我将尝试实现以下功能: 将记录调试级别和更高级别的所有日志消息(因此所有) 我希望文件位于Tomcat的目录下 这种配置是否实现了这些项,如果没有,需要更改什么?

  • 10.1 配置日志 10.1.1 在配置文件中配置 在application.properties中添加 server.tomcat.accesslog.enabled=true server.tomcat.accesslog.directory=d:/temp/logs 10.2 EmbeddedServletContainerCustomizer接口,通过代码配置tomcat package