Leif160519的blog Leif160519的blog

——————

目录
SSL认证原理、证书生成及校验
/    

SSL认证原理、证书生成及校验


1、SSL认证的原理

1)加密算法

加密算法分为对称加密和非对称加密。对称加密就是加密和解密用的是同一个密钥,非对称加密就是加密和解密用不同的密钥,此时加密用的密钥称为公钥,即可以公开,解密用的密钥称为私钥,只有特定的某个人或机构拥有。SSL采用的RSA加密算法是一种非对称加密算法,所以才会有那么多证书,因为其中包含公钥和私钥。

2)证书介绍

CA(ca.crt):证书授权中心(certificate authority),是颁发证书的机构,5000块一年就是买的这个东西的授权(但我们选择自己生成,直接省下5000元 :D)。CA是一个受国际认可的权威机构,因此它颁发的证书也是受认可的。浏览器中内置了一些受认可的机构列表,也就是一些CA列表。如果自签名的证书用于https认证,就算你在浏览器中设为信任,某些浏览器(例如Chrome)也会提示不安全,因为该CA没有备案。

ca.key:ca.key和ca.crt是一对密钥,ca.crt是公钥,ca.key是私钥。因此ca.key加密的信息可以通过ca.crt解密。

server.crt:服务器的证书,其中包含公钥信息

client.crt:客户端的证书,其中包含公钥信息

server.key:服务器私钥

client.key:客户端私钥

.req/.csr文件:生成证书的中间请求文件。

.pem:证书的另一种格式,是.crt或.key经过加密后的文件。

3)证书生成原理

服务器自己生成一个密钥server.key(例如1024位的随机数),然后用该密钥和一些服务器信息(国家、地区、域名等)生成一个请求文件req(该请求文件中包含了服务器公钥和服务器信息)送到CA处,然后CA审核该请求,如果合格则用私钥ca.key对其签名,形成服务器证书server.crt,并传回给服务器。客户端请求证书原理也是如此。

4)认证流程

以单向认证为例:

①客户端首先向服务器发送请求;

②然后服务器将证书server.crt发送给客户端,客户端可以用ca.crt对该证书解密(ca.crt和ca.key是一对密钥,还记得吗),获取服务器的公钥和信息,可以对这些信息进行校验(其中域名校验就是在这里!);

③客户端生成一个随机数作为对称加密的密钥,然后用服务器公钥对其进行加密,发送给服务器,该密钥是本次会话的对称加密密钥。

④服务器收到后,用私钥server.key解密,获得对称密钥,然后后面的通信都用这个对称密钥加密。

双向认证和单向认证类似,不同之处在于第②步之后,客户端也需要将自己的证书client.crt发给服务器,然后由服务器进行验证。具体流程见下图。
image.png
image.png

2、利用openssl生成证书

1)根证书(CA)的生成

openssl genrsa -out ca/ca.key 1024 #生成私钥

openssl req -out ca/ca.req -key ca/ca.key -new #生成请求文件,需要填写一些信息

openssl x509 -req -in ca/ca.req -out ca/ca.crt -sha1 -days 5000 -signkey ca/ca.key #生成ca.crt证书

rm ca/ca.req #删除中间请求文件

2)服务端证书的生成

openssl genrsa -out server/server.key 1024 #私钥

openssl req -out server/server.req -key server/server.key -new #生成请求文件,需要填写一些信息

openssl x509 -req -in server/server.req -out server/server.crt -sha1 -CAcreateserial -days 5000 -CA ca/ca.crt -CAkey ca/ca.key #生成有效期5000天的服务端证书

rm server/server.req #删除中间请求文件

3)客户端证书生成方法同服务端

在上述过程中,生成请求文件.req时需要填写一些信息,如下所示:

Country Name (2 letter code) [XX]:CN <==两个字符表示的国家代码,CN为中国

State or Province Name (full name) []:GuangDong <==省或洲的完整名称

Locality Name (eg, city) [Default City]:ShenZhen <==所在位置的名称(默认为城市)

Organization Name (eg, company) [Default Company Ltd]:example <==组织机构名称(默认为公司)

Organizational Unit Name (eg, section) []:Ops <==组织机构单元名称(eg.部门)

Common Name (eg, your name or your server's hostname) []:ca.example.com <==CA持有者名或者所在服务器主机名(即域名)

Email Address []:caadmin@example.com <==CA管理员邮件地址,可以省略

这些就是认证的时候可以选择认证的内容,目前来说域名是比较重要的,重要到本文中的域名二字全都是加粗的。

如果读者仔细看了上述的所有内容并且理解了的话,就会产生一个疑问:公钥在哪?貌似并没有生成公钥的环节。这个问题我也思考了很久,网上也没有找到相关的解答,经过思考和分析以后我认为是这样的:在生成证书的第三步(生成证书.crt文件)的时候,根据私钥生成了一个对应的公钥,并直接写入了crt文件中。当然,这是我的分析,如果后续有更合理的解释,或者找到了正解的话,请致电纠正我,谢谢。

3、吊销证书

openssl ca -revoke /etc/pki/CA/newcerts/01.pem

吊销记录在index.txtca.crl中。

4、服务端开启ssl认证

nginx开启单向认证:

upstream broker{
    server 192.168.4.41:1885; #emq路径和端口号,emq配置文件里的端口号和nginx中1883配置文件中的端口号保持一致
}
server {
    error_log /var/log/nginx/1883_error.log;
    listen 1883 ssl;
    proxy_connect_timeout 600s;
    #proxy_timeout 3s;
    proxy_pass broker;

    ssl_certificate       /etc/nginx/ssl/server/server.crt;
    ssl_certificate_key   /etc/nginx/ssl/server/server.key;
    ssl_protocols         SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers           HIGH:!aNULL:!MD5;
    ssl_session_cache     shared:SSL:20m;
    ssl_session_timeout   4h;
    ssl_handshake_timeout 30s;
}

nginx开启双向认证:

server {
    error_log /var/log/nginx/1884_error.log;
    listen 1884 ssl;
    proxy_connect_timeout 600s;
    #proxy_timeout 3s;
    proxy_pass broker;

    ssl_verify_client on;
    ssl_client_certificate /etc/nginx/ssl/ca/ca.crt;
    ssl_certificate       /etc/nginx/ssl/server/server.crt;
    ssl_certificate_key   /etc/nginx/ssl/server/server.key;
    ssl_protocols         SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers           HIGH:!aNULL:!MD5;
    ssl_session_cache     shared:SSL:20m;
    ssl_session_timeout   4h;
    ssl_handshake_timeout 30s;
}

nginx开启证书有效性认证(被吊销的证书无法通过认证):

ssl_crl /etc/nginx/admin/ca.crl;#启用吊销证书检查

每次有新的证书吊销之后都需要reload一下nginx

emq中的证书配置见emq文档中。

5、验证证书的有效性

openssl x509 -in xxx.crt -noout -text #查看证书的详细内容,包括**域名**等信息

openssl verify -CAfile ca.crt server.cer #用ca.crt校验server.crt,查看是否合法,即server.crt是否是由 ca.crt签发的                     

6、另附详细教程:

https://blog.csdn.net/u014721096/article/details/78571287

https://blog.csdn.net/ustccw/article/details/76691248


“The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time.” – Tom Cargill

标  题SSL认证原理、证书生成及校验
作  者Leif160519
出  处https://github.icu/articles/2019/08/23/1566523178595.html
关于博主:坐标六朝古都南京,服务器运维工程师+桌面运维工程师,如有问题探讨可以直接下方留言。
声援博主:如果您觉得文章对您有帮助,可以评论、订阅、收藏。您的鼓励是博主的最大动力!