0

0

在Spring Boot嵌入式Tomcat中配置GoDaddy SSL证书

碧海醫心

碧海醫心

发布时间:2025-08-29 15:52:19

|

1069人浏览过

|

来源于php中文网

原创

在Spring Boot嵌入式Tomcat中配置GoDaddy SSL证书

本教程详细指导如何在Spring Boot应用中集成GoDaddy SSL证书,实现HTTPS安全通信。内容涵盖使用OpenSSL生成私钥和CSR、获取GoDaddy证书、将证书转换为PKCS12格式,以及在Spring Boot嵌入式Tomcat中配置SSL连接器和强制HTTPS重定向。教程强调了现代Java环境中使用PKCS12格式的优势,并提供了清晰的代码示例和最佳实践建议。

引言

在现代web应用开发中,确保数据传输的安全性至关重要。spring boot应用通常使用嵌入式tomcat服务器,而配置ssl/tls是实现https安全通信的关键一步。本教程将详细介绍如何利用godaddy颁发的ssl证书,在spring boot嵌入式tomcat环境中进行配置,从证书的生成、转换到最终的应用集成,提供一套完整的实践指南。

SSL证书准备:从GoDaddy到PKCS12

配置HTTPS的第一步是准备好SSL证书文件。GoDaddy通常提供PEM格式的证书。为了在Java环境中使用,我们通常需要将其转换为Java KeyStore (JKS) 或 PKCS12 格式。现代Java版本更推荐使用PKCS12格式。

1. 生成私钥和证书签名请求 (CSR)

首先,使用OpenSSL工具生成私钥(.key文件)和证书签名请求(.csr文件)。CSR是向证书颁发机构(CA,如GoDaddy)申请SSL证书的必要文件。

openssl req -new -newkey rsa:2048 -nodes -keyout website_name_here.key -out website_name_here.csr

执行此命令后,系统会提示您输入一系列信息,用于生成CSR。请确保“Common Name (e.g. server FQDN or YOUR name)”字段填写您的域名,例如 website_name_here.co。

生成的文件:

  • website_name_here.key: 您的私钥文件。请务必妥善保管,切勿泄露。
  • website_name_here.csr: 证书签名请求文件。

2. 获取GoDaddy SSL证书

将生成的 website_name_here.csr 文件提交给GoDaddy。GoDaddy验证您的域名所有权后,会颁发SSL证书。您通常会收到一个包含多个文件的压缩包,其中可能包括:

  • 您的服务器证书(例如 your_domain.crt 或 gd_bundle-g2-g1.crt 中的第一个证书)。
  • 中间证书链(例如 gd_bundle-g2-g1.crt)。
  • 根证书(通常包含在中间证书链文件中)。

请确保将这些文件下载并解压到您的工作目录。通常,GoDaddy提供的证书是PEM格式。

3. 关键步骤:转换为PKCS12格式

这是将OpenSSL生成的私钥和GoDaddy颁发的证书合并为Java可识别的密钥库格式的关键一步。PKCS12(.p12)是一种行业标准格式,现代Java版本(Java 8u60及更高版本,以及Java 9+)默认支持并推荐使用。

openssl pkcs12 -export -in your_server_certificate.crt -inkey website_name_here.key -out website_name_here.p12 -name website_name_here.co -CAfile gd_bundle-g2-g1.crt -caname root

参数说明:

  • -in your_server_certificate.crt: 您的服务器证书文件。如果GoDaddy提供的是一个包含服务器证书和中间证书的bundle文件,您可能需要将其拆分或确保此文件包含您的服务器证书。通常GoDaddy会提供一个单独的域名证书文件,以及一个包含中间证书和根证书的bundle文件。
  • -inkey website_name_here.key: 步骤1中生成的私钥文件。
  • -out website_name_here.p12: 将要生成的PKCS12密钥库文件。
  • -name website_name_here.co: 证书的别名(alias),在Spring Boot配置中会用到。这里使用您的域名作为别名。
  • -CAfile gd_bundle-g2-g1.crt: GoDaddy提供的中间证书链文件。这个文件通常包含多个证书,用于构建信任链。
  • -caname root: (可选)为CA证书链指定一个别名。

执行此命令时,系统会提示您设置一个导出密码(Export Password)。此密码将用于保护 website_name_here.p12 文件,并在Spring Boot配置中引用。

4. (可选/不推荐)转换为JKS格式的注意事项

在Java 8u60之前的版本中,JKS(Java KeyStore)是Java的默认密钥库格式。虽然您可以使用 keytool 将PKCS12文件进一步转换为JKS格式,但对于现代Java应用,这通常是不必要的,并且不推荐。

知识画家
知识画家

AI交互知识生成引擎,一句话生成知识视频、动画和应用

下载
# 仅当您需要JKS格式时才执行此步骤,但强烈建议直接使用PKCS12
keytool -importkeystore -deststorepass pwd_here -destkeystore website_name_here.jks -srckeystore website_name_here.p12 -srcstoretype PKCS12

重要提示:

  • Java 9及更高版本默认创建和使用PKCS12格式的密钥库。
  • Java 8u60及更高版本可以直接读取PKCS12格式的密钥库。
  • JKS格式是Oracle的专有格式,而PKCS12是行业标准。使用PKCS12可以提高兼容性和安全性。

因此,建议直接在Spring Boot中使用 .p12 文件,避免额外的转换步骤。

Spring Boot嵌入式Tomcat配置

在Spring Boot应用中配置SSL,主要是通过自定义 TomcatServletWebServerFactory 来实现。这允许我们配置Tomcat连接器,指向我们准备好的密钥库文件。

1. 自定义WebServerFactory

创建一个实现 WebServerFactoryCustomizer 接口的组件,用于自定义Tomcat服务器的配置。

import lombok.SneakyThrows;
import org.apache.catalina.connector.Connector;
import org.apache.coyote.http11.Http11NioProtocol;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.stereotype.Component;

import java.net.InetAddress;
import java.util.Optional;

@Component
public class TomcatEmbedServerCustomConfiguration implements WebServerFactoryCustomizer {

    private static final Logger logger = LoggerFactory.getLogger(TomcatEmbedServerCustomConfiguration.class);

    // 假设这些是您的配置存储库,实际项目中应从配置文件或环境变量获取
    // IWebApplicationServerSettingsRepository appSettinsRepository;
    // ApplicationHttpsSettingsEntityRepository applicationHttpsSettingsEntityRepository;

    // public TomcatEmbedServerCustomConfiguration(IWebApplicationServerSettingsRepository appSettinsRepository, ApplicationHttpsSettingsEntityRepository applicationHttpsSettingsEntityRepository) {
    //     this.appSettinsRepository = appSettinsRepository;
    //     this.applicationHttpsSettingsEntityRepository = applicationHttpsSettingsEntityRepository;
    // }

    @SneakyThrows
    @Override
    public void customize(TomcatServletWebServerFactory factory) {
        logger.info("Setting the Tomcat specific configurations. started");
        try {
            // 假设从配置或数据库获取端口和地址
            // Optional serverSettingEntity = appSettinsRepository.findById(1);
            // if (serverSettingEntity.isPresent()) {
            //     factory.setPort(serverSettingEntity.get().getPort().getPORT());
            //     factory.setAddress(InetAddress.getByName(serverSettingEntity.get().getHost()));
            // }
            // 示例:设置默认HTTP端口和地址
            factory.setPort(8080); // 默认HTTP端口
            factory.setAddress(InetAddress.getByName("0.0.0.0")); // 默认监听所有接口

            factory.setServerHeader("Server header of tomcat");

            // HTTPS Settings - Begin
            // 假设从配置或数据库获取HTTPS设置
            boolean useHttps = true; // 示例:启用HTTPS
            String keyStorePath = "file:///c:/trash/website_name_here.p12"; // 指向您的PKCS12文件路径
            String keyStorePassword = "pwd_here"; // PKCS12文件的密码
            String keyAlias = "website_name_here.co"; // 证书别名,与openssl pkcs12 -name 参数一致
            int httpsPort = 8443; // HTTPS端口

            if (useHttps) {
                logger.info("Setting HTTPS settings....");
                factory.addAdditionalTomcatConnectors(createSslConnector(keyStorePath, keyStorePassword, keyAlias, httpsPort));
                factory.addContextCustomizers(context -> {
                    logger.info("Setting HTTPS settings....setting...");
                    SecurityConstraint securityConstraint = new SecurityConstraint();
                    securityConstraint.setUserConstraint("CONFIDENTIAL");
                    SecurityCollection collection = new SecurityCollection();
                    collection.addPattern("/*");
                    securityConstraint.addCollection(collection);
                    context.addConstraint(securityConstraint);
                    logger.info("Setting HTTPS settings....setting...Done");
                });
            }
            logger.info("Setting HTTPS settings....End");
            // HTTPS Settings - end

            logger.info("Tomcat Server Configuration Host=[" + factory.getAddress() + "] Port=[" + factory.getPort() + "]");
            logger.info("Setting the Tomcat specific configurations. ended");
        } catch (Exception e) {
            logger.error(e.getMessage());
            throw e;
        }
    }

    // HTTPS Settings - Begin
    private Connector createSslConnector(String keyStorePath, String keyStorePassword, String keyAlias, int httpsPort) {
        logger.info("Creating SSL Connector...");

        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

        connector.setScheme("https");
        connector.setSecure(true);
        connector.setPort(httpsPort); // 设置HTTPS端口
        protocol.setSSLEnabled(true);

        protocol.setKeystoreFile(keyStorePath); // 指定PKCS12文件路径
        protocol.setKeystorePass(keyStorePassword); // PKCS12文件密码
        protocol.setKeyAlias(keyAlias); // 证书别名

        logger.info("Creating SSL Connector...Done");
        return connector;
    }
    // HTTPS Settings - End
}

在上述代码中,createSslConnector 方法负责创建并配置一个SSL连接器。关键配置项包括:

  • protocol.setKeystoreFile(): 指定PKCS12密钥库文件的路径。请确保路径正确,可以是绝对路径或类路径下的相对路径。
  • protocol.setKeystorePass(): 指定PKCS12文件的密码,即您在 openssl pkcs12 -export 命令中设置的导出密码。
  • protocol.setKeyAlias(): 指定证书的别名,与您在 openssl pkcs12 -export 命令中 -name 参数设置的值一致。

2. HTTP到HTTPS重定向 (可选)

为了确保所有流量都通过HTTPS进行,您可以配置Tomcat将所有HTTP请求重定向到HTTPS。这可以通过添加一个 SecurityConstraint 来实现。

import org.apache.catalina.Context;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SecurityConfig {
    @Bean
    public TomcatServletWebServerFactory httpsRedirectConfig() {
        return new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL"); // 要求使用保密传输(即HTTPS)
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*"); // 匹配所有URL
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
    }
}

这个配置会在Tomcat启动时,为所有请求添加一个安全约束,强制使用HTTPS。当HTTP请求到达时,Tomcat会自动将其重定向到相应的HTTPS端口。

注意事项与最佳实践

  • 密钥库安全:私钥文件(.key)和PKCS12密钥库文件(.p12)包含敏感信息,必须严格保护。不要将其提交到版本控制系统,或以不安全的方式存储。在生产环境中,应使用环境变量、Vault等安全机制来管理密钥库密码。
  • 证书链完整性:确保您的PKCS12文件包含了完整的证书链(服务器证书、中间证书、根证书)。如果缺少中间证书,客户端可能会报告证书不信任的错误。openssl pkcs12 -export 命令的 -CAfile 参数就是用于包含中间证书链的。
  • 别名一致性:在 openssl pkcs12 -export 中使用的 -name 参数(证书别名)必须与Spring Boot配置中 protocol.setKeyAlias() 的值完全一致。
  • 路径正确性:protocol.setKeystoreFile() 中指定的路径必须是Tomcat进程可以访问到的有效路径。
  • 自动续期:SSL证书通常有有效期,需要定期续期。考虑使用自动化工具或流程来管理证书的续期和部署,以避免因证书过期导致的服务中断。
  • 生产环境配置:在生产环境中,通常会将密钥库文件放置在应用外部的安全位置,并通过配置属性(如 application.properties 或 application.yml)或环境变量来引用其路径和密码,而不是硬编码在代码中。

总结

通过遵循本教程的步骤,您应该能够在Spring Boot嵌入式Tomcat服务器中成功配置GoDaddy SSL证书,实现安全的HTTPS通信。关键在于正确使用OpenSSL生成和转换证书,并将其整合到Spring Boot的Tomcat配置中。请始终牢记安全最佳实践,以确保您的Web应用在生产环境中安全可靠地运行。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
如何配置Tomcat环境变量
如何配置Tomcat环境变量

配置Tomcat环境变量需要在系统中添加CATALINA_HOME变量,并将Tomcat的安装路径添加到PATH变量中。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

114

2023.10.26

idea如何集成Tomcat
idea如何集成Tomcat

idea集成Tomcat的步骤:1、添加Tomcat服务器配置;2、配置项目部署;3、运行Tomcat服务器;4、访问项目;5、注意事项;6、关闭Tomcat服务器。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

169

2024.02.23

怎么查看Tomcat源代码
怎么查看Tomcat源代码

查看Tomcat源代码的步骤:1、下载Tomcat源代码;2、在IDEA中导入Tomcat源代码;3、查看源代码;4、理解Tomcat的工作原理;5、参与社区和贡献;6、注意事项;7、持续学习和更新;8、使用工具和插件。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

98

2024.02.23

常见的tomcat漏洞有哪些
常见的tomcat漏洞有哪些

常见的tomcat漏洞有:1、跨站脚本攻击;2、跨站请求伪造;3、目录遍历漏洞;4、缓冲区溢出漏洞;5、配置漏洞;6、第三方组件漏洞。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

164

2024.02.23

tomcat日志乱码怎么解决
tomcat日志乱码怎么解决

tomcat日志乱码的解决办法:1、修改tomcat的日志编码设置;2、检查ide的编码设置;3、检查操作系统的编码设置;4、使用过滤器处理日志;5、检查外部系统的编码设置;6、检查文件编码方式等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

151

2024.02.23

weblogic和tomcat有哪些区别
weblogic和tomcat有哪些区别

weblogic和tomcat的区别:1、功能;2、性能;3、规模;4、价格;5、安全性;6、配置和管理;7、社区支持;8、集成能力;9、升级和更新;10、可靠性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

198

2024.02.23

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

234

2024.02.23

tomcat启动闪退怎么解决
tomcat启动闪退怎么解决

tomcat启动闪退的解决办法:1、检查java环境;2、检查环境变量配置;3、检查端口被占用;4、检查配置文件编码;5、检查启动时需要的配置文件;6、检查相关文件是否丢失;7、检查防火墙和杀毒软件设置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

161

2024.02.23

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

8

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
SQL 教程
SQL 教程

共61课时 | 3.6万人学习

Java 教程
Java 教程

共578课时 | 53.5万人学习

oracle知识库
oracle知识库

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号