半文搞定https的证书认证

133 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情

配置局域网的https环境的文章中我能提到在webrtc中我们需要https才能调用摄像头,于是我们通过生成证书和秘钥构建了https,但是其实那个https的没有证书签名的,所以浏览器会有不安全的提示。

image.png

回顾一点http知识点

  • 客户端(浏览器)访问 HTTPS 的URL;
  • 服务器返回 HTTPS 使用的 CA 证书;
  • 客户端(浏览器)验证 CA 证书是否为合法证书;
  • 验证通过,证书合法,生成一串随机数并使用公钥(证书中提供的)进行加密;
  • 发送公钥加密后的随机数给服务器;
  • 服务器拿到密文,通过私钥进行解密,获取到随机数(公钥加密,私钥解密,反之也可以);
  • 服务器把要发送给浏览器的内容,使用随机数进行加密后传输给客户端(浏览器);
  • 此时客户端(浏览器)可以使用随机数进行解密,获取到服务器的真实传输内容。

很显然我们上次简单的操作并没有涉及到CA证书的制作,什么是CA呢,这是一个证书机构颁发的证书,这是一个第三方机构,这个担保机构保证了在客户端和服务器的通讯阶段的安全,这样客户端只要是看到证书是这个担保机构担保过的,那就会认可这个服务器并和它进行后续交互,反之其他证书都是不合法的,不会进行更进一步的交互了,请求就不能正常发送。所以我们要实现这样一个CA机构来自签我们的证书,使得浏览器信任。

根据非对称加密的概念,我们需要有一对密钥,对应一把公钥和一把私钥,私钥放在自己身边,公钥提供出去,这边需要注意的是不能把他看成是服务端,CA机构是在客户端和服务端两者之间的一个存在,这边理解了后,我们先来创建一把私钥,可以使用openssl来生成。

openssl的安装在上一篇文章已经有了,为了全局可以使用这个命令我们还需要把其添加到系统的环境变量中。

image.png

这是我的安转路径的bin目录我们给加到path中

image.png

这样我们就可以全局使用openssl命令了。

生成CA的私钥

openssl genrsa -out rootca.key 4096

这样我们就生成了CAde1私钥文件,私钥是要保存好的。注意这里的不是服务端,因为CA证书是在客户端和服务器两者之间的担保机构。

生成请求文件.csr

.csr是其中包含了一些重要的信息,如证书所有者的一些信息等,在我们生成证书的时候需要使用。

openssl req -new -out rootca.csr -key rootca.key

证书生成

学过密码学的我们清楚,加密方式分为对称加密和非对称加密,这里我们所采用的是非对称加密,也就是说加密和解密的秘钥是不一样的,同时公钥加密可以由私钥进行解密,私钥加密可以通过公钥进行解密,但是为啥这里就直接到证书的生成了?难道不是应该公钥生成然后暴露公钥嘛?这是因为公钥是谁都可以生成出来的,所以我们要做的应该是让客户端确认到我们的公钥是可以信任的,客户端会使用受信任的公钥去和服务器交互,所以我们生成一个带公钥的证书,这里就是根证书了。

openssl x509 -req -in rootca.csr -out rootca.crt -signkey rootca.key -days 36500

加入到受信任的证书列表中

要知道我们的系统一开始是怎么知道哪些机构是合法的呢?这就要提到系统的受信任证书列表了,在系统安装的时候一般就会把一些常用的证书加入其中,其他一些软件在安装的时候有时候也会加入一些证书到其中,由于我们的证书是自己生成的,所以我们也要给他加入到我们的受信任列表中。

打开受信任列表

先打开我们的mmc

image.png

选择添加/删除管理单元

image.png

点击证书后点击添加

image.png

选择计算机账户

image.png

选择本地计算机后点击完成

image.png

找到受信任的根证书颁发机构展开点击证书既可以看到已经在系统认证的证书了

image.png

把我们自己的这个证书添加到我们的信任列表中

对我们的证书进行右键安装

image.png

选择本地计算机

image.png

将证书放入指定的存储即受信任的根证书颁发机构

image.png

这样就完成了我们自己的CA机构。

给我们自己颁发证书

生成秘钥

 openssl genrsa -out server.key 4096

请求文件

openssl req -new -key server.key -out server.csr

用我们刚才的机构颁发证书

openssl x509 -req -in server.csr -CA rootca.crt -CAkey rootca.key -CAcreateserial -out server.crt -days 36500

借助我们上次的node服务器开启https服务

image.png

???我操作了个寂寞?为什么还是不行?仔细看下百度的证书

image.png

对比我们的证书

image.png

可以看到我们缺少了使用者可选名称,这里我们只要将我们的ip加入其中就可以了。

使用者可选名称中增加我们的ip

新建ssl.cnf文件

[ req_ext ]
subjectAltName = @alt_names

[alt_names]
IP.1    = 192.168.138.11
#DNS.1   = your-website.dev
#DNS.2   = another-website.dev

把里面IP.1改为你的IP就可以了

重新执行签发命令

openssl x509 -req -in server.csr -CA rootca.crt -CAkey rootca.key -CAcreateserial -out server.crt -days 36500 -extensions req_ext -extfile ssl.cnf

这时候把我们的证书和私钥换掉原来的服务器的文件再启动服务器既可

image.png

其他

证书和私钥转为.pem文件

有时候我们的证书和秘钥要转化为.pem文件才能供我们的服务器使用

  • .key转.pem
openssl rsa -in temp.key -out temp.pem
  • .crt转.pem
openssl x509 -in tmp.crt -out tmp.pem

在springboot中配置我们的ssl需要.p12文件

openssl pkcs12 -export -clcerts -in server.crt -inkey server.key -out server.p12