zoukankan      html  css  js  c++  java
  • 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、运行项目

    更新中...

  • 相关阅读:
    Python与Hack之window下运行带参数的Python脚本,实现一个简单的端口扫描器
    Python与Hack之守护进程
    Python与Hack之Zip文件口令破解
    Mysql远程连接,并解决wordp主题添加问题
    基于PHP以及Mysql,使用WordPress搭建站点
    AngularJS学习之输入验证
    微信公众平台搭建
    innobackupex: fatal error: no ‘innodb_buffer_pool_filename’解决方法
    Python多线程
    tpcc
  • 原文地址:https://www.cnblogs.com/langkyeSir/p/14576819.html
Copyright © 2011-2022 走看看