spring boot启动使用https(支持证书生成和同时支持http和https,使用keytool生成证书)

时间:2025-02-14 19:33:44

1.存在证书使用https

打开配置文件,添加server相关的ssl配置,如下代码:

server:
  port: 8080
  ssl:
    key-store: classpath:  #证书地址,可以是相对地址也可以是绝对地址
    key-alias: tomcat    # 生成证书时设置的别名
    enabled: true       #是否开启ssl
    key-store-password: 123456     # 生成证书时设置的密码

此时启动项目就可以使用https访问了,这时是不能使用http访问的

和https同时支持

在配置中定义一个http的端口配置

server:
  port: 8080
  httpPort: 8088   #自定义参数为http端口
  ssl:
    key-store: classpath:  #证书地址,可以是相对地址也可以是绝对地址
    key-alias: tomcat    # 生成证书时设置的别名
    enabled: true       #是否开启ssl
    key-store-password: 123456     # 生成证书时设置的密码

新建一个配置类CustomServerConfig,读取作为http端口

@Configuration
public class CustomServerConfig {

    @Value("${}")
    private Integer httpPort;

    /**
     * 创建并配置ServletWebServerFactory,主要用于初始化Tomcat服务器配置。
     *
     * @return ServletWebServerFactory 一个配置了额外Tomcat连接器的TomcatServletWebServerFactory实例。
     */
    public ServletWebServerFactory serverFactory() {
        // 创建TomcatServletWebServerFactory实例
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();

        // 添加额外的Tomcat连接器
        (createStandardConnector());

        return tomcat;
    }
    /**
     * 创建一个标准的Connector实例,用于Tomcat服务器接收HTTP请求。
     *
     * @return Connector 返回配置好的Connector实例,它使用NIO协议监听指定的HTTP端口。
     */
    private Connector createStandardConnector() {
        // 创建一个Http11NioProtocol协议的Connector实例
        Connector connector = new Connector(".http11.Http11NioProtocol");
        // 设置Connector监听的端口号
        (httpPort);
        return connector;
    }
}

3.使用keytool命令行工具生成一个自签名的证书

keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 -validity 365 -keystore  -keypass changeit -storepass changeit -dname "CN=YourServerName, OU=YourOrganizationalUnit, O=YourOrganization, L=City, ST=State, C=Country"

使用keytool命令生成密钥对的命令行指令,主要用于为Tomcat或其他Java应用服务器创建SSL证书。命令各部分的详细解释:
keytool: 这是Java开发工具包(JDK)中自带的一个命令行工具,用于管理密钥和证书库,包括生成、管理、导入、导出密钥和证书。
-genkeypair: 表示要生成一个新的密钥对(公钥和私钥)。
-alias tomcat: 指定密钥库中的别名,这里是tomcat。别名用于在密钥库中唯一标识这个密钥对。
-keyalg RSA: 指定密钥对的算法为RSA,这是一种常用的非对称加密算法,广泛应用于数字签名和密钥交换。
-keysize 2048: 设置RSA密钥的长度为2048位,这是安全性和性能之间的一个常见平衡点。更高的密钥长度提供更强的安全性,但也会增加计算开销。
-validity 365: 指定生成的证书有效期为365天(一年)。这意味着证书从生成之日起一年内有效。
-keystore : 指定密钥库文件名为,这是存储密钥对的文件。如果文件不存在,keytool会创建它;如果存在,则可能根据操作提示进行覆盖或追加操作。
-keypass changeit: 设置私钥的密码为changeit。这是一个示例密码,实际使用时应设置为更安全的密码。
-storepass changeit: 设置密钥库的密码也为changeit。与私钥密码一样,强烈建议使用更复杂的密码以增强安全性。
-dname "CN=YourServerName, OU=YourOrganizationalUnit, O=YourOrganization, L=City, ST=State, C=Country": 指定证书的主体DN(Distinguished Name),包括:
CN (Common Name): 服务器的主机名或完全限定域名,例如YourServerName。
OU (Organizational Unit): 组织单位名称,如YourOrganizationalUnit。
O (Organization): 组织名称,如YourOrganization。
L (Locality): 城市或地区名称,如City。
ST (State or Province): 州或省份名称,如State。
C (Country): 国家代码,如Country,通常使用ISO 3166-1 alpha-2代码。
综上所述,此命令用于生成一个2048位的RSA密钥对,并将其存储在名为的密钥库文件中,用于配置Tomcat服务器的SSL加密连接。生成的证书信息包含了指定的组织和个人详细信息,并设置了一年的有效期。

 4.导出公钥证书

keytool -exportcert -alias tomcat -file  -keystore  -storepass changeit

该脚本是另一个使用keytool命令的指令,用于从现有的密钥库中导出证书。具体参数含义如下:
keytool: 同样是Java开发工具包(JDK)提供的密钥和证书管理工具。
-exportcert: 表示该操作是为了导出证书。
-alias tomcat: 指定要导出证书的别名,这里依然是tomcat。确保这个别名与之前生成或导入到密钥库中的密钥对别名一致。
-file : 指定导出的证书文件名为。这将是一个包含公钥信息的X.509格式证书文件,可用于分享给客户端或其他需要验证服务端身份的实体。
-keystore : 指定密钥库的路径和文件名,这里是。这个密钥库包含了我们要导出证书的私钥和公钥对。
-storepass changeit: 提供访问上述密钥库所需的密码。在这个例子中,密码仍然是changeit。请确保使用正确的密码,否则无法访问密钥库并导出证书。
总结来说,这条命令的作用是从名为的密钥库中,提取别名为tomcat的证书,并将其导出为名为的文件。这对于需要将证书部署到Web服务器、分享给信任方或进行其他SSL/TLS配置的场景非常有用。同样地,示例中的密码changeit应该被替换为实际设置的密钥库密码,以确保安全。

5.将证书导入到java中,java程序就可以无改动访问当前证书的https服务 

keytool -import -trustcacerts -file  -alias tomcat -keystore "%JAVA_HOME%\jre\lib\security\cacerts" -storepass changeit

这个脚本使用keytool命令来导入一个证书到Java的受信任的根证书颁发机构(CA)列表中。以下是各参数的解释:
keytool: 仍然是Java的命令行工具,用于处理密钥和证书。
-import: 指定要执行的操作是导入证书到密钥库。
-trustcacerts: 标志表示导入的证书应该被视为可信任的CA证书。这通常用于导入根CA证书,以便系统能够信任由这些CA签署的其他证书。
-file : 指定要导入的证书文件,这里是。这个文件通常包含了一个公钥证书,可能是之前通过-exportcert命令导出的。
-alias tomcat: 为导入的证书指定一个别名,便于在密钥库中引用。别名必须是唯一的。
-keystore "%JAVA_HOME%\jre\lib\security\cacerts": 指定要导入证书的目标密钥库,这里是Java的标准信任库,位于%JAVA_HOME%\jre\lib\security\cacerts路径下。%JAVA_HOME%是一个环境变量,通常指向Java安装目录。
-storepass changeit: 提供访问目标密钥库的密码。在这个例子中,密码是changeit。这应该与cacerts文件的默认密码相符。如果之前修改过密码,需要使用更新后的密码。
这个命令的目的是将中的证书添加到Java的信任证书存储,使得Java运行时环境能够信任由该证书签署的其他证书。这对于配置服务器环境,特别是SSL/TLS连接的信任链认证是必要的。请注意,changeit密码是标准的示例密码,实际使用时应确保使用正确的密钥库密码。