HTTPS证书申请原理
1、制作CSR文件
所谓CSR就是由申请人制作的Certificate Secure Request
证书请求文件。制作过程中,系统会产生2个密钥
,一个是公钥
就是这个CSR
文件,另外一个是私钥,存放在服务器上。要制作CSR
文件,申请人可以参考WEB SERVER的文档,一般APACHE
等,使用OPENSSL
命令行来生成KEY+CSR
2个文件,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
证书列表中可查看到创建成功的免费测试证书。
- 您在
自签名证书
创建根证书
(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) []:sgw
Locality Name (eg, city) [Default City]:sgw
Organization Name (eg, company) [Default Company Ltd]:shiguiwu
Organizational Unit Name (eg, section) []:test
Common Name (eg, your name or your servers hostname) []:root
Email Address []:2406749643@qq.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
,后面我们可以用这个根证书去颁发服务器证书和客户端证书。
生成自签名服务器端证书
(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
:有效期十年的服务器端公钥证书
,使用根证书和服务器端私钥文件一起生成
证书验证过程原理
如下图图所示,为数字证书签发和验证流程:
当服务端向
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
的事情,是你电脑中毒了才导致 HTTPS 数据被中间人劫持的。所以,
HTTPS
协议本身到目前为止还是没有任何漏洞的,即使你成功进行中间人攻击,本质上是利用了客户端的漏洞(用户点击继续访问或者被恶意导入伪造的根证书),并不是HTTPS
不够安全。