# HTTPS配置

HTTPS (全称:Hypertext Transfer Protocol Secure),是由 HTTP 加上 TLS/SSL 协议构建的可进行加密传输、身份认证的网络协议,主要通过数字证书、加密算法、非对称密钥等技术完成互联网数据传输加密,实现互联网传输安全保护。设计目标主要有三个。

  1. 数据保密性:保证数据内容在传输的过程中不会被第三方查看。就像快递员传递包裹一样,都进行了封装,别人无法获知里面装了什么。
  2. 数据完整性:及时发现被第三方篡改的传输内容。就像快递员虽然不知道包裹里装了什么东西,但他有可能中途掉包,数据完整性就是指如果被掉包,我们能轻松发现并拒收。
  3. 身份校验安全性:保证数据到达用户期望的目的地。就像我们邮寄包裹时,虽然是一个封装好的未掉包的包裹,但必须确定这个包裹不会送错地方,通过身份校验来确保送对了地方。

# SSL证书

# CA机构颁发SSL证书

使用域名的公网网站,可以为域名申请ssl证书(可以到腾讯云/阿里云等云厂商、亚洲诚信等代理商官网申请)。

# 自签名SSL证书

内网域名或者使用IP地址的场景,使用自签名ssl证书。证书制作流程如下:

# 1.生成根证书私钥和根证书,生成命令如下,其中:/C=CN(国家缩写)/ST=(省份)/L=(城市)/O=(组织名称)
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -subj "/C=CN/ST=Beijing/L=Haidian/O=Mediway" -keyout CA-private.key -out CA-certificate.crt -reqexts v3_req -extensions v3_ca

# 2.生成自签名证书私钥 -out private.key
openssl genrsa -out private.key 2048

# 3.根据自签名证书私钥生成自签名证书申请文件 -out private.csr
openssl req -new -key private.key -subj "/C=CN/ST=Beijing/L=Haidian/O=Mediway/CN=114.242.246.250" -sha256 -out private.csr

# 4.定义自签名证书扩展文件(解决chrome安全告警)。在默认情况下生成的证书一旦选择信任,在 Edge, Firefox 等浏览器都显示为安全,但是Chrome仍然会标记为不安全并警告拦截,这是因为 Chrome 需要证书支持扩展 Subject Alternative Name, 因此生成时需要特别指定 SAN 扩展并添加相关参数,将下述内容放到一个文件中,命名为private.ext
vim private.ext

[ req ]
default_bits = 1024
distinguished_name = req_distinguished_name
req_extensions = san
extensions = san
[ req_distinguished_name ]
countryName = CN
stateOrProvinceName = Definesys
localityName = Definesys
organizationName = Definesys
[SAN]
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = IP:114.242.246.250

# 5.根据根证书私钥及根证书-CA CA-certificate.crt -CAkey CA-private.key、自签名证书申请文件 -in private.csr、自签名证书扩展文件 -extfile private.ext,生成自签名证书 -out private.crt
openssl x509 -req -days 3650 -in private.csr -CA CA-certificate.crt -CAkey CA-private.key -CAcreateserial -sha256 -out private.crt -extfile private.ext -extensions SAN

# Nginx配置SSL证书

server {
    listen       8436 ssl;                                 #配置https端口
    server_name  192.168.1.1;                              #对应ssl证书的域名或ip地址

    ssl_certificate     /opt/nginx/conf/ssl/private.crt;   #ssl证书路径
    ssl_certificate_key /opt/nginx/conf/ssl/private.key;   #ssl私钥路径

    location / {
        alias  /path/to/your/app/dist/;
        index  index.html index.htm;
    }
}