在非嵌入式Tomcat上使用SSL运行SpringBoot

时间:2019-12-13 04:33:57

标签: java spring-boot ssl tomcat

我有一个应用程序堆栈,因为我们希望最终过渡到连续交付并在停机时间为0的情况下翻转应用程序,所以我们有一个Tomcat 9 Server。 Tomcat托管了一些应用程序,例如

  • 主要应用
  • 微服务可帮助我们分割一些基础代码,以便于维护和更新(记录中的微服务也使用SpringBoot,作为可部署的WAR)

我还想将Main应用程序部署为WAR,并让Tomcat托管它。我们的应用程序使用ActiveMQ进行消息传递,而我很难确定配置SpringBoot的最佳方法以及该服务的Tomcat 9

在使用嵌入式Tomcat之前,经过一段痛苦的时间生成密钥(一个非常痛苦的过程)之后,我才能够将其简单地添加到应用程序中。

##################################################################################################################
# SPRING SSL PROPERTIES
# Properties related to SSL settings (used by ActiveMQ, potentially also by other secure areas in the application
##################################################################################################################
server.ssl.key-store=classpath:tomcat.jks
server.ssl.key-store-type=JKS
server.ssl.key-store-password=changeit
server.ssl.key-alias=tomcat
server.ssl.key-store-provider=SUN
server.ssl.trust-store=classpath:tomcat.ts
server.ssl.trust-store-type=JKS

由于它在本地运行,并且拥有我的所有文件,因此可以正常工作。现在?我需要类似的配置才能在Tomcat 9上工作,而不是嵌入式Tomcat

试图将密钥移到上方,我试图将Tomcat的server.xml修改为具有以下内容

    <Connector port="8443"
               maxThreads="150"
               scheme="https"
               secure="true"
               SSLEnabled="true"
               keyAlias="tomcat"
               keystoreFile="conf/tomcat.jks"
               keystorePass="changeit"
               keystoreType="JKS"
               clientAuth="false"
               sslProtocol="TLS"/>

但是遗憾的是这不起作用。 stacktrace是“您的证书很烂...”的典型案例:

SEVERE: Could not refresh JMS Connection for destination 'jms/queue/xxx/general' - 
retrying using FixedBackOff{interval=5000, currentAttempts=3, maxAttempts=unlimited}. 
Cause: Could not connect to broker URL: ssl://virtlocal.xxx.com:61617. Reason: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: 
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

我已经看过some answers这个问题,但是他们都说相同的话(当我尝试使用JKS时,他们正在使用p12或p57,是的,这就是很过时了

我将继续四处看看,但我的问题有两个方面

  1. 如何使Tomcat 9能够通过SSL正确侦听服务器
  2. SpringBoot是否需要相同的信息来侦听,还是tomcat 9足够聪明以将其重定向到托管应用程序?

提前感谢大家。如果我自己找出答案,我将更新此问题

更新12/16/2019 经过讨论并弄清楚了一点,如果目的是将主要应用程序和微服务都托管在Tomcat 9服务器上,则似乎不需要在Spring Boot中启用SSL。我们只需简单地应用主机端点和凭据即可。因此,好消息是,我认为我可以忽略application.properties中的SSL设置并将其删除。

但是,现在我正试图在启动时使我的Tomcat正常工作,文档似乎建议您需要对server.xml执行此操作:

    <Connector port="8443" 
           protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" 
               SSLEnabled="true">
        <SSLHostConfig>
            <Certificate certificateKeyAlias="localhost"
                         certificateKeystoreFile="conf/keystore/tomcat.jks"
                         certificateKeystorePassword="changeit"
                         certificateKeystoreType="JKS"
                         type="RSA" />
        </SSLHostConfig>
    </Connector>

使用以下密码生成了我的密钥:

$JAVA_HOME/bin/keytool -genkey -alias localhost -keyalg RSA -keystore tomcat.jks

但是,我遇到了同样的错误,并且不确定如何解决它。这是一个本地环境,因此遵循Tomcat 9 Documentation很有帮助,但是仍然不确定我做错了什么让IntelliJ用我的WAR文件正确启动Tomcat。

1 个答案:

答案 0 :(得分:0)

所以我的答案是执行以下操作以在非嵌入式Tomcat 9上运行Spring Boot应用程序

  1. 通过以下命令生成自签名密钥
sudo $JAVA_HOME/bin/keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 -storetype PKCS12 -validity 3650 -keystore tomcat.p12 -storepass changeit
  1. 我从经纪人处获取了经纪人的证书,然后使用followng命令将其导入到信任库中
sudo $JAVA_HOME/bin/keytool -import -alias broker -keystore tomcat.ts -file broker.crt
  1. 现在我有一个生成的证书和一个信任存储,该存储使Tomcat知道我的代理是可以信任的。下一步是修改我的settings.xml文件,以像这样提供密钥库和信任库的位置和详细信息
    <Connector port="8443" 
           protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" 
               SSLEnabled="true">
        <SSLHostConfig>
            <Certificate
                         truststoreFile="conf/keystore/tomcat.ts"
                         truststorePassword="changeit"
                         truststoreType="JKS"
                         certificateKeyAlias="tomcat"
                         certificateKeystoreFile="conf/keystore/tomcat.p12"
                         certificateKeystorePassword="changeit"
                         certificateKeystoreType="PKCS12" />
        </SSLHostConfig>
    </Connector>
  1. 最近在IntelliJ下为我的Tomcat 9配置添加了以下JAVA_OPS
-Djavax.net.ssl.trustStore=/opt/tomcat/conf/keystore/tomcat.ts
-Djavax.net.ssl.trustStorePassword=changeit

有了这个,我能够在Tomcat 9服务器上本地生成ActiveMQ侦听器,我的SpringBoot应用程序可以向该侦听器发送和接收消息。

您的需求和步骤可能会有所不同,但是希望这可以帮助某个人