SSL、TLS、HTTPS 、证书、CA
1.简介
官方文档
SSL | https://www.ssl.com/faqs/faq-what-is-ssl/ |
TLS | |
X.509 | |
HTTPS |
SSL(Secure Sockets Layer 安全套接字层协议),是用于在联网计算机之间建立可靠链接的一种协议,这个可靠指的是 [ 经过身份验证 和 加密 ]。ssl这个名字弃用于1999年。
TLS(Transport Layer Security 传输层安全协议),于1999年发布,接替原SSL并改名为TLS,是一种认证和加密协议。 TLS 1.3在中定义 RFC 8446 .
HTTPS = HTTP : 443 + TLS
2.信息安全问题
- 传输[双]方身份的可靠性 -- 使用数字证书解决
- 信息的保密性 -- 使用加密算法:对称aes,des等; 非对称:rsa
- 信息的完整性 -- 散列算法(sha1、MD5等)生成摘要1与内容一起加密,另一方解密后得到摘要1和内容,使用相同散列算法对内容生成摘要2,对比摘要1与摘要2
3.CA、数字证书
3.1 验证过程
简单情况下,服务端持有私钥,然后把公钥发给客户端,后者使用公钥就可以完成加密工作。
但是,传输过程中数据可能被第3方劫持、冒充,在中间互相扮演对方。
权威的认证机构(CA)可以解决这个问题。它用验证对方数字证书的可靠性。过程大致如下:
- 服务端去权威机构申请证书,填写持有人、服务器地址等信息。
- CA使用自己的私钥对服务器信息加密生成数字证书,包含(证书内容,散列算法,加密密文,服务端的公钥)。
- 服务端得到数字证书后布置
- 客户端预先把可靠的CA公钥列表存到本地。
- 客户端发请求,得到服务端数字证书后,用CA公钥验证证书合法性
- 合法后,会从证书里得到服务端公钥。
- 加密传输
3.2 X.509 证书结构
X.509 是一种公钥证书 格式标准,是将加密密钥对与网站、个人或组织等身份安全地关联的数字文档。见 RFC 5280 ,它的编码格式主要有两种:
- .DER 是二进制编码,可包含所有私钥、公钥和证书,是大多数浏览器的缺省格式,常见于 Windows 系统中的证书格式。
- .PEM 是文本格式的, 以 “
-----BEGIN CERTIFICATE-----
开头,已-----END CERTIFICATE-----
结尾”, 中间是经过 base64 编码的内容, Apache 和 NGINX 服务器偏向于使用这种编码格式,也是 openssl 默认采用的信息存放方式。PEM 其实就是把 DER 的内容进行了一次 base64 编码。
3.3 查看其它证书
执行命令:
openssl s_client -connect qq.com:443 | openssl x509 -text
结果如下
admin@jfie82o:~$ openssl s_client -connect qq.com:443 | openssl x509 -text
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
verify return:1
depth=1 C = US, O = DigiCert Inc, CN = DigiCert Secure Site CN CA G3
verify return:1
depth=0 C = CN, ST = \E5\B9\BF\E4\B8\9C\E7\9C\81, L = \E6\B7\B1\E5\9C\B3\E5\B8\82, O = Shenzhen Tencent Computer Systems Company Limited, CN = qq.com
verify return:1
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
05:62:4d:f7:ef:6b:f9:d4:dd:21:ef:c1:69:19:5e:5d
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = US, O = DigiCert Inc, CN = DigiCert Secure Site CN CA G3
Validity
Not Before: Jul 26 00:00:00 2021 GMT
Not After : Jul 26 23:59:59 2022 GMT
Subject: C = CN, ST = \E5\B9\BF\E4\B8\9C\E7\9C\81, L = \E6\B7\B1\E5\9C\B3\E5\B8\82, O = Shenzhen Tencent Computer Systems Company Limited, CN = qq.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:e3:59:82:18:14:b3:4f:55:ec:1e:d5:bd:b1:3c:
14:78:f3:53:8c:b4:a2:c3:79:dc:1e:70:46:c8:6c:
44:a2:a8:6b:81:fc:1a:73:3c:91:b5:1b:b2:b9:17:
67:64:d4:6f:81:18:20:e6:a9:7c:f5:e3:49:22:ac:
......
3.4 申请数字证书
ssl https://www.ssl.com/certificates/basicssl/
沃通
4.自签名证书
在测试、内部、私密等场景下,需要创建自签名证书。
资料:
4.1 生成服务器私钥
openssl genrsa -out private.key 4096
在目录下会生下 private.key
4.2 生成证书请求文件(CSR)
openssl req -new -key private.key -out test.csr
注意 Common Name 应输入 域名(如video.test.com),最后在目录下生成test.csr
4.3 签发证书
使用前面生成的两个文件执行下面命令。
openssl x509 -req -days 365 -in test.csr -signkey private.key -out test.crt
生成test.crt
5.自建 CA 签发服务器证书
创建自签 CA 证书,主要分为两个部分:
- 创建CA 根证书
- 签发客户端证书。
5.1 创建CA根证书
第1步:创建 CA 目录并初始化
mkdir -p ~/ssl/myca/{certs,newcerts,crl,private}
cd ~/ssl/myca
touch index.txt
echo "01" > serial
第2步:配置openssl.cnf 文件
把 CA 的配置文件(/etc/ssl/openssl.cnf) 拷贝到当前目录,可以对其中的参数进行修改,如:
第3步:生成根证书
openssl req -new -x509 -newkey rsa:4096 -keyout cakey.key -out cacert.crt -config openssl.cnf -days 365
注意Common Name 应输入 域名,如“audio.test.com”。结果如下:
- 生成的 cacert.crt 是根证书
- 生成的cakey.key 是证书的公钥
- 使用cat命令可把crt与key 合并成cer文件
cat cacert.crt cakey.key > cacert.cer
5.2 签发证书
第1步:生成 4096 bit 的客户端私钥
openssl genrsa -out client.key 4096
第2步:用该客户端私钥生成证书签名请求文件
openssl req -new -key client.key -out client.csr -config openssl.cnf
第3步:使用 CA 根证书签发客户端证书
openssl ca -in client.csr -out client.crt -cert cacert.crt -keyfile cakey.key -config openssl.cnf
在当前目录下生成了client.crt证书
5.3 证书转换及查看
合并crt与key 成cer文件:
cat cacert.crt cakey.key > cacert.cer
把cacert.crt 转为 DER:
openssl x509 -in cacert.crt -outform der -out cacert.der
把cacert.crt 转为 PEM:
openssl x509 -in cacert.crt -outform pem -out cacert.pem
DER 转为 PEM:
openssl x509 -in cert.crt -inform der -outform pem -out cacert.pem
转成p12 :
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
openssl pkcs12 -export -clcerts -in client2.crt -inkey client2.key -out client2.p12
查看公钥:
openssl rsa -noout -text -in cakey.key
查看证书:
openssl x509 -noout -text -in cacert.crt
6.HTTPS 验证过程
6.1 https 单向认证过程
其中第3步验证的主要内容如下
- 证书是否过期;
- 发行服务器证书的CA是否可靠;(通过查询浏览器或本机内的CA证书)
- 返回的公钥是否能正确解开返回证书中的数字签名;
- 服务器证书上的域名是否和服务器的实际域名相匹配;
6.2 https 双向认证过程
注意事项 :
- 生成根公钥证书和私钥文件(root.crt/root.key)
- 使用根证书和根证书私钥(root.crt/root.key)配合服务器端私钥颁发服务器端证书(server.crt);
- 使用根证书和根证书私钥(root.crt/root.key)配合客户端私钥颁发客户端证书(server.crt);
- 将根证书(root.crt)、服务器端证书(server.crt)、服务器端秘钥(server.key)配置到Server中;
- 客户端使用客户端私钥和根证书颁发的客户端证书(client.crt)正常访问业务。