1. HTTPS的定义
HTTPS (Hypertext Transfer Protocol Secure) 是基于 HTTP 的扩展,用于计算机网络的安全通信,已经在互联网得到广泛应用。在 HTTPS 中,原有的 HTTP 协议会得到 TLS (安全传输层协议) 或其前辈 SSL (安全套接层) 的加密。因此 HTTPS 也常指 HTTP over TLS 或 HTTP over SSL。
2. HTTPS传输的过程
HTTPS 的整个通信过程可以分为两大阶段:证书验证和数据传输阶段,数据传输阶段又可以分为非对称加密和对称加密两个阶段。
1.客户端请求 HTTPS 网址,然后连接到 server 的 443 端口 (HTTPS 默认端口,类似于 HTTP 的80端口)。
2.采用 HTTPS 协议的服务器必须要有一套数字 CA (Certification Authority)证书,证书是需要申请的,并由专门的数字证书认证机构(CA)通过非常严格的审核之后颁发的电子证书 。颁发证书的同时会产生一个私钥和公钥。私钥由服务端自己保存,不可泄漏。公钥则是附带在证书的信息中,可以公开的。证书本身也附带一个证书电子签名,这个签名用来验证证书的完整性和真实性,可以防止证书被篡改。
3.服务器响应客户端请求,将证书传递给客户端,证书包含公钥和大量其他信息,比如证书颁发机构信息,公司信息和证书有效期等。Chrome 浏览器点击地址栏的锁标志再点击证书就可以看到证书详细信息。
4.客户端解析证书并对其进行验证。如果证书不是可信机构颁布,或者证书中的域名与实际域名不一致,或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。如果证书没有问题,客户端就会从服务器证书中取出服务器的公钥A。然后客户端还会生成一个随机码 KEY,并使用公钥A将其加密。
5.客户端把加密后的随机码 KEY 发送给服务器,作为后面对称加密的密钥。
6.服务器在收到随机码 KEY 之后会使用私钥B将其解密。经过以上这些步骤,客户端和服务器终于建立了安全连接,完美解决了对称加密的密钥泄露问题,接下来就可以用对称加密愉快地进行通信了。
7.服务器使用密钥 (随机码 KEY)对数据进行对称加密并发送给客户端,客户端使用相同的密钥 (随机码 KEY)解密数据。
8.双方使用对称加密愉快地传输所有数据。
3. 数字证书和CA
在https传输过程中,有一个“公钥的信任”问题。因为谁都可以发布公钥,我们还缺少防止黑客伪造公钥的手段。我们可以用类似密钥交换的方法来解决公钥认证问题,用别的私钥来给公钥签名。找一个公认的可信第三方来给公钥签名,这个第三方就是常说的CA(Certificate Authority,证书认证机构)。由它来给各个公钥签名,用自身的信誉来保证公钥无法伪造,是可信的。CA 对公钥的签名认证也是有格式的,还要包含序列号、用途、颁发者、有效时间等等,把这些打成一个包再签名,完整地证明公钥关联的各种信息,形成“数字证书”(Certificate)。
知名的 CA 全世界就那么几家,比如 DigiCert、VeriSign、Entrust、Let’s Encrypt 等,它们签发的证书分 DV、OV、EV 三种,区别在于可信程度。DV 是最低的,只是域名级别的可信,背后是谁不知道。EV 是最高的,经过了法律和审计的严格核查,可以证明网站拥有者的身份
小一点的 CA 可以让大 CA 签名认证,但链条的最后,也就是Root CA,就只能自己证明自己了,这个就叫“自签名证书”(Self-Signed Certificate)或者“根证书”(Root Certificate)。你必须相信,否则整个证书信任链就走不下去了。
有了这个证书体系,操作系统和浏览器都内置了各大 CA 的根证书,上网的时候只要服务器发过来它的证书,就可以验证证书里的签名,顺着证书链(Certificate Chain)一层层地验证,直到找到根证书,就能够确定证书是可信的,从而里面的公钥也是可信的。
数字证书是网络世界中的身份证,数字证书为实现双方安全通信提供了电子认证。数字证书中含有密钥对所有者的识别信息,通过验证识别信息的真伪实现对证书持有者身份的认证。数字证书可以在网络世界中为互不见面的用户建立安全可靠的信任关系,这种信任关系的建立则源于 PKI/CA 认证中心,因此,构建安全的 PKI/CA 认证中心是至关重要的。
所有与数字证书相关的各种概念和技术,统称为 PKI( Public Key Infrastructure 公钥基础设施)。PKI 通过引入 CA,数字证书,LDAP,CRL,OCSP 等技术并制定相应标准,有效地解决了公钥与用户映射关系,集中服务性能瓶颈,脱机状态查询等问题。同时为促进并提高证书应用的规范性,还制定了很多与证书应用相关的各种标准。
SSL 证书是数字证书的一种,类似于驾驶证、护照和营业执照的电子副本。因为配置在服务器上,也称为服务器证书。
SSL 证书只有正确安装到 Web 服务器,才能实现客户端与服务器间的 https 通信。由于涉及到不同类型 Web 服务器的配置,需要在证书签发后,根据实际服务器环境来安装证书。
CA 是一种电子商务认证授权机构,也称为电子商务认证中心,是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。其发布的证书就是 CA 证书。
4. 证书格式
从分类标准上分,SSL 证书格式主要有
-
公钥证书格式标准 X.509 中定义的 PEM 和 DER
-
公钥加密标准 PKCS 中定义的 PKCS#7 和 PKCS#12
-
Java 环境专用的 JKS
从文件格式上分,SSL 证书格式主要有
- 一种是 Base64 (ASCII) 编码的文本格式。这种证书文件是可以通过文本编辑器打开,甚至可以编辑,常见有 PEM 证书格式,扩展名包括 PEM、CRT 和 KEY。
- 另外一种是 Binary 二进制文件。常见有 DER 证书格式,扩展名包括 DER 和 CER。
Linux 系统使用 CRT,Windows 系统使用 CER。
名词含义
X.509:一种通用的证书格式,包含证书持有人的公钥,加密算法等信息
pkcs1 ~pkcs12:公钥加密(非对称加密)的一种标准(Public Key Cryptography Standards),一般存储为 .pN,,.p12 是包含证书和密钥封装格式
*.der:证书的二进制存储格式(不常用)
*.pem:证书或密钥的 Base64 文本存储格式,可以单独存放证书或密钥,也可以同时存放证书或密钥
*.key:单独存放的 pem 格式的密钥,一般保存为 *.key
*.cer *.crt: 两个指的都是证书,Linux 下叫 crt,Windows 下叫 cer;存储格式可以是 pem,也可以是 der
*.csr:证书签名请求(Certificate signing request),包含证书持有人的信息,如:国家,邮件,域名等信息
*.pfx:微软 IIS 的实现
*.jks:Java 的 keytool 实现的证书格式
4. openssl创建CA证书并签发新证书
生成CA私钥
openssl genrsa -out ca.key 2048
生成CA证书请求文件,回车后会询问一系列基本信息
openssl req -new -key ca.key -out ca.csr
生成CA根证书
openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt
一个 CA 机构的 root 证书其实就是生成的 ca.crt,而基于这个证书就可以进行其受信证书的颁发。值得注意的是,生成的证书格式一般是通用的 X509 格式的,其包含证书持有人的公钥,加密算法等信息。
把在上面已经生成 ca.crt 作为根证书,来签发一个新的证书。
生成一个证书的私钥
openssl genrsa -out server.key 1024
生成证书的请求文件 csr
openssl req -new -key server.key -out server.csr
通过自建 CA 的 ca.crt 根证书来签发新的证书,附带参数声明
openssl x509 -req -days 300 -sha1 -extensions v3_req -CA ca.crt -CAkey ca.key -CAserial ca.srl -CAcreateserial -in server.csr -out server.crt
-CA:指定CA证书的路径
-CAkey:指定 CA 证书的私钥路径
-CAserial:指定证书序列号文件的路径
-CAcreateserial:表示创建证书序列号文件(即上方提到的 serial 文件),创建的序列号文件默认名称为 -CA,指定的证书名称后加上 .srl 后缀
证书校验,用下面命令来校验是否签发成功
openssl verify -CAfile ca.crt server.crt
对于签发好的证书可以通过 nginx 架设一个 https 的服务器,再将 CA 根证书安装到操作系统系统中,这样通过 https 进行请求时候,证书的信任链便完成了,也就是说这个连接是安全的连接。
X.509证书
基于 X.509 V3 标准的证书通过将身份与一对可用于对数字信息进行加密、签名和解密的电子密钥绑定,以实现认证和数据安全(一致性、保密性)的保障。
每一个 X.509 证书都是根据公钥和私钥组成的密钥对来构建的,它们能够用于加解密、身份验证、信息安全性确认。证书的格式和验证方法普遍遵循 X.509 国际标准。
X.509 标准使用了一种抽象语法表示法 One (ASN.1)的接口描述语言,来定义、和编解码客户端与证书颁发机构之间传输的证书请求和证书。
证书查看操作:
# 查看证书序列号
openssl x509 -in ca.crt -noout -serial
# 打印证书名称以 RFC2253 规定的格式打印出证书的拥有者名字
openssl x509 -in ca.crt -noout -subject
# 打印出证书的 MD5 特征参数
openssl x509 -in ca.crt -noout -fingerprint
# 打印出证书的 SHA 特征参数
openssl x509 -sha1 -in ca.crt -noout -fingerprint
证书格式的转换其实本质上是编码格式的转换,比如 der 和 pem 的转换。
# PEM 转 DER 格式:
openssl x509 -inform pem -in certificate.pem -outform der -out certificate.der
# DER 转 PEM 格式:
openssl x509 -inform der -in certificate.der -outform pem -out certificate.pem