跳转至

07-Linux-自建CA

给 IP 地址 自签 https 证书

证书和通配符证书是两种不同类型的SSL/TLS证书,它们在适用范围和使用方式上有所区别。

  1. 证书(Standard SSL Certificate):

    • 适用范围:证书是针对特定的域名(或多个具体的域名)颁发的。
    • 使用方式:每个证书只能用于单个域名或多个特定域名,例如 example.com 或 www.example.com
  2. 通配符证书(Wildcard SSL Certificate):

    • 适用范围:通配符证书是针对一个主域名及其所有子域名的证书。它使用一个通配符符号 * 表示,通常出现在主域名的左侧,例如 *.example.com。
    • 使用方式:通配符证书可以用于主域名及其任意子域名,例如 blog.example.com、shop.example.com、mail.example.com 等。
什么是 HTTPS
  • HTTPS不是一个新的通信协议,而是 HTTP 与 SSL(或TSL) 的组合。SSL--安全套节层(Secure Socket Layer), TSL(Transport Layer Security 安全传输层)是以SSL为原型开发的协议,IETF以SSL3.0为基准后又制定了TLS1.0、TLS1.1和TLS1.2,当前主流版本为SSL3.0与TLS1.0。

  • HTTPS就是在HTTP与TCP层中间添加了一个SSL层。因为HTTPS被HTTP多了这层加密的流程,所以HTTPS的速度要比HTTP慢的多。

  • image-20231008135030618

HTTPS的通信过程

SSL的加密过程是RSA与AES混合进行的。简单概括一下,就是通过RSA加密方式来交换AES加解密的密钥,然后使用AES加密的方式来传输报文。下方是SSL建立连接以及传输数据的图解。在下图中大体可以分为四步:

- 1. 有客户端发起的第一次握手,此次握手过程的主要目的是从服务端获取数字签名证书,服务端在发送数字签名证书之前要先确认客户端的SSL版本、加密算法等信息。

- 2.完成第一次握手后,接着进行第二次握手。第二次握手是在客户端收到证书后发起的,主要目的是将AES加解密使用的Key (Pre-mastersecret)发送给服务端。当然这个AES_KEY是使用第一次握手获取的公钥进行加密的。客户端收到这个使用公钥加密后的AES_KEY,使用服务端的私钥进行解密。这样客户端和服务端经过二次握手后都持有了AES加解密的KEY。

- 3. 当 Client 与 Server 端都持有 AES_KEY 后,就可以对 HTTP 报文进行加解密。

- 4. 断开连接。
  • image-20231008135508497

当使用Nginx作为HTTPS服务器时,以下是HTTPS请求的流程和证书验证的基本步骤:

  1. 客户端发起HTTPS请求:客户端(例如Web浏览器)向Nginx服务器发起HTTPS请求。默认情况下,HTTPS使用443端口进行通信。

  2. 服务器端接收请求:Nginx服务器监听来自客户端的HTTPS请求。

  3. SSL/TLS握手开始:服务器将与客户端建立SSL/TLS连接。这是一个加密通道,用于保护数据传输的机密性和完整性。

  4. 服务器发送证书:作为握手的一部分,服务器将向客户端发送其数字证书。证书包含服务器的公钥和与之关联的证书链。

  5. 客户端验证证书:客户端接收到服务器发送的证书后,会进行以下验证步骤:

    • 验证证书的有效性:客户端会检查证书的签名是否有效、证书是否在有效期内以及是否由受信任的证书颁发机构(CA)签发。
    • 验证证书的域名:客户端会检查证书中的域名与客户端请求的域名是否匹配,以确保通信的安全性。
    • 验证证书链:客户端会验证证书的链条,确保服务器证书的签名可以被受信任的根证书或中间证书所验证。
  6. CA证书验证:在验证证书链时,客户端会检查服务器证书链中的根证书是否存在于客户端的受信任根证书库中。如果根证书不在受信任的根证书库中,客户端将终止连接并显示证书不受信任的错误。

  7. 客户端生成会话密钥:如果证书验证成功,客户端会生成一个随机的会话密钥(对称密钥),并使用服务器的公钥进行加密。

  8. 服务器使用私钥解密:服务器使用自己的私钥对客户端发送的加密会话密钥进行解密。

  9. SSL/TLS握手完成:服务器和客户端现在都具有相同的会话密钥,握手过程完成。接下来的数据传输将使用对称加密算法进行加密和解密。

  10. 安全数据传输:客户端和服务器之间的数据传输现在使用会话密钥进行加密和解密。这确保了数据的机密性和完整性。

安装 openssl

apt install openssl

1. 创建 CA 证书认证机构私钥和证书

生成CA根证书私钥

# 通过rsa算法生成2048位长度的秘钥
openssl genrsa -out ca.key 2048

通过私钥生成CA根证书,Country Name到 Email Address 那需要填写

# 公钥包含了机构信息
openssl req -new -x509 -days 36500 -key ca.key -out ca.crt
参数名称 参数值
Country Name 国家代码,比如中国就是CN
State or Province Name 省名称
Locality Name 城市名称
Organization Name 机构名称
Organizational Unit Name 机构单位名称
Common Name 重点参数:授权给什么,因为机构是根节点所以是授权给自己
Email Address 邮件地址

2. 创建服务器证书

得到CA证书之后,需要通过openssl工具对证书进行转换得到公钥(.crt文件)和密钥(.key文件), 这里需要准备以下两个文件

# openssl.cnf
# 重点是[alt_names],这里写的ip地址
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req

[req_distinguished_name]
countryName = Country Name (2 letter code)
countryName_default = US
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = NY
localityName = Locality Name (eg, city)
localityName_default = NYC
organizationalUnitName  = Organizational Unit Name (eg, section)
organizationalUnitName_default  = xxx
commonName = xxx
commonName_max  = 64

[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:TRUE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names

[alt_names]

# 改成自己的域名
#DNS.1 = a.example.com

# 改成自己的IP
IP.1 = 10.10.0.5
# IP.2 = x.x.x.x
# v3.ext
# [alt_names]与 openssl.cnf 一致
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage=digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName=@alt_names
[alt_names]

# 改成自己的域名
#DNS.1 = a.example.com

# 改成自己的IP
IP.1 = 10.10.0.5
# IP.2 = x.x.x.x

创建服务器的秘钥

生成内外 IP 的私钥

```yaml
# 通过RSA算法生成长度2048位的秘钥
openssl genrsa -out server.key 2048
```

使用私钥生成证书请求文件

```yaml
# 和创建CA时一样这里需要输入一堆服务器信息,输入项也是相同的。
openssl req -config openssl.cnf -new -days 20811 -key server.key -out server.csr 
```

3. 自己的 CA 机构证书对自己的服务器证书进行签名认证(为内网IP生成私钥和证书请求文件)

# 将签名请求文件进行签名最终得到服务器的公钥
openssl x509 -days 26500 -req -sha256 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt

4. 得到了两组密钥对,可以把 server 的这组密钥对放到 HTTP 服务器中进行部署。

ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
gunicorn --certfile=/server.crt --keyfile=/server.key --bind 0.0.0.0:443 jiaogong.wsgi

5. 信任CA机构证书

win 导入 CA.crt

双击 ca.crt 文件 --> 点击安装证书 --> 点击本地计算机,点击下一步 --> 点击将所有证书都放入下列存储,点击浏览 --> 选择受信任的根证书颁发机构,点击确定
--> 点击完成,显示导入成功

image-20231008101342525

image-20231008133816238

centos 导入证书

cp ca.crt /etc/pki/ca-trust/source/anchors/
update-ca-trust

ubuntu 导入证书

cp ca.crt /usr/local/share/ca-certificates/
update-ca-certificates