使用免费的 HTTPS

228 阅读3分钟

要免费使用 HTTPS 可以使用 Let's Encrypt 提供的免费 SSL 证书。

注释: Let's Encrypt 是一个非营利性的证书颁发机构,免费提供用于 TLS 加密的 X.509 证书,旨在推广 HTTPS 的广泛使用,创建一个更安全、更尊重隐私的全球网络。

获取证书

Let's Encrypt,找到快速开始教程,跟着教程走就可以完成整个流程了。获取证书后,通常会得到以下四个文件:

  1. cert.pemfullchain.pem:这是你的服务器证书。cert.pem 只包含你的证书,而 fullchain.pem 包含了你的证书和所有的中间证书。大多数服务器都需要 fullchain.pem
  2. chain.pem:这是中间证书,它证明了你的证书是由 Let's Encrypt 颁发的。
  3. privkey.pem:这是你的私钥。你的服务器需要它来解密客户端发送的信息。
  4. dhparam.pem:这是 Diffie-Hellman 参数文件,用于 Perfect Forward Secrecy。这个文件不是必须的,但是有些服务器可能需要它。

以上文件通常存储在 /etc/letsencrypt/live/your_domain_name/ 目录下,其中 your_domain_name 是你的域名。你需要在你的 web 服务器的配置文件中指定这些文件的位置,以便服务器可以使用这些证书来提供 HTTPS 服务。

1、安装 Certbot

Certbot 可以帮助我们自动化安装证书非常方便。可以在 Certbot 的官网上找到详细的安装和使用说明:certbot.eff.org/

安装流程不细讲了,文档写的肯定比我清楚。这里讲一下获取证书的命令

// /var/www/html 是前端静态资源的路径
sudo certbot certonly --webroot -w /var/www/html -d yourdomain.com

注释: 运行 sudo certbot certonly --webroot -w /root/ai-tools-web/dist -d yourdomain.com 这个命令时,Certbot 会在你指定的 webroot 目录(在这个例子中是 /root/ai-tools-web/dist)下的 /.well-known/acme-challenge/ 子目录中创建一个临时文件。然后,Let's Encrypt 会尝试访问这个文件来验证你的域名。这个临时文件只在证书获取过程中需要,一旦证书获取成功,Certbot 就会自动删除这个文件。因此,你通常不会在你的 webroot 目录中看到这个文件。

2、配置证书

这个步骤具体的操作会根据使用的 web 服务器的类型而有所不同。你可以在你的 web 服务器的官方文档中找到相关的配置说明。都有相应的配置 Nginx、Nodejs...
Nginx 配置参考

server {
    listen 80;
    listen 443 ssl;

    ssl_certificate /etc/nginx/certs/fullchain.pem;
    ssl_certificate_key /etc/nginx/certs/privkey.pem;

    location / {
        root /usr/share/nginx/html;
        index index.html;
    }
}

Nodejs 配置参考

import http from 'http'
import https from 'https'
import fs from 'fs'
import express from 'express'
// ...

const app = express()
// ...

const httpsOptions = {
  key: fs.readFileSync('./path/to/key.pem'),
  cert: fs.readFileSync('./path/to/cert.pem')
}

http.createServer(app).listen(7001, () => {
  console.log('HTTP Server running on port 7001')
})

https.createServer(httpsOptions, app).listen(7002, () => {
  console.log('HTTPS Server running on port 7002')
})

3、定期更新证书

最后定期更新你的 SSL 证书。Let's Encrypt 提供的证书有效期为 90 天,所以你需要每 90 天更新一次证书。可以设置一个定时任务,自动运行 Certbot 来更新证书。

讲讲坑

我在配置过程遇到了一些坑:

证书到底放在哪里?

上面说到证书通常放在 /etc/letsencrypt/live/your_domain_name/ 目录下:

image.png

但是其实证书并不在这里!我们换个命令看看

image.png

所有证书都算一个软链接,这个链接指向另一个地方.....

由于这个原因我在启动 Docker 容器的时候挂载的 /etc/letsencrypt/live/your_domain_name/ 目录,在容器中服务启动的时候根本找不到证书导致容器启动失败。所以在挂载证书的时候需要确认一下证书究竟是放在哪个目录下面的。

注释 软链接(符号链接) :软链接是一个特殊的文件,它包含了另一个文件或目录的路径。软链接可以跨越文件系统,也可以链接到目录。然而,如果原始文件被删除,软链接将会失效,因为它的目标路径不再存在。