当前位置: 首页 > 面试题库 >

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

司宏伯
2023-03-14
问题内容

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

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

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

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


问题答案:

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

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

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

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

现在,指令说明您可以自定义TomcatEmbeddedServletContainerFactory在该代码中创建的类,以便可以更改web.xml行为,这是正确的,但是出于我们的目的,重要的是要知道您也可以使用它来调整server.xml行为。实际上,阅读该类的源代码并将其与Embedded
Tomcat文档进行比较,您会发现这是唯一的实现方式。有趣的功能是TomcatEmbeddedServletContainerFactory.addConnectorCustomizers(),从Javadocs看来可能并不多,但实际上为您提供了嵌入式Tomcat对象以自定义您自己。只需传递您自己的实现,TomcatConnectorCustomizer然后Connectorvoid customize(Connector con)函数中的给定值上设置所需的内容。现在,您可以使用十亿左右的内容,但Connector我找不到有用的文档,但是createConnector()这个家伙在Spring嵌入式的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;
}
}

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



 类似资料:
  • 我正在尝试设置spring安全,以便与spring boot的嵌入式Tomcat实例一起工作。有相当多的基本示例可以执行此操作,但我仍然停留在它们离开的地方--它们通过HTTP(而不是HTTPS)执行基本身份验证。 如果我有权访问Tomcat配置文件()的话,我可能会让它正常工作,但由于spring boot使用嵌入式Tomcat实例(这在其他方面非常方便),所以我没有访问Tomcat配置文件的权

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

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

  • 我在密钥库中有一个客户端证书,在信任库中有服务器的公共证书。 http-bio-8080-exec-10,处理异常:javax.net.ssl.sslhandShakeException:sun.security.validator.validatoreXception:PKIX路径构建失败:sun.security.provider.certpath.suncertPathBuilderExce

  • 我在带有java 1.6的服务器上有一个与tomcat一起运行的war文件。我需要更新服务器上的java版本并让war文件使用java 1.7。当我重新启动tomcat时,这会自动发生吗,还是需要重新编译war文件? 我试图在我们的生产环境(1.7)中重现一个在我们的QA环境(1.6)中没有发生的错误。如果有兴趣,这里有个问题。

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

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