第一步:我们自己扮演CA机构,给自己的服务器颁发签名证书,这个证书是CA机构的证书
openssl genrsa -out ca.key 1024
//这里是CA生成的私钥,文件名为ca.key
openssl req -new -key ca.key -out ca.csr
//这里是CA通过自己的私钥生成CSR文件,文件名为ca.csr
openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt
//这里是通过把CA的csr文件用私钥进行签名,最后生成一个证书的过程,证书名字为ca.crt
上面产生的文件是扮演CA角色需要的文件
第二步:服务器向CA机构申请签名证书,但是在申请签名证书之前要创建自己的CSR文件,但是这个过程中的Common Name要匹配服务器域名,否则后续认证会报错
openssl genrsa -out server.key 1024
//这里是产生了服务器的私钥
openssl req -new -key server.key -out server.csr
//通过服务器的私钥产生CSR文件
openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt
//这里为服务器产生了一个得到CA签名的证书,证书名字为server.crt。产生证书需要CA机构的证书文件ca.crt以及CA机构的私钥的参与
注意:这里我们很容易注意到我们要产生通过CA认证的证书是需要
CA的私钥和CA证书的参与的!客户端发起安全连接之前需要获取服务器端的证书,并通过CA的证书验证服务器端证书的真伪,除了验证真伪以外还需要对服务器的名称,IP地址进行验证。
我们来看看证书中包含什么内容:
这个证书是内置在浏览器中的,我们已经知道证书的格式了,我们再看看证书的验证是怎么样的过程:
很显然,当把证书发送到客户端以后会被发送到CA机构进行认证,如果认证通过才是合法的请求。具体过程如下:
服务器证书的验证->服务器身份的验证
1, 通过https建立一个安全web事务之后,浏览器会自动获取所连服务器的数字证书;
其中服务器证书包括了:
Web站点名称和主机名
Web站点的公钥;
颁发机构的名称;
颁发机构给证书的签名;
2, 若服务器没有证书,则安全连接失败。
3, 浏览器首先检查服务器证书是否还在有效期内,若过期,则提示失效;
4, 浏览器查看服务器证书对应的CA,若该CA是很权威的机构,则浏览器可能已经知道了对应的公钥了(浏览器会预先安装很多签名颁发机构的证书并认为是受信任的),这时,浏览器用CA的数字证书里面的公钥来验证该CA颁发的服务器证书的有效性。类似去公安局验证某人的身份证是否是真的。
5,则浏览器对签名颁发机构CA一无所知,浏览器无法确定是否该信任这个签名颁发机构,它通常会向用户提示一个对话框,看看他是否相信这个签名发布者。
6, 一旦完成了对服务器证书的验证,接下来就可以使用服务器证书里面的公钥进行服务器身份的验证;
7, 客户端生成一个随机数给到服务器,要求对应的服务用对应服务器证书是私钥进行签名。
8, 服务器对随机数进行签名,并回传给到客户端。
9, 客户端用服务器证书的公钥对随机数的签名进行验证,若验证通过,则说明对应的服务器确实拥有对应服务器证书的私钥,因此判断服务器的身份正常。否则,则任务服务器身份被伪造。