SSL 证书的一些事儿

in Server with 0 comment

什么是 SSL 证书

SSL(Secure Socket Layer,安全套接字层)它是一项标准技术,可确保互联网连接安全,保护两个系统之间发送的任何敏感数据,防止网络犯罪分子读取和修改任何传输信息,包括个人资料。两个系统可能是指服务器和客户端(例如,浏览器和购物网站),或两个服务器之间(例如,含个人身份信息或工资单信息的应用程序)。

此举可确保在用户和站点之间,或两个系统之间传输的数据无法被读取。它使用加密算法打乱传输中的数据,防止数据通过连接传输时被黑客读取。这里所说的数据是指任何敏感或个人信息,例如信用卡号和其他财务信息、个人姓名和住址等。

TLS(Transport Layer Security,传输层安全)是更为安全的升级版 SSL。由于 SSL 这一术语更为常用,因此我们仍然将我们的安全证书称作 SSL。

如果某个网站受 SSL 证书保护,其相应的 URL 中会显示 HTTPS(超文本传输安全协议)。单击浏览器地址栏的挂锁图标,即可查看证书详细信息,包括颁发机构和网站所有者的公司名称。

SSL 与 TLS 的区别:https://www.huaweicloud.com/zhishi/dyl33.html

CA - 地区工商局的成立

某某市成立市工商局,我们都知道工商局是国家单位,值得信赖的。工商局主要作用是管理市场秩序,审核商户(商户通过审核后会颁发营业执照证书),防止不良商人(中间人攻击)损害市民的利益。

市工商局上面还有省工商局,省工商局上面还有国家工商部。市工商局有省工商局颁发的营业执照,省工商局有工商部颁发的营业执照。

这里的市工商局就是 CA(Certificate Authority) 机构,国家的工商部就是顶级 Root CA。营业执照就是 CA 证书。

那如何生成 CA 机构的证书呢?

CA 的证书和普通证书没有什么区别,也是要向上级机构申请,通过后上级颁发证书的。 可以在云服务商处购买(如 腾讯云阿里云GoDaddy),另外也可以通过 Let's Encrypt 申请证书,支持 Let's Encrypt 的工具有 acme.sh

个人来讲,最简单还是在腾讯云或阿里云上购买域名,然后申请免费的证书(有效期 1 年,白漂),当然喜欢折腾那还是 Let's Encrypt 吧。

这里说一下使用 Openssl 生成自签证书(Self-Signed Certificate)。

首先,生成私钥,输入以下命令,按提示输入信息(最好设置密码):

openssl genrsa -des3 -out ca.key 2048

接下来,生成证书,这里我们要告诉广大市民、商户,工商局叫什么名称、地址在哪儿,怎么联系。输入以下命令,根据提示填写信息:

openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt

现在我们有了 ca.keyca.crt 文件了,其中 ca.crt 就是证书文件。

那证书文件里有什么呢?

我们可以使用下面命令查看,或者访问网站 SSL 测试 - 证书内容查看

openssl x509 -noout -text -in ca.crt

这里以命令行输出的结果为准进行解释:

上面提到的一些信息(下方还会说到其用途),可以通过随便一个支持 https 的网站,使用 chrome 浏览器,点击小锁查看证书,然后选择详细信息选项卡,就能查看到了,这样更容易理解,例如:

ssl_cert_details.png

工商局顺利成立后,就要告知所有市民了(将 ca.crt 文件给用户和服务商)。

Server - 商户的成立

现在市民 A 要开设自己的商店,首先生成自己的标识(私钥)。假设的店英文名 happy.shop(域名)。

openssl genrsa -out happy.shop.key 2048

接下来怎么做呢,当然要向工商局注册了(可不想辛辛苦苦盘下来的店被查)。

首先要向工商局提交申请(创建 CSR - Certificate Signing Request,证书请求)。填写自己的商店信息。

openssl req -new -key happy.shop.key -out happy.shop.csr

担心自己没有说清楚,还是再补充一些信息吧,店的主营范围啥的,最重要的是告诉工商局店的标识(店名不重要(Common Name,通用名称),会重名),方便市民识别。创建扩展文件(happy.shop.ext):

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = happy.shop   # 必填
DNS.2 = *.happy.shop # 可选 泛域名证书
IP.1 = 192.168.0.15  # 可选 通过 IP 访问

接下来,就提交文件给工商局了(csr 和 ext 文件)。工商局经过审核过后,觉得符合经营许可,颁发营业执照(证书)。

openssl x509 -req -in happy.shop.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out happy.shop.crt -days 365 -sha256 -extfile happy.shop.ext

营业执照到手,左看右看,还是校验一下吧,万一被人掉包了呢。

openssl verify -CAfile ca.crt -verify_hostname happy.shop happy.shop.crt

CSR 文件里有什么呢?

可以使用下面命令查看,或者访问网站 SSL 测试 - CSR 查看。命令如下 :

 openssl req -noout -text -in happy.shop.csr

CSR 中包含店铺信息、加密信息。加密信息里面包含网站的 公钥

这里的公钥和证书的里公钥是同一个,也就说是服务端将公钥通过 csr 文件传递给了 CA,用于证书的生成。

经过这一列的折腾,商店终于开张了。

Client - 商品的购买

现在有一个特别认真的人来到商店购买商品,为了确保商品购买体验(担心商品的质量问题),要求商家出示经营许可证,商家出示经营许可证,用户去工商局网站点验证了商家的经营许可,结果验证成功,用户便继续购买商品了。

简单概况一下验证流程:

  1. 校验证书是否为合法的 CA 机构证书,通过解析证书中的 Issuer,查看已安装的 CA 机构证书列表中是否存在该机构,存在继续验证;不存在,报错。
  2. 在上一步中找到的 CA 机构证书中提取公钥,使用机构公钥对加密密文进行解密获得散列值(数字签名),同时将证书内容使用相同的散列算法进行 Hash 得到另一个散列值,比对两个散列值,如果两者相等则说明证书没问题。
  3. 继续验证证书的有效日期。
  4. 接着验证 SAN(Subject Alt Name)中指定的域名或 IP 和当前域名或 IP 做对比。

以上全部校验过,浏览器才会加小锁标识,表明该证书有效。

关于 Common Name 和 Subject Alt Name

网上有一部分的教程仍然使用 Comman Name 设定的值作为域名,由于 Common Name 定义太过于模糊,这种方式已经被弃用了,配置域名请使用 SAN(Subject Alt Name),相比之下 SAN 更加的灵活,SAN 可以配置泛域名及 IP 访问。

如果不添加 SAN 配置,可能会遇到错误,通过 chrome 浏览器的开发者工具查看 security 选项卡,会提示 “Subject Alternative Name Missing” ,这时候就需要配置上文中提到过的扩展配置文件中的 [alt_names] 配置节部分。

详情请阅读以下链接:

参考资料

Comments are closed.