热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

RSA的主场证书签名之OpenSSL演示

在上一篇非对称加密--RSA原理浅析中,我们了解了RSA加密的数学原理,RSA的安全性目前虽然得到公认,但它同样也有缺点:加

 在上一篇非对称加密--RSA原理浅析中,我们了解了RSA加密的数学原理,RSA的安全性目前虽然得到公认,但它同样也有缺点:加密速度慢、性能较低,不适合对大文件直接做加密,需要加密的原始数据通常会先经过Base64、Hash、对称加密等处理后,再用RSA对其进行加密,因此RSA最主要的应用场景,是数字签名--对数据做身份/合法性校验。
 权威的证书颁发机构--躺着赚钱的CA,就是用的RSA这一套算法,这一篇我们一起用命令行来逐步拆解证书的生成过程,揭开证书背后的秘密。Talk is cheap,show you the code,Come on!

什么是OpenSSL

 SSL大家都不陌生,我们访问网站的时候,以HTTPS开头的表示你和服务器之间传输的数据经过了加密,这里所使用的加密协议就是SSL(Secure Sockets Layer,后来又推出了它的后续版本,改名叫TLS)。也就是说,把HTTP协议经过一层SSL协议进行加密包装,就变成了HTTPS。当然,SSL/TLS还用在很多协议中,例如VPN、加密的电子邮件协议等。
 那OpenSSL是啥?在SSL协议中,我们使用了很多密码学手段来保护数据,其中包括对称密码、公钥密码、数字签名、证书、完整性校验、伪随机数生成等。由于这些算法和操作都非常复杂,于是开源社区就开发了一套库,这个库里面提供了很多现成的标准方法,其他开发者只要用正确调用这些方法,就可以实现SSL协议中的各种加密/解密操作了。因此,OpenSSL是一套开源的密码学工具包(open source cryptography toolkit)。情理之中的,OpenSSL也支持了RSA算法,接下来我们就用OpenSSL在macOS的终端上为大家演示证书签名的每一个步骤。

RSA加密、证书生成终端演示

 为了便于观察,请开辟并前往一个空文件夹下开始你的表演~
输入:

openssl genrsa -out private.pem 2048

此时目录中出现一个private.pem文件,这个文件包含了私钥信息
根据私钥生成公钥
输入:

openssl rsa -in private.pem -pubout -out public.pem

分别查看文件中的内容:

cat private.pem

cat public.pem

你会得到这样类似这样的结果:

-----BEGIN RSA PRIVATE KEY-----
Base64编码的内容
-----END RSA PRIVATE KEY-----

-----BEGIN PUBLIC KEY-----
Base64编码的内容
-----END PUBLIC KEY-----

现在我们随便写一个txt文件作为要加密的数据:

echo "hello word\!" > message.txt

用公钥对其加密:

openssl rsautl -encrypt -in message.txt -inkey public.pem -pubin -out enc.txt

查看加密后的文件:cat enc.txt,你只能看到一堆乱码
用私钥对加密文件解密:

openssl rsautl -decrypt -in enc.txt -inkey private.pem -out dec.txt

查看解密结果:cat dec.txt,与你的message.txt内容完美吻合~
上面的过程反过来(私钥加密 公钥解密)一个道理,但执行命令有点区别:
用私钥对其加密:

openssl rsautl -sign -in message.txt -inkey private.pem -out enc.bat

用公钥对加密文件解密:

openssl rsautl -verify -in enc.bat -inkey public.pem -pubin -out dec.txt

 至此,我们已经完成了RSA加密解密的操作,那我们开发中用的证书跟它们有什么关系呢?做iOS开发的都用钥匙串从CA请求过csr文件,其实就是根据当前Mac内置的私钥(当然你也可以自己指定私钥)生成对应的公钥,生成的csr文件包含了公钥证书原始文件+你的服务器信息和单位等信息。我们来用命令执行这一步操作:

openssl req -new -key private.pem -out rsacert.csr

根据提示依次输入下列信息并回车:

Country Name (2 letter code) []:
State or Province Name (full name) []:
Locality Name (eg, city) []:
Organization Name (eg, company) []:
Organizational Unit Name (eg, section) []:
Common Name (eg, fully qualified host name) []:
Email Address []:
A challenge password []:

拿到带着公钥信息的csr文件之后,下一步就是交给CA认证中心进行签名,也就是让CA盖个章(一个章一年五千大洋@_@,如果你的https用自签的证书那别人访问时有不安全提示就是因为你没有CA盖的这个章,不被承认是安全的):

openssl x509 -req -days 3650 -in rsacert.csr -signkey private.pem -out rsacert.crt

这时得到的crt文件是Base64编码的,我们需要转成DER二进制格式的证书才能直接使用:

openssl x509 -outform der -in rsacert.crt -out rsacert.der

这个rsacert.der文件就是包含了我们公钥信息的证书!

最后一步,导出公钥证书对应的私钥证书:

openssl pkcs12 -export -out p.p12 -inkey private.pem -in rsacert.crt

输入两次私钥证书的密码就得到了我们最熟悉的.p12文件。
 当然,在我们实际开发中不会同时拿到这两个证书,这里只是给大家演示它们之间的关系,后面我会对苹果的双向验证(双层签名)原理专门写一篇文章讲解

补充

 关于.pem文件内部的数据结构可以通过命令

openssl rsa -in private.pem -text -out ptivate.txt

查看,ptivate.txt文件中每一项的具体意义请参考(PEM格式)解析
 在上面的命令中如果有些不明觉厉的玩意儿,那多半是你对证书相关的文件编码格式、协议和扩展名不太熟悉,不要慌,我已经为你准备好了加餐,记得别只默默收藏吖!关注点赞不迷路~
\(^o^)/

证书文件编码格式、扩展名、协议科普---高能预警

 我们统一采用X.509的格式标准生成证书,接触过证书的同学看到:pem、der、pfx、jks、kdb、cer、key、csr、crt、crl、ocsp、scep等这些字眼一定不会完全陌生,这些东东究竟是个啥?赶紧来一探究竟,有描述不准确的地方还望指正:

  • 编码格式
    • DER:(Distinguished Encoding Rules)的缩写,它是大多数浏览器的缺省格式,并按 ASN1 DER 格式存储,它是无报头的。可包含所有私钥、公钥和证书。
    • PEM:(Privacy Enhanced Mail)的缩写,它是OpenSSL默认采用的信息存放方式,它存储用Base64编码的DER格式数据,用ASCII报头包围,因此适合系统之间的文本模式传输。可以包括所有私钥、公钥和证书。
  • 文件扩展名
    • .pem - (隐私增强型电子邮件) DER编码的证书再进行Base64编码的数据存放在"-----BEGIN CERTIFICATE-----"和"-----END CERTIFICATE-----"之中
    • .cer, .crt, .der - 通常是DER二进制格式的证书,但Base64编码后也很常见
    • .p7b, .p7c - PKCS#7 SignedData structure without data, just certificate(s) or CRL(s),加密消息语法(pkcs7),是各种消息存放的格式标准。这些消息包括:数据、签名数据、数字信封、签名数字信封、摘要数据和加密数据。
    • .p12 - PKCS#12格式,包含证书的同时可能还有带密码保护的私钥
    • .pfx - PFX,PKCS#12之前的格式(通常用PKCS#12格式,比如那些由IIS产生的PFX文件)
    • .jks - 通常可以将Apache/OpenSSL使用的“.key文件 + .crt文件”格式转换为标准的Java Key Store(JKS)文件。JKS文件格式被广泛的应用在基于JAVA的WEB服务器、应用服务器、中间件。你可以将JKS文件导入到TOMCAT、WEBLOGIC 等软件
    • .kdb - 通常可以将Apache/OpenSSL使用的“.key文件 + .crt文件”格式转换为标准的IBM KDB文件。KDB文件格式被广泛的应用在IBM的WEB服务器、应用服务器、中间件。你可以将KDB文件导入到IBM HTTP Server、IBM Websphere 等软件
    • .csr - 证书请求文件(Certificate Signing Request)。生成X509数字证书前,一般先由用户提交证书申请文件,然后由 CA 来签发证书。
    • .key - 一般指PEM格式的私钥文件,也可能是DER格式的
    • .crl - 证书吊销列表 (Certification Revocation List)是一种包含撤销的证书列表的签名数据结构。CRL是证书撤销状态的公布形式,CRL 就像信用卡的黑名单,用于公布某些数字证书不再有效。CRL是一种离线的证书状态信息。它以一定的周期进行更新。CRL可以分为完全CRL和增量CRL。在完全CRL中包含了所有的被撤销证书信息,增量CRL由一系列的CRL来表明被撤销的证书信息,它每次发布的CRL是对前面发布CRL的增量扩充。基本的CRL信息有:被撤销证书序列号、撤销时间、撤销原因、签名者以及 CRL 签名等信息。基于CRL的验证是一种不严格的证书认证。CRL能证明在CRL中被撤销的证书是无效的。但是,它不能给出不在CRL中的证书的状态。如果执行严格的认证,需要采用在线方式进行认证,即OCSP认证。一般是由CA签名的一组电子文档,包括了被废除证书的唯一标识(证书序列号),CRL用来列出已经过期或废除的数字证书。它每隔一段时间就会更新,因此必须定期下载该清单,才会取得最新信息
  • 协议
    • OCSP – 在线证书状态协议(Online Certificate Status Protocol,rfc2560),用于实时表明证书状态。OCSP 客户端通过查询 OCSP 服务来确定一个证书的状态,可以提供给使用者一个或多个数字证书的有效性资料,它建立一个可实时响应的机制,让用户可以实时确认每一张证书的有效性,解决由CRL引发的安全问题。。OCSP 可以通过 HTTP协议来实现。rfc2560 定义了 OCSP 客户端和服务端的消息格式
    • SCEP - 简单证书注册协议(Simple Certificate Enrollment Protocol),基于文件的证书登记方式需要从您的本地计算机将文本文件复制和粘贴到证书发布中心,和从证书发布中心复制和粘贴到您的本地计算机。SCEP可以自动处理这个过程但是CRLs仍然需要手动的在本地计算机和CA发布中心之间进行复制和粘贴

实践出真知,我们下篇再会~ 老规矩,有问题请踊跃留言。

更多一手好文更新
请关注我的个人微信公众号:面向未来编程
撒花✧(≖ ◡ ≖✿)



推荐阅读
author-avatar
小虎
每一天,不管用什么方式,我都要变得越来越好!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有