openssl 简介
openssl是web安全通信的基石
基础知识
SSL
Secure Socket Layer(安全套接字层)
主要是防止信息在互联网上传输的时候不被窃听或者篡改
数字签名
将报文使用一定的 HASH 算法算出一个固定位数的摘要信息,然后用私钥将摘要加密,连同原来的报文一起,发送给接收者。
接受者通过公钥将摘要解出来,再通过 HASH 算法算出报文摘要,对比两者。
如果两个摘要一致,说明数据未被篡改,数据是完整的。
数字签名具有证明发送者身份和防篡改的功能。
数字证书
由CA颁发给网站的身份证书,里面包含了该网站的公钥,有效时间,网站的地址,CA的数字签名等。
手动查看方式:
实际上就是使用了CA的私钥将网站的公钥等信息进行了签名,当客户端请求服务器的时候,网站会把证书发给客户端,客户端首先可以通过CA的数字签名校验CA的身份,也能证明证书的真实完整性
CA的地址是内嵌在浏览器中的,很难被篡改。
SSL如何保护数据
1)认证用户和服务器,确保数据发送到正确的客户端和服务器;
2)加密数据以防止数据中途被窃取;
3)维护数据的完整性,确保数据在传输过程中不被改变。
认证用户和服务器
怎么知道自己访问的是真百度还是假百度?是不是有可能有人劫持了我们访问百度的请求,然后路由给了一台他伪造的服务器?
在SSL的通信流程中做了这样一个规定:一旦我们向服务器发送了请求后,服务器必须返回它的数字证书,当我们拿到数字证书之后,我们可以根据里面的ca数字签名,校验证书的合法性(不是被伪造的)
假设百度服务器是假冒的,他一定没有正确的私钥,那么之后的通信都无法进行,所以假冒服务器是无法操作的。
由此,SSL就解决了服务器认证的问题。
加密数据以防止数据中途被窃取
客户端第一次给服务器发送请求的时候(拿到证书前的一次),会在请求里面放一个随机数C1;
服务器在返回证书的响应里也会带一个随机数F;
客户端拿到证书后,会使用公钥加密一个随机数C2送给服务器。
这样客户端、服务器都拥有了三个随机数:C1、F、C2。
双方使用这些随机数和一个相同的算法生成一个对称密钥,之后所有的通信都使用这个对称密钥来进行。
这个密钥会不会被泄露呢?不会,因为密钥是由3个随机数产生的,对于第一个随机数C1,他可能会被中间人监听到,然后第二个随机数F,也可能会被中间人监听到,但是第三个随机数C2,因为是用公钥加密的,除非中间人有私钥,否则是不可能解出来的。
维护数据的完整性
针对服务器发送数字证书这一过程来说,
服务器的数字证书中含有ca数字签名,可以很有效的保证证书的真实性和完整性(没有被篡改)
openssl
参考:https://segmentfault.com/a/1190000014963014
参考:《OpenSSL与网络信息安全-基础、结构和指令》
//博客资料太少
SSL只是一个协议,openssl则是SSL的实现版
openssl还包含了公钥私钥的生成、摘要生成等各种工具。
生成 RSA 密钥 - genrsa 指令
- RSA 最重要的就是私钥的保密性,所以会用对称加密再对私钥加密
- 对于 OpenSSL 来说,文件名和其后缀都是没有特别含义的,你可以取任意名字,当然,习惯的用法是以格式来指令后缀,比如 “pem”。
- 注意参数的顺序,加密类型可以放在口令之前,位长建议放在最后。
举例:
生成一个 1024 位的 RSA 密钥,并输出到 rsaprivkey.pem 文件中.
1 | OpenSSL>genrsa -out rsaprivkey.pem 1024 |
生成一个 1024 位的 RSA 密钥,并采用 DES3 算法进行加密, 并输出到 > rsaprivkey.pem 文件中.
1 | OpenSSL>genrsa -out rsaprivkey.pem -des3 -passout pass:xY*&2wG |
(外接硬件设备的例子略)
管理 RSA 密钥 - genrsa 指令
- 功能一:对私钥加密/更改对私钥加密的方式(公钥加密无意义)/去掉加密
- 功能二:明文输出文件中保存的内容
举例:
将一个加密的 PEM 编码的 RSA 私钥(privkey.pem ) 转换成一个不加密的 PEM 编码的 RSA 私钥
1 | OpenSSL>rsa -in privkey.pem -passin pass:1234567 -out privkey.pem |
原来使用 DES3 加密的 RSA 私钥保存不够安全,而想要使用 256 位 AES 算法加密的时
1 | OpenSSL>rsa -in privkey.pem -passin pass1234567 -passout xY*&2wG -aes256 |
对于明文输出文件保存内容的例子并不令人满意……
Normal_RSA 题解里面的
1 | openssl>rsa -pubin -text -modulus -in warmup -in pubkey.pem |
不知道他怎么弄出来的,就连在《openssl-cookbook》也没找到其中的一些参数。
参看:https://www.jianshu.com/p/bb2f50862025
简单地生成私钥 d :
1 | openssl> genrsa -out private.pem 1024 |
提取公钥 e :
1 | openssl> rsa -in private.pem -pubout -out public.pem |
对明文进行加密
1 | openssl> rsautl -encrypt -in message.txt -inkey public.pem -pubin -out enc.txt |
对明文进行解密
1 | openssl> rsautl -decrypt -in enc.txt -inkey private.pem -out dec.txt |