删除 certbot 自动续期任务
删除 /etc/letsencrypt/renewal/ 相应的配置文件,如果有必要的话,删除 /etc/letsencrypt/live/ 和 /etc/letsencrypt/archive/ 目录下的证书文件夹。
删除 /etc/letsencrypt/renewal/ 相应的配置文件,如果有必要的话,删除 /etc/letsencrypt/live/ 和 /etc/letsencrypt/archive/ 目录下的证书文件夹。
对称加密是一种加密算法,其中加密和解密使用同一个密钥。它的工作原理是,发送方用密钥对数据进行加密,接收方使用相同的密钥来解密数据。由于加密和解密过程中使用的密钥是相同的,因此被称为“对称”。
非对称加密是一种加密算法,它使用一对密钥:公钥和私钥。这对密钥中的一个用于加密,另一个则用于解密。公钥可以公开给任何人,而私钥必须由所有者保密。非对称加密解决了对称加密中“密钥分发”的难题,因为加密和解密使用不同的密钥。
由于使用不同的密钥,加密和解密过程更加安全,尤其是在公钥公开的情况下,只有持有对应私钥的人才能解密密文。
公钥和私钥是非对称加密算法中的两种密钥,它们共同构成一对密钥,用于加密和解密数据。这两个密钥具有特殊的数学关系:使用一个密钥加密的数据,必须用另一个密钥来解密。
加密和解密:
由于公钥可以公开,任何人都能加密消息,但只有持有私钥的人能解密。
数字签名:
这种机制确保了消息的完整性和发送者的身份,防止了数据篡改和伪造。
HTTPS(超文本传输安全协议)使用了对称加密、非对称加密和数字证书来保证通信的安全性。这个过程大致可以分为以下几个步骤:
建立安全连接:
当浏览器连接到 HTTPS 网站时,服务器会发送其 SSL 证书给浏览器。这个证书包含了服务器的公钥,以及由可信任的证书颁发机构(CA)签名的证书信息。
验证证书:
浏览器会验证证书的有效性,包括检查证书是否过期、是否由可信的 CA 签发等。这一步骤可以确保浏览器连接到的确实是预期的服务器,而不是某个冒充的恶意服务器。
生成会话密钥:
验证通过后,浏览器会生成一个随机的对称密钥(会话密钥)。然后使用服务器的公钥对这个会话密钥进行加密。
密钥交换:
浏览器将加密后的会话密钥发送给服务器。服务器使用自己的私钥解密,获得会话密钥。
安全通信:
此后,浏览器和服务器就可以使用这个共享的会话密钥,通过对称加密算法来加密它们之间的所有通信内容。
为什么要使用这些技术:
非对称加密(公钥加密):
对称加密:
CA 证书:
通过结合使用这些技术,HTTPS 能够:
这种方式既保证了安全性,又兼顾了效率,是目前互联网上广泛使用的安全通信方式。
http {
server {
# 网站端口
listen 443 ssl;
# 网站域名
server_name urdomain.com;
# 证书地址
ssl_certificate /etc/letsencrypt/live/urdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/urdomain.com/privkey.pem;
location / {
#本地服务地址
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
现在很多环境下的网络请求要求必须是 https 请求,但是在开发或者内网环境下,无法使用 CA 机构颁发的证书,这时候可以使用 OpenSSL 提供的自签证书功能:
在 windows 系统下,可以使用 winget 来安装第三方分发版本:
winget search openssl
# 选择一个版本较新的分发版本
winget install FireDaemon.OpenSSL
重启终端
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout your-key.pem -out your-cert.pem
import { readFileSync } from "fs"
import { createServer } from "https"
import express from "express"
const app = express()
const server = createServer(
{
key: readFileSync("your-key.pem"),
cert: readFileSync("your-cert.pem"),
},
app,
)
server.listen(3000)
在 Node.js 中使用 fetch 请求接口可能会报错:
TypeError: fetch failed
at Object.fetch (node:internal/deps/undici/undici:11730:11)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5) {
cause: Error: self-signed certificate
at TLSSocket.onConnectSecure (node:_tls_wrap:1674:34)
at TLSSocket.emit (node:events:514:28)
at TLSSocket._finishInit (node:_tls_wrap:1085:8)
at ssl.onhandshakedone (node:_tls_wrap:871:12) {
code: 'DEPTH_ZERO_SELF_SIGNED_CERT'
}
}
指定环境变量 NODE_TLS_REJECT_UNAUTHORIZED='0' 即可
npx cross-env NODE_TLS_REJECT_UNAUTHORIZED='0' node index.js
bunx cross-env NODE_TLS_REJECT_UNAUTHORIZED='0' node index.js
pnpx cross-env NODE_TLS_REJECT_UNAUTHORIZED='0' node index.js
yarn dlx cross-env NODE_TLS_REJECT_UNAUTHORIZED='0' node index.js
import { readFileSync } from "fs"
import { createServer } from "https"
import { join } from "path"
import next from "next"
const app = next({})
const handle = app.getRequestHandler()
// https 证书相关
const key = readFileSync(join("/etc/letsencrypt/live", "yourdomain.com", "privkey.pem"), "utf8")
const cert = readFileSync(join("/etc/letsencrypt/live", "yourdomain.com", "cert.pem"), "utf8")
const ca = readFileSync(join("/etc/letsencrypt/live", "yourdomain.com", "chain.pem"), "utf8")
app.prepare().then(() => {
createServer({ key, cert, ca }, (req, res) => {
handle(req, res)
}).listen(3000)
})
import { readFileSync } from "fs"
import https from "https"
import express from "express"
const app = express()
app.get("/", async (req, res) => {
res.send("Hello, World!")
})
https
.createServer(
{
key: readFileSync("../root/.acme.sh/a.deep-sea.dynv6.net_ecc/a.deep-sea.dynv6.net.key"),
cert: readFileSync("../root/.acme.sh/a.deep-sea.dynv6.net_ecc/fullchain.cer"),
},
app,
)
.listen(8080)