TLS SSL

6718f5667fdef846c752fba43d68003.jpg

HTTPS

HTTPS,全称为 Hypertext Transfer Protocol Secure,是一种通过加密通道传输数据的安全协议。它是 HTTP 协议的安全版本,用于在 Web 浏览器和 Web 服务器之间进行安全的数据传输。HTTPS 在传输过程中使用了 SSL(Secure Sockets Layer)或 TLS(Transport Layer Security)协议来加密数据,确保敏感信息在传输过程中不会被窃取或篡改。

http 缺点

通信使用明文(不加密),内容可能会被盗用

不验证通信方的身份,因此有可能遭遇伪装

无法证明报文的完整性,所以有可能已遭篡改

https

信息加密

完整性校验

身份验证

HTTPS = http + TLS/SSL

TLS SSL

TLS(Transport Layer Security)和 SSL(Secure Sockets Layer)是用于保护网络通信的安全协议。它们都提供了加密和认证机制,用于确保数据传输的机密性和完整性。

SSL 是最早的安全协议,而 TLS 是在 SSL 的基础上发展起来的。目前广泛使用的版本是 TLS 1.2 和 TLS 1.3。TLS 1.3 是最新的协议版本,在安全性、性能和功能方面有一些改进。

TLS 和 SSL 主要用于以下两个方面:

  1. 加密通信:TLS/SSL 使用加密算法来对数据进行加密,防止第三方截获和窃听通信内容。它可以确保数据在传输过程中的隐私性。
  2. 身份认证:TLS/SSL 还提供了身份验证机制,用于确认通信双方的身份,并确保数据只发送到正确的接收方。这可以防止恶意用户冒充其他用户或服务器。

SSL 是最早的用来做https
TLS 是SSL升级版 提高了安全性 并解决了SSL存在的一些安全性问题

SSl/TLS 工作原理类似的

HTTP
TLS/SSL 安全层
TCP

加密

  1. 对称加密

常见的算法有 AES DES 加密

举例 麒麟->星月发消息 但是他们的消息不想被别人知道,采用了对称加密,于是他们两个协商了一段密钥,今生永相随

麒麟:AES算法 + 密钥(今生永相随)+明文(吃面) = XMZSXMZS==

星月:使用AES + 密钥(今生永相随)+密文( XMZSXMZS==) = 吃面

  1. 非对称加密

常见算法有RSA DSA 加密

举例 麒麟->星月发消息,这次使用的是非对称加密,生成了公钥和私钥,公钥可以对外公开,私钥必须只能麒麟知道不能泄露。

星月:RSA + 公钥 + 明文(吃面) = XMZS==

麒麟:RSA + 私钥 + 密文(XMZS==) = 吃面

openSSL 生成私钥

openSSL 安装

Mac电脑自带了

windows
https://www.openssl.org/source/

在 SSL/TLS 加密通信中,一般需要使用三个文件来完成证书相关操作,即:

  1. 私钥文件(例如 “private-key.pem”),用于对加密数据进行解密操作。

  2. 证书签名请求文件(例如 “certificate.csr”),用于向 CA 申请 SSL/TLS 证书签名。

  3. SSL/TLS 证书文件(例如 “certificate.pem”),用于对客户端发送的请求进行验证,以确保通信安全可靠。

私钥文件用于对数据进行解密操作,保证了通信的机密性;证书签名请求文件包含了请求者的身份信息和公钥等信息,需要被发送给 CA 进行签名,从而获取有效的 SSL/TLS 证书;SSL/TLS 证书文件则包含了签名后的证书信息,被用于客户端和服务器之间的身份验证,以确保通信的安全性和可靠性。

通过使用这三个文件进行密钥交换和身份验证,SSL/TLS 可以实现加密通信以及抵御可能的中间人攻击,提高了通信的安全性和保密性。

openssl genpkey -algorithm RSA -out private-key.pem -aes256

openssl: OpenSSL 命令行工具的名称。

genpkey: 生成私钥的命令。

-algorithm RSA: 指定生成 RSA 私钥。

-out private-key.pem: 将生成的私钥保存为 private-key.pem 文件。

-aes256: 为私钥添加 AES 256 位加密,以保护私钥文件不被未经授权的人访问。

Enter PEM pass phrase qwe123 密码短语生成pem文件的时候需要

生成pem 证书文件

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

  1. “req”: 表示使用 X.509 证书请求管理器 (Certificate Request Management) 功能模块。
  2. “-new”: 表示生成新的证书签名请求。
  3. “-key private-key.pem”: 表示使用指定的私钥文件 “private-key.pem” 来加密证书签名请求中的密钥对。
  4. “-out certificate.csr”: 表示输出生成的证书签名请求到文件 “certificate.csr” 中。该文件中包含了申请者提供的一些证书请求信息,例如公钥、授权主体的身份信息等。

Country Name (2 letter code) []:CN 国家

State or Province Name (full name) []:BJ 省份

Locality Name (eg, city) []:BJ 城市

Organization Name (eg, company)ZMY 组织或者是个人

Organizational Unit Name (eg, section) []:XMKJ 机构名称

Common Name (eg, fully qualified host name) []:localhost 域名

Email Address []: 邮箱地址

Please enter the following ‘extra’ attributes

to be sent with your certificate request

A challenge password []: 密码加盐 XMZSXMZSXMZS

openssl x509 -req -in certificate.csr -signkey private-key.pem -out certificate.pem

“x509”: 表示使用 X.509 证书管理器功能模块。

“-req”: 表示从输入文件(这里为 “certificate.csr”)中读取证书签名请求数据。

“-in certificate.csr”: 指定要读取的证书签名请求文件名。

“-signkey private-key.pem”: 指定使用指定的私钥文件 “private-key.pem” 来进行签名操作。一般情况下,签名证书的私钥应该是和之前生成 CSR 的私钥对应的。

“-out certificate.pem”: 表示将签名后的证书输出到文件 “certificate.pem” 中。该文件中包含了签名后的证书信息,包括签名算法、有效期、公钥、授权主体的身份信息等。

Enter pass phrase for private-key.pem: 密码短语

nodejs接口测试https

引入生成好的两个文件 certificate.pem private-key.pem

import https from 'node:https'
import fs from 'node:fs'
https.createServer({
    
    
    key: fs.readFileSync('private-key.pem'),
    cert: fs.readFileSync('certificate.pem'),
    //密码短语
    passphrase: 'qwe123'
}, (req, res) => {
    
    
    res.writeHead(200)
    res.end('success')
}).listen(443,()=>{
    
    
    console.log('server is running')
})

nginx配置https

终极大坑 如果在windows使用nginx配置https 私钥不能设置密码

  1. openssl genrsa -out nginx.key 2048 (生成私钥)
  2. openssl req -new -key nginx.key -out nginx.csr(生成签名文件)
  3. openssl x509 -req -in nginx.csr -signkey nginx.key -out nginx.crt(生成证书)

在nginx配置文件

    server {
       listen       443 ssl;
       server_name  localhost;

       ssl_certificate      nginx.crt;
       ssl_certificate_key  nginx.key;

       ssl_session_cache    shared:SSL:1m;
       ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

       location / {
           root   html;
           index  index.html index.htm;
       }
    }

image.png

猜你喜欢

转载自blog.csdn.net/qq1195566313/article/details/131350824