前言之HTTP和HTTPS
- HTTP 是未加密的协议,数据以明文形式传输,容易被监听和篡改,不适合传输敏感信息。
- HTTPS 则是基于SSL/TLS协议的加密传输,能有效防止数据在传输过程中被窃取或篡改,适合处理敏感数据,如银行交易、个人信息等
- HTTP 默认使用端口 80。HTTPS 使用端口 443,这是为了区分和标记安全连接。
- HTTP 连接不需要证书。HTTPS 需要从受信任的证书颁发机构(CA)获取SSL证书,这不仅能加密数据,还能验证服务器的身份,防止中间人攻击。
So,HTTPS的证书该如何获取呢? 第一种方式是去阿里云/腾讯云的服务商上白嫖一年的证书。第二种是去服务商上购买, 稳定但有点贵。最后一种就是今天介绍的, 免费获取 Let’s Encrypt SSL 安全证书( 每三个月过期, 需自动续期 )
工具和方式选择
一些概念
- Let‘s Encrypt - 提供免费的 HTTPS 证书,但需要定期更新
- lego Go 语言实现的 Let’s Encrypt 客户端及 ACME 库
- certbot - Let’s Encrypt 官方推荐的客户端
方式
使用证书验证域名有两种方式
HTTP 方式 - 在域名对应的网站指定目录下放验证文件,不支持通配符证书验证
DNS 方式 - 在域名 DNS 中添加 TXT 记录解析验证文本,都支持,但如果要实现自动更新,需要 DNS 服务器提供 API
通过certbot生成证书
安装certbot
wget https://dl.eff.org/certbot-auto
chmod a+x ./certbot-auto
./certbot-auto --help
注意: 网上一堆都是这种安装方式,但是其实这种安装方式已经不能用了
在官网上的安装指南certbot.eff.org
根据自己的需要选择, 我这边选择的Web Hosting Product on Centeros 8
然后拉下去有安装使用步骤
首先要安装snapd ( 其实就是一个包管理器 ) , snapcraft.io/docs/instal…, 点进去选择centeros
然后按着安装步骤走
sudo yum install snapd
sudo systemctl enable --now snapd.socket
sudo ln -s /var/lib/snapd/snap /snap
至此snapd安装完成了, 下面就可以安装certbot了
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
安装完成, 可以开始生成证书了
webroot命令生成证书
certbot certonly --webroot -w /var/www/example(你的项目目录) -d www.example.com(你的域名)
注意:这种方式一定要现在项目的根目录里创建
.well-known/acme-challenge
mkdir -p .well-known/acme-challenge
证书生成目录
/etc/letsencrypt/live/www.example.com
使用, 以nginx为例
listen 443 ssl;
server_name www.example.com;
ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;
更新证书命令
sudo certbot renew --dry-run
standalone命令生成证书
sudo certbot certonly --standalone -d www.example.com(你的域名)
--standalone
选项让Certbot临时启动一个HTTP服务器来验证域名所有权, 不需要指定web服务器插件证书生成目录和使用方式同上
dns命令生成证书
先安装dns插件
查找相关插件
snap find certbot-dns
这边咱们以阿里云certbot-dns-aliyun
的dns插件为例
sudo snap install certbot-dns-aliyun
配置插件
sudo snap set certbot trust-plugin-with-root=ok
sudo snap connect certbot:plugin certbot-dns-aliyun
配置成功, 使用 certbot plugins命令查看插件是否安装成功
然后配置密钥, 创建文件配置文件cloudflare.ini,
dns_aliyun_access_key = 阿里云访问控制的key
dns_aliyun_access_key_secret = 阿里云访问控制的secret
到此, 就可以生成证书
certbot certonly --authenticator=dns-aliyun --dns-aliyun-credentials=credentials.ini所在的目录 -d www.example.com -d *.example.com
通过lego生成证书
下载安装legogithub.com/go-acme/leg…
# 下载
wget https://github.com/go-acme/lego/releases/download/v4.16.1/lego_v4.16.1_linux_amd64.tar.gz
# 解压
tar -xvf lego_v4.16.1_linux_amd64.tar.gz lego
证书生成
ALICLOUD_ACCESS_KEY=阿里云访问控制key \
ALICLOUD_SECRET_KEY=阿里云访问控制secret \
# --path 为配置和证书生成目录,如果不指定默认为 `./.lego`
# --dns 为 DNS 服务器 Code
./lego --email="xxx@qq.com" --domains="www.example.com" --domains="*.example.com" --dns="alidns" run
生成生成目录在./.lego/certificates
最后将证书配置在nginx上就可以了
手动更新证书
# --renew-hook="nginx -s reload",表示刷新证书成功后执行的命令,nginx需要重载证书
ALICLOUD_ACCESS_KEY=阿里云访问控制key \
ALICLOUD_SECRET_KEY=阿里云访问控制secret \
./lego --email="xxx@qq.com" --domains="www.example.com" --domains="*.example.com" --dns="alidns" run
openssl证书和Let's Encrypt证书的区别
最后说一下openssl证书和Let's Encrypt证书的区别
openssl
和 Let's Encrypt
证书的主要区别在于它们的来源、管理和应用场景:
OpenSSL证书:
- 自签名或内部CA: OpenSSL 是一个强大的安全套件,可以用来生成自签名的证书或是作为内部证书颁发机构(CA)的一部分来签发证书。自签名证书在本地测试环境中很常见,但因未被外部信任机构认可,所以不适合用于公共互联网上的网站。
- 灵活性: 使用 OpenSSL,你可以完全控制证书的生成过程,包括密钥长度、算法、有效期等。这对于创建测试环境或特定用途的证书非常有用。
- 信任问题: 自签名的 OpenSSL 证书在大多数浏览器和操作系统中不会自动信任,会导致访问者看到不安全的警告信息。
Let's Encrypt 证书:
- 受信任的CA: Let's Encrypt 是一个公开信任的证书颁发机构,由互联网安全研究小组(ISRG)运营。这意味着它的证书在所有主流浏览器和操作系统中都是预加载并自动信任的,适合用于任何公开访问的网站。
- 免费且自动化: Let's Encrypt 提供免费的SSL/TLS证书,并通过自动化流程简化了证书的申请、安装和续期过程。这对于没有专门IT团队的小型网站特别友好。
- 短期有效期: Let's Encrypt 证书的有效期较短,通常为90天,鼓励频繁更新以提高安全性,但同时也需要自动化工具(如Certbot)来实现无缝续期。
- 自动化工具支持: 使用Certbot等工具,可以自动化Let's Encrypt证书的申请、安装和续期过程,减少人工干预和错误。