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发给服务器,然后由服务器进行验证。具体流程见下图。
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.txt
、ca.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认证原理、证书生成及校验