springboot 启动https安全及证书生成

需要的网站
  1. jks 证书生成网站 https://www.myssl.cn/tools/merge-jks-cert.html
项目配置

在application.properties中增加如下配置


server.ssl.enabled=true
server.ssl.key-alias=openapi
server.ssl.key-store=classpath:server2020-2022.jks
server.ssl.key-store-password=juneyao123
server.ssl.key-password=juneyao123

重点是将jks文件放到classpath下或其他可找到的位置

测试用例
package org.journey.zuul;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.*;
import java.security.cert.CertificateException;

public class JKSTesting {
    public static PublicKey getPublicKey(String keyStoreFile,
                                         String storeFilePass, String keyAlias) {

        // 读取密钥是所要用到的工具类
        KeyStore ks;

        // 公钥类所对应的类
        PublicKey pubkey = null;
        try {

            // 得到实例对象
            ks = KeyStore.getInstance("JKS");
            FileInputStream fin;
            try {

                // 读取JKS文件
                fin = new FileInputStream(keyStoreFile);
                try {
                    // 读取公钥
                    ks.load(fin, storeFilePass.toCharArray());
                    java.security.cert.Certificate cert = ks
                            .getCertificate(keyAlias);
                    pubkey = cert.getPublicKey();
                } catch (NoSuchAlgorithmException | CertificateException | IOException e) {
                    e.printStackTrace();
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        } catch (KeyStoreException e) {
            e.printStackTrace();
        } catch (NullPointerException e){
            System.out.println("无公钥");
        }
        return pubkey;
    }

    /**
     * 得到私钥
     *
     * @param keyStoreFile  私钥文件
     * @param storeFilePass 私钥文件的密码
     * @param keyAlias      别名
     * @param keyAliasPass  密码
     * @return
     */
    public static PrivateKey getPrivateKey(String keyStoreFile,
                                           String storeFilePass, String keyAlias, String keyAliasPass) {
        KeyStore ks;
        PrivateKey prikey = null;
        try {
            ks = KeyStore.getInstance("JKS");
            FileInputStream fin;
            try {
                fin = new FileInputStream(keyStoreFile);
                try {
                    try {
                        ks.load(fin, storeFilePass.toCharArray());
                        // 先打开文件
                        prikey = (PrivateKey) ks.getKey(keyAlias, keyAliasPass
                                .toCharArray());
                        // 通过别名和密码得到私钥
                    } catch (UnrecoverableKeyException | CertificateException | IOException e) {
                        e.printStackTrace();
                    }
                } catch (NoSuchAlgorithmException e) {
                    e.printStackTrace();
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        } catch (KeyStoreException e) {
            e.printStackTrace();
        }catch (NullPointerException e){
            System.out.println("无私钥");
        }
        return prikey;
    }

    public static void main(String[] args) {
        PublicKey publicKey;
        PrivateKey privateKey;

        publicKey = getPublicKey("D:\\ws-idea\\vNextOrderPlatform\\horder-gateway-common\\src\\test\\resources\\ssl.jks", "juneyao123", "openapi");
        System.out.println(publicKey.toString());
        privateKey = getPrivateKey("D:\\ws-idea\\vNextOrderPlatform\\horder-gateway-common\\src\\test\\resources\\ssl.jks", "juneyao123", "openapi", "juneyao123");
        System.out.println(privateKey.toString());
    }
}

http https共存
增加配置
http.port=9033
启动类增加注释部分

package com.aliyun.horder;

import org.apache.catalina.connector.Connector;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

import com.ctrip.framework.apollo.spring.annotation.EnableApolloConfig;
import org.springframework.context.annotation.Bean;

/**
 * 提供网关服务,可映射服务和权限控制。对外提供接口必须通过网关服务
 *
 * @author jx-air
 * @version 1.0
 * @date 2020年6月5日 上午11:18:30
 */
@EnableZuulProxy
@EnableApolloConfig
@SpringCloudApplication
public class GatewayApplication {

//    @Value("${http.port:19031}")
//    private Integer port;
//
//
//    @Bean
//    public ServletWebServerFactory servletContainer() {
//        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
//        tomcat.addAdditionalTomcatConnectors(createStandardConnector());
//        return tomcat;
//    }
//
//    private Connector createStandardConnector() {
//        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
//        connector.setPort(port);
//        return connector;
//    }

    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }

}

### 如何在Spring Boot中配置Tomcat以支持HTTPS证书 要在Spring Boot应用程序中配置嵌入式Tomcat服务器以支持HTTPS协议并加载SSL/TLS证书,可以按照以下方法实现。 #### 1. 准备Java KeyStore (JKS) 文件 为了使Spring Boot中的嵌入式Tom猫能够处理HTTPS请求,需要准备一个包含私钥和公钥的Java密钥库文件(通常扩展名为`.jks`)。可以通过命令行工具如Keytool来创建此文件[^1]: ```bash keytool -genkeypair -alias myapp -keyalg RSA -keystore tomcat.keystore -storepass changeit -validity 365 ``` 上述命令会生成一个新的密钥对,并将其保存到指定路径下的 `tomcat.keystore` 中。注意替换默认密码 (`changeit`) 和其他参数以匹配实际需求。 #### 2. 配置application.properties 或 application.yml 接下来,在项目的资源目录下编辑 `application.properties` 或者 YAML 格式的配置文件,添加必要的属性以便启用 HTTPS 并指向 JKS 文件位置以及相应的密码[^3]: 对于 `.properties` 文件: ```properties server.port=8443 server.ssl.key-store=D:/developTools/apache-tomcat-idm/tomcat.keystore server.ssl.key-store-password=1111111 server.ssl.key-alias=myapp ``` 如果是采用YAML格式,则应如下所示设置: ```yaml server: port: 8443 ssl: key-store: D:/developTools/apache-tomcat-idm/tomcat.keystore key-store-password: '111111' key-alias: myapp ``` 这里定义的服务端口为标准的安全HTTP端口号(8443),同时指定了之前创建好的密钥仓库及其访问凭证。 #### 3. 启动失败排查指南 如果启动过程中遇到错误提示类似于下面这样的堆栈跟踪信息时, ```plaintext Caused by: java.io.IOException: Keystore was tampered with, or password was incorrect... at org.apache.tomcat.util.net.SSLUtilBase.getStore(SSLUtilBase.java:217)... ... at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:197)[spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE] ``` 这表明要么是提供的Keystore Path不正确,或者输入了错误的密码[^2]。因此需仔细核验这些细节是否无误。 #### 4. 整合身份认证机制 当已经成功设置了基于TLS/SSL保护的数据传输之后,还可以进一步增强安全性通过集成Spring Security框架来进行用户的身份验证与授权控制。其中核心组件之一便是AuthenticationManager接口,它负责执行具体的登录逻辑校验工作流程[^4]^。 另外值得注意的是,在不同场景下可以选择适合自己的多种认证方式比如表单提交、基本Authentications等等[^5]。 --- ### 示例代码片段展示如何自定义SecurityConfig类 以下是关于如何编写一个简单的Spring Security配置例子用于演示目的: ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.requiresChannel().anyRequest().requiresSecure(); //强制所有的请求都走https http.authorizeRequests() .antMatchers("/login").permitAll()//允许所有人访问登陆页面 .anyRequest().authenticated();//其余所有URL必须经过验证才能访问 http.formLogin().and().httpBasic(); } } ``` 以上展示了怎样利用HttpSecurity对象去规定哪些API应该被加密连接所覆盖,并且还包含了基础形式的身份确认选项。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值