OpenSSL

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
2
openssl> genrsa -out private.pem 1024
// -out 输出文件 ; 1024 表示位数

提取公钥 e :

1
2
3
4
openssl> rsa -in private.pem -pubout -out public.pem
// -in 输入文件,这里是使用私钥;
//-pubout 输出公钥文件
//-out 输出,后跟目标文件

对明文进行加密

1
2
3
4
5
6
openssl> rsautl -encrypt -in message.txt -inkey public.pem -pubin -out enc.txt
// -encrpt 加密模式
// -in 输入文件,此时是明文
// -inkey 输入公钥
// -pubin 将公钥放进文件?
// -out 输出文件

对明文进行解密

1
2
3
4
5
openssl> rsautl -decrypt -in enc.txt -inkey private.pem -out dec.txt
// -decrpt 解密模式
// -in 输入文件,此时是密文
// -inkey 输入私钥
// -out 输出文件
------ The end ------

本文标题:OpenSSL

文章作者:Andy Wu

发布时间:2019年09月29日 - 15:09

最后更新:2019年11月01日 - 18:11

原始链接:https://zer0-nu1l.github.io/2019/09/29/OpenSSL/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。