Springboot部署ssl证书开启https安全数据加密传输

更新中...

一、证书准备

关于证书的获取,你可以:
a. 使用jdk自带的证书生成工具keytool
b. 使用openssl工具生成。
c. 到云平台申请CA认证的ssl证书(推荐)。

1-1、通过云平台申请免费SSL证书

以腾讯云为例。

  1. 进入腾讯云官网;点击右上角进入控制台

  2. 鼠标移动到左上角的云产品,在输入框中输入ssl,点击进入SSL证书页面;

  3. SSL证书页面点击立即购买,进入购买页面。

  4. 选择域名型免费版(DV),点击下面的0元 免费快速申请

  5. 提交资料:填写证书信息,至少需要填写绑定的域名邮箱,其他的选填,然后点击下一步;

  6. 验证方式:默认即可,会给你自动添加解析,直接点击下一步;

  7. 域名验证:CA会拿你的证书请求进行认证,需要等一会,大概10几分钟左右。

  8. 当CA机构签发后,我们可以在我的证书进行查看。

后续就可以拿申请到的证书进行部署了,腾讯云有自动部署服务,但是收费,所以我们需要下载下来,手动部署。

1-2、使用JDK的keytool生成证书

更新中...

1-3、使用OpenSSL工具生成证书

更新中...

二、配置证书

2-2、使用云平台申请的证书部署

先将云平台申请的证书下载下来,里面包含·Nginx·Tomcat·Apache·SSL的证书。

使用SSL证书进行部署

  1. 将SSL/***.pfx文件放到资源文件夹src/main/resources/下;
    比如我使用的是src/main/resources/langkye.cn.pfx

  2. 编写application.yml配置文件;
    其他的不变,主要添加如下配置:

    server: 
      port: 8095         #https端口
      httpPort: 8059     #http端口
      ssl: 
        key-store: classpath:langkye.cn.pfx  #证书路径,可以填写相对路径,也可以填写绝对路径
        key-store-password: langkye.cn       #证书密钥,填写你申请时填写的密钥,如果没有填写,会生成一个随机密钥保存在·keystorePass.txt·文件中,和pfx文件在同一目录中
        keyStoreType: PKCS12                 #密钥类型
        enabled: true                        #开启ssl支持(默认true)
    
  3. 新建一个java配置类SslConfig.java

    import com.alibaba.fastjson.JSONObject;
    import com.usrp.bpm.engine.BpmTest;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.web.servlet.ServletComponentScan;
    import org.springframework.context.ConfigurableApplicationContext;
    import org.springframework.context.annotation.ImportResource;
    import  com.alibaba.druid.pool.DruidDataSource;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.Properties;
    
    /**
     * @author langkye
     */
    @Configuration
    public class SslConfig {
    
        @Value("${server.httpPort}")
        Integer httpPort;
    
        @Value("${server.port}")
        Integer httpsPort;
    
        @Bean
        public ServletWebServerFactory servletContainer() {
            TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
                @Override
                protected void postProcessContext(Context context) {
                    SecurityConstraint constraint = new SecurityConstraint();
                    constraint.setUserConstraint("CONFIDENTIAL");
                    SecurityCollection collection = new SecurityCollection();
                    collection.addPattern("/*");
                    constraint.addCollection(collection);
                    context.addConstraint(constraint);
                }
            };
            tomcat.addAdditionalTomcatConnectors(createHTTPConnector());
            return tomcat;
        }
    
        private Connector createHTTPConnector() {
            Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
            connector.setProperty("relaxedQueryChars", "[]{}");
            connector.setScheme("http");
            connector.setSecure(false);
            // http 端口
            connector.setPort(httpPort);
            // https端口
            connector.setRedirectPort(httpsPort);
            return connector;
        }
    }
    
  4. 为了直观,在启动类中编写一个controller。

    /**
     * @author langkye
     */
    @SpringBootApplication
    @RestController
    @RequestMapping("/")
    public class  Application{
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    
        @GetMapping("/index")
        public Object index(){
            final Properties ps = System.getProperties();
            final JSONObject result = new JSONObject();
            //系统名称
            result.put("os.name",ps.getProperty("os.name"));
            //系统架构
            result.put("os.arch",ps.getProperty("os.arch"));
            //系统版本
            result.put("os.version",ps.getProperty("os.version"));
            //当前登陆用户:用户主目录
            result.put("user.home",ps.getProperty("user.home"));
            //当前登陆用户:用户名
            result.put("user.name",ps.getProperty("user.name"));
            //当前登陆用户:语言
            result.put("user.language",ps.getProperty("user.language"));
    
            //Java版本
            result.put("java.version",ps.getProperty("java.version"));
            //Java安装目录
            result.put("java.home",ps.getProperty("java.home"));
            //Java运行时名称
            result.put("java.runtime.name",ps.getProperty("java.runtime.name"));
            //项目根目录对绝对路径
            result.put("user.dir",ps.getProperty("user.dir"));
            //运行时Java版本
            result.put("java.runtime.version",ps.getProperty("java.runtime.version"));
            //系统文件分隔符
            result.put("file.separator",ps.getProperty("file.separator"));
    
            return result;
        }
    }
    
  5. 测试
    启动项目后,在控制台可以看到,已经成功初始化了80958059两个端口

    访问https://localhost:8095/index,由于localhost和证书的域名不匹配所以会警告,但是不难看出已经可以使用https进行传输数据了。

三、部署到服务器

  • 极速体验
    接下来就简单了,你只要在你的服务器中运行这个项目,通过域名如(https://www.langkye.cn:8095/index)来访问,一切都OK了~。

    1. 将你的项目打包,这里直接打jar包(ssl_deploy.1.0.0.jar)。
    2. 使用你熟悉的工具将jar包上传到服务器。
       比如:scp /Users/langkye/Development/Personal/ssl_deploy/target/ssl_deploy.1.0.0.jar root@www.langkye.cn:~/
    3. 在你的服务器中运行它。
       比如:nohup java -jar ssl_deploy.1.0.0.jar >info.log 2>&1 &
    
    4. 访问 https://www.langkye.cn:8095/index
    

3-1、项目打包

更新中...

3-2、上传项目打包文件到服务器

更新中...

3-3、基础环境搭建

更新中...

3-4、运行项目

更新中...

posted @ 2021-03-25 15:35  LANGKYE#  阅读(624)  评论(0编辑  收藏  举报