zoukankan      html  css  js  c++  java
  • 自制Https证书并在Spring Boot和Nginx中使用

    白话Https一文中, 介绍了Https存在的目的和工作原理,但多是偏向于原理性的介绍,本文介绍如何一步一步自制一个能够通过浏览器认证的Https证书,并讲解在Spring Boot环境和Nginx环境中服务器端的配置。

    如果你还没有读过白话Https,我强烈建议你先去读一下。按照白话Https中的介绍,Https协议涉及到的主体主要有三个:客户端、服务端、以及CA机构。如下图所示:

    Https Role

    在白话Https一文中,曾介绍一个服务要申请使用Https的流程。本文所介绍的流程,针对自制Https证书,更多的面向测试场景,当然了,有些网站,比如像12306这样的,也会自制根证书要求用户安装。既然是要DIY,当然也要分别在三个主体上做工作。

    证书颁发机构

    • CA机构私钥
    openssl genrsa -out ca.key 2048
    
    • CA证书
    openssl req -x509 -new -key ca.key -out ca.crt
    

    注意生成过程中需要输入一些CA机构的信息

    服务端

    • 生成服务端私钥
    openssl genrsa -out server.key 2048
    
    • 生成服务端证书请求文件
    openssl req -new -key server.key -out server.csr
    

    注意生成过程中需要你输入一些服务端信息

    • 使用CA证书生成服务端证书
    openssl x509 -req -sha256 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out server.crt
    

    关于sha256,默认使用的是sha1,在新版本的chrome中会被认为是不安全的,因为使用了过时的加密算法。

    • 打包服务端的资料为pkcs12格式(非必要,只是换一种格式存储上一步生成的证书)
    openssl pkcs12 -export -in server.crt -inkey server.key -out server.pkcs12
    

    生成过程中,需要创建访问密码,请记录下来。

    • 生成服务端的keystore(.jks文件, 非必要,Java程序通常使用该格式的证书)
    keytool -importkeystore -srckeystore server.pkcs12 -destkeystore server.jks -srcstoretype pkcs12
    

    生成过程中,需要创建访问密码,请记录下来。

    • 把ca证书放到keystore中(非必要)
    keytool -importcert -keystore server.jks -file ca.crt
    

    客户端

    • 导入根证书ca.crt到浏览器受信任的根证书颁发机构列表中

    不管通过什么浏览器吧,总之你要找到下面这个页面,点击导入,将上面生成的CA机构的ca.crt导入到收信任的根证书颁发机构列表中。

    import ca.crt

    注意,收信任的根证书颁发机构列表是操作系统级的,不管通过哪个浏览器进入配置,都是只需要配置一次,再使用其它浏览器时,无需重复配置。

    Spring Boot

    Spring Boot为web容器提供了统一的抽象配置,不管你使用的是Tomcat是Jetty还是其它web容器,如果要在Spring Boot中使用Https,你只需要在你的配置类中,添加如下代码,注册一个EmbeddedServletContainerCustomizer Bean即可。

    需要用到上面生成的Server.jks文件。

    @Configuration
    public class WebConfig {
    
        @Bean
        public EmbeddedServletContainerCustomizer containerCustomizer() {
            return new EmbeddedServletContainerCustomizer() {
                @Override
                public void customize(ConfigurableEmbeddedServletContainer container) {
                    Ssl ssl = new Ssl();
                    ssl.setKeyStore("Server.jks");
                    ssl.setKeyStorePassword("passwd");
                    container.setSsl(ssl);
                    container.setPort(8443);
                }
            };
        }
    }
    

    Nginx

    如果要在Nginx中使用Https,需要用到上面生成的Server.crt,Server.key。

    server {
        listen      127.0.0.1:443 ssl;
        
        ssl on;
        ssl_certificate Server.crt;
        ssl_certificate_key Server.key;
    
        #省略无关配置...  
    }
    

    总结

    1. crt、jks、pkcs12都是用来保存证书的不同格式,不同的服务器软件可能会使用不同格式的证书文件。
    2. OpenSSl、Keytool都是可以用来生成Https证书的工具软件,其中OpenSSl功能更多更复杂,Keytool随JDK安装而安装。
    3. 证书的格式是多样的,生成证书的软件工具有很多,不同服务器程序的配置方法不尽相同,要达成目的有很多种方法。所以,重要的是弄懂原理,而不是按照教程一步一步敲命令。
    4. 跟白话Https一样,本文仍然没有介绍服务端怎么验证客户端,但如果你弄懂了原理,我想你已经可以自己去实现了。
  • 相关阅读:
    Java 蓝桥杯 算法训练 貌似化学
    Java 蓝桥杯 算法训练 貌似化学
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    JAVA-蓝桥杯-算法训练-字符串变换
    Ceph:一个开源的 Linux PB 级分布式文件系统
    shell 脚本监控程序是否正在执行, 如果没有执行, 则自动启动该进程
  • 原文地址:https://www.cnblogs.com/xinzhao/p/4950689.html
Copyright © 2011-2022 走看看