在第一节中我们知道了HTTPS为什么需要证书,以及证书的作用。那么这一节对证书的细节展开更加深入的研究。
一、HTTPS证书申请原理
1、制作CSR文件
所谓CSR就是由申请人制作的_Certificate Secure Request_证书请求文件。制作过程中,系统会产生2个密钥,一个是公钥就是这个CSR文件,另外一个是私钥,存放在服务器上。要制作CSR文件,申请人可以参考WEB SERVER的文档,一般APACHE等,使用OPENssl命令行来生成KEY+CSR2个文件,Tomcat,JBoss,Resin等使用KEYTOOL来生成JKS和CSR文件,IIS通过向导建立一个挂起的请求和一个CSR文件。
2、CA认证
将CSR提交给CA,CA一般有2种认证方式:
1)域名认证:一般通过对管理员邮箱认证的方式,这种方式认证速度快,但是签发的证书中没有企业的名称;
2)企业文档认证:需要提供企业的营业执照。
也有需要同时认证以上2种方式的证书,叫EV ssl证书,这种证书可以使IE7以上的浏览器地址栏变成绿色,所以认证也最严格。
二、华为云SSL 证书申请流程
- 登录管理控制台。
- 单击页面左上方的,选择“安全与合规 > 云证书管理服务”,进入云证书管理界面CCM。
- 在左侧导航栏选择“SSL证书管理”,进入SSL证书管理页面。
- 在证书列表左上角,单击
“创建测试证书”
,进入创建测试证书对话框界面。
“创建测试证书”按钮处显示的数字表示测试证书剩余可创建数量和可累计创建总数量。例如数字显示为“13/20”,表示剩余可创建13张测试证书,可累计创建20张测试证书。
- 阅读并勾选“我已阅读并同意《云证书管理服务(CCM)免责声明》”,单击“确认”。
- 您在SSL证书列表中可查看到创建成功的免费测试证书。
三、自签名证书
3.1、创建根证书
(1)创建根证书私钥:
openssl genrsa -out root.key 1024
(2)创建根证书请求文件:
openssl req -new -out root.csr -key root.key
后续参数请自行填写,下面是一个例子:
Country Name (2 letter code) [XX]:cn
State or Province Name (full name) []:wh
Locality Name (eg, city) [Default City]:wh
Organization Name (eg, company) [Default Company Ltd]:huawei
Organizational Unit Name (eg, section) []:test
Common Name (eg, your name or your servers hostname) []:root
Email Address []:a.huawei.com
A challenge password []:
An optional company name []:
(3)创建根证书:
openssl x509 -req -in root.csr -out root.crt -signkey root.key -CAcreateserial -days 3650
在创建证书请求文件的时候需要注意三点,下面生成服务器请求文件和客户端请求文件均要注意这三点:
- 根证书的Common Name填写root就可以,所有客户端和服务器端的证书这个字段需要填写域名,一定要注意的是,根证书的这个字段和客户端证书、服务器端证书不能一样;
- 其他所有字段的填写,根证书、服务器端证书、客户端证书需保持一致
- 最后的密码可以直接回车跳过。
经过上面三个命令行,我们最终可以得到一个签名有效期为10年的根证书root.crt,后面我们可以用这个根证书去颁发服务器证书和客户端证书。
3.2、 生成自签名服务器端证书
(1)生成服务器端证书私钥:
openssl genrsa -out server.key 1024
(2) 生成服务器证书请求文件,过程和注意事项参考根证书,本节不详述:
openssl req -new -out server.csr -key server.key
(3) 生成服务器端公钥证书
openssl x509 -req -in server.csr -out server.crt -signkey server.key -CA root.crt -CAkey root.key -CAcreateserial -days 3650
经过上面的三个命令,我们得到:
server.key:服务器端的密钥文件 server.crt:有效期十年的服务器端公钥证书,使用根证书和服务器端私钥文件一起生成
四、证书验证过程原理
如下图图所示,为数字证书签发和验证流程:
![](https://img-blog.csdnimg.cn/img_convert/f7b34d0cb4817d76d3fd6fe6e09e28ef.jpeg#clientId=ueb3ace0d-56fa-4&crop=0&crop=0&crop=1&crop=1&errorMessage=unknown error&from=paste&id=u4f0d99c6&margin=[object Object]&originHeight=598&originWidth=1080&originalType=url&ratio=1&rotation=0&showTitle=false&status=error&style=none&taskId=u2fd88b98-3e64-44cb-a163-5ea2e1e113e&title=)
当服务端向 CA 机构申请证书的时候,CA 签发证书的过程,如上图左边部分:
- 首先 CA 会把持有者的公钥、用途、颁发者、有效时间等信息打成一个包,然后对这些信息进行 Hash 计算,得到一个 Hash 值;
- 然后 CA 会使用自己的私钥将该 Hash 值加密,生成 Certificate Signature,也就是 CA 对证书做了签名;
- 最后将 Certificate Signature 添加在文件证书上,形成数字证书;
客户端校验服务端的数字证书的过程,如上图右边部分:
- 首先客户端会使用同样的 Hash 算法获取该证书的 Hash 值 H1;
- 通常浏览器和操作系统中集成了 CA 的公钥信息,浏览器收到证书后可以使用 CA 的公钥解密 Certificate Signature 内容,得到一个 Hash 值 H2 ;
- 最后比较 H1 和 H2,如果值相同,则为可信赖的证书,否则则认为证书不可信。
五、证书链
但事实上,证书的验证过程中还存在一个证书信任链的问题,因为我们向 CA 申请的证书一般不是根证书签发的,而是由中间证书签发的,比如百度的证书,从下图你可以看到,证书的层级有三级:
对于这种三级层级关系的证书的验证过程如下:
- 客户端收到 http://baidu.com 的证书后,发现这个证书的签发者不是根证书,就无法根据本地已有的根证书中的公钥去验证 http://baidu.com 证书是否可信。于是,客户端根据 http://baidu.com 证书中的签发者,找到该证书的颁发机构是 “GlobalSign Organization Validation CA - SHA256 - G2”,然后向 CA 请求该中间证书。
- 请求到证书后发现 “GlobalSign Organization Validation CA - SHA256 - G2” 证书是由 “GlobalSign Root CA” 签发的,由于 “GlobalSign Root CA” 没有再上级签发机构,说明它是根证书,也就是自签证书。应用软件会检查此证书有否已预载于根证书清单上,如果有,则可以利用根证书中的公钥去验证 “GlobalSign Organization Validation CA - SHA256 - G2” 证书,如果发现验证通过,就认为该中间证书是可信的。
- “GlobalSign Organization Validation CA - SHA256 - G2” 证书被信任后,可以使用 “GlobalSign Organization Validation CA - SHA256 - G2” 证书中的公钥去验证 http://baidu.com 证书的可信性,如果验证通过,就可以信任 http://baidu.com 证书。
在这四个步骤中,最开始客户端只信任根证书 GlobalSign Root CA 证书的,然后 “GlobalSign Root CA” 证书信任 “GlobalSign Organization Validation CA - SHA256 - G2” 证书,而 “GlobalSign Organization Validation CA - SHA256 - G2” 证书又信任 http://baidu.com 证书,于是客户端也信任 http://baidu.com 证书。总括来说,由于用户信任 GlobalSign,所以由 GlobalSign 所担保的 http://baidu.com 可以被信任,另外由于用户信任操作系统或浏览器的软件商,所以由软件商预载了根证书的 GlobalSign 都可被信任。
![](https://img-blog.csdnimg.cn/img_convert/29d7791d6bc66f740a9bbce669e14d96.jpeg#clientId=ueb3ace0d-56fa-4&crop=0&crop=0&crop=1&crop=1&errorMessage=unknown error&from=paste&id=u7c374408&margin=[object Object]&originHeight=891&originWidth=707&originalType=url&ratio=1&rotation=0&showTitle=false&status=error&style=none&taskId=udb4dbdfe-8a71-4311-82b6-1b34ac46020&title=)img
操作系统里一般都会内置一些根证书,比如我的 MAC 电脑里内置的根证书有这么多:
![](https://img-blog.csdnimg.cn/img_convert/e526f3600233c604f584c0948f3a254d.jpeg#clientId=ueb3ace0d-56fa-4&crop=0&crop=0&crop=1&crop=1&errorMessage=unknown error&from=paste&id=u533de7bb&margin=[object Object]&originHeight=534&originWidth=867&originalType=url&ratio=1&rotation=0&showTitle=false&status=error&style=none&taskId=uadf6e4b6-2eab-4165-955e-e46ee6a7f19&title=)
这样的一层层地验证就构成了一条信任链路,整个证书信任链验证流程如下图所示:
![](https://img-blog.csdnimg.cn/img_convert/e79ba509d6ca08b25fc75521ffc86035.jpeg#clientId=ueb3ace0d-56fa-4&crop=0&crop=0&crop=1&crop=1&errorMessage=unknown error&from=paste&id=u4ee1a9cf&margin=[object Object]&originHeight=330&originWidth=1080&originalType=url&ratio=1&rotation=0&showTitle=false&status=error&style=none&taskId=u3b87fb02-fb5f-4451-8559-b6f3dd57459&title=)
如果你的电脑中毒了,被恶意导入了中间人的根证书,那么在验证中间人的证书的时候,由于你操作系统信任了中间人的根证书,那么等同于中间人的证书是合法的。
这种情况下,浏览器是不会弹出证书存在问题的风险提醒的。
这其实也不关 HTTPS 的事情,是你电脑中毒了才导致 HTTPS 数据被中间人劫持的。
所以,HTTPS 协议本身到目前为止还是没有任何漏洞的,即使你成功进行中间人攻击,本质上是利用了客户端的漏洞(用户点击继续访问或者被恶意导入伪造的根证书),并不是 HTTPS 不够安全。
更多内容关注微信公众号 ”前后端技术精选“,或者语雀,里面有更多知识:https://www.yuque.com/riverzmm/uu60c9?# 《安全》> 更多内容关注微信公众号 ”前后端技术精选“,或者语雀,里面有更多知识:https://www.yuque.com/riverzmm/uu60c9?# 《安全》