OpenSSL

OpenSSL
 最后更新于 2024年10月02日 22:58:57

基本原理

HTTP协议采用明文传输数据,当涉及敏感信息的传送时,极有可能会受到窃听或者中间人的攻击。HTTPS是HTTP与SSL/TLS的组合,即使用加密通讯以及网络服务器的身份鉴定来进行信息的安全传输。其核心有二:

  • 使用证书对服务器及请求端的身份验证
  • 使用一组对称秘钥加密包括请求头在内的所有信息传输

握手流程

  • HTTPS链接的建立过程中涉及到服务器端证书、客户端证书(可选)、服务器端的非对称秘钥以及后续通信过程中使用的对称秘钥几个内容。
  • 客户端对HTTPS的地址发出请求,并且将自己的SSL版本号等信息发送给服务器
  • 服务器接收到请求,将服务器证书和公钥等信息返回给客户端
  • 客户端接收到证书后向证书颁发机构验证证书的合法性。如果证书不合法(比如自行签发的证书),则向用户发出警告并确认是否继续,用户可以选择在此时离开终止HTTPS的链接。
  • 证书合法或客户端确认在不安全的情况下继续,客户端生成pre-master secret并且使用2中收到的服务器公钥加密后发送给服务器。如果是使用交互策略的TLS,则同时需要将客户端的证书发送给服务器。服务器检查客户端的证书颁发机构是否在信任列表中,以及证书内容是否合法。若不合法,结束本次会话。
  • 服务器使用私钥解密pre-master secret,然后双方通过一种实现商定好的加密算法生成本次通讯使用的master secret。
  • 双方互相通知对方本次SSL握手成功,其后均使用master secret对传输内容进行加密

为什么要单独使用另外一组对称秘钥来实现对信息的加密而不直接使用服务器和客户端双方的非对称秘钥呢? 传输过程使用对称密钥是因为对称加密比非对称加密的运算量低一个数量级以上,所以这样的方式可以提高双方会话的运算速度。

环境配置

  1. 执行OpenSSL的安装程序
  2. 设置环境变量 Path D:\Program Files (x86)\OpenSSL-Win64\bin
  3. 创建一个用来创建证书的文件夹(可省略)
index.txt      // OpenSSL在创建自签证书时会向该文件里写下索引
database.txt   // OpenSSL会模拟数据库将一些敏感信息写在该文件里
serial.txt     // 创建该文件后,在第一行写下 01

命令

生成私钥

可以对私钥再次加密,确保私钥安全。如果设置了密码,当私钥解密公钥加密后的密文时,需要先将私钥解密才可以。

$ openssl genrsa -out rsa_1024_priv.pem 1024 // 不加密生成秘钥
$ openssl genrsa -des3 -out root.key 2048 // 加密生成秘钥
Generating RSA private key, 2048 bit long modulus
……………………….+++
……….+++

e is 65537 (0x010001)
Enter pass phrase for root.key: [密码]
Verifying - Enter pass phrase for root.key: [确认密码]

生成CSR请求文件

$ openssl req -new -key root.key -out root.csr
Enter pass phrase for root.key: [root.key文件的密码]

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
——-
Country Name (2 letter code) [AU]:CN [国家]
State or Province Name (full name) [Some-State]:AnHui [州/省份]
Locality Name (eg, city) []:HeFei [城市]
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Mouse [公司]
Organizational Unit Name (eg, section) []:IT [行业]
Common Name (e.g. server FQDN or YOUR name) []:www.xulizhong.top [域名]
Email Address []:672737283@qq.com [邮件地址]

Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []: [不填]
An optional company name []: [不填]

删除根证书的密码

服务器端需要读取未加密的私钥文件,可以不去除但服务端需要做配置

$ openssl rsa -in root.key -out root.key
Enter pass phrase for root.key: [root.key文件密码]

writing RSA key

生成签名证书

通过私钥和csr生成签名证书,有效期是365天,但不被浏览器认可(可省略)

$ openssl x509 -req -days 365 -in root.csr -signkey root.key -out root.crt

Signature ok
subject=C = CN, ST = AnHui, L = HeFei, O = Mouse, OU = IT, CN = www.xulizhong.top, emailAddress = 672737283@qq.com

Getting Private key

生成公钥文件

openssl rsa -pubout -in rsa_1024_priv.pem -out rsa_1024_pub.pem