目录
- 一、简介
- 二、SSL 证书类型介绍
- 三、公网 SSL 证书
- 3.1 证书管理工具
- 3.2 下载安装 acme.sh
- 3.3 申请并下载证书
- 报错1:没有指定账号
- 报错2:DNS无法解析的域名
- 报错3:无效的响应 404
- 3.4 配置 Nginx
- 3.5 证书过期刷新
- 四、补充
- 4.1 同一域名的不同端口,可以共用一个SSL证书吗?
- 4.2 Nginx 转发 403 问题
一、简介
HTTPS
是通过 SSL
证书 加密传输 的 HTTP 协议。可以通过 Nginx、Apache 等中间件进行接收和转发,这里我们主要介绍 Nginx 中间件的配置方式。
通过 Nginx 配置 HTTPS 协议,分为两步:
- 服务器需要先下载好 SSL 证书;
- 在 Nginx 配置好 SSL 证书的相关信息即可。
在了解清楚这些内容之后,我们就可以开始实战操作了。
二、SSL 证书类型介绍
HTTPS 协议的 SSL 证书根据 验证级别 可以分为三种:
DV(Domain Validation)
证书:这种证书仅需验证申请者的域名所有权,无需对网站的实际运行者或组织进行身份验证。它是 最基本 的整数类型,适用于个人、小型企业。OV(Organization Validation)
证书:这种证书在 DV 证书的基础上 增加了对申请者组织身份的验证。它 需要验证申请者的公司存在并且有效地拥有该域名,适用于中型企业。EV(Extended Validation)
证书:这种证书提供 最高级别 的验证,包括 对申请者的身份、组织和域名的全面审核。EV证书通常用于需要高安全性和信任度的网站,如银行和金融机构,适用于高要求企业。
除此之外,SSL 证书还可以分为 公网
、内网
两种:
- 公网证书: 要求必须公网可访问,并且需要通过例如在服务器创建一个指定文件,在公网的对应路径下要能正常访问。
- 内网证书: 不需要进行验证,可以直接使用。
本片文章我们主要介绍公网环境的 SSL 证书。
补充: HTTPS 的 SSL 证书 不仅仅只支持域名,还可以支持 IP 形式的 HTTPS 协议哟。
三、公网 SSL 证书
3.1 证书管理工具
上面介绍了证书的各种类型,本文我们主要展示如何下载并配置免费的 Let’s Encrypt
网站颁发的 DV证书
,网站地址如下:(证书有效期仅有三个月)
- Let’s Encrypt: https://letsencrypt.org/zh-cn/
这里我们只是展示一下官网的地址,实际的证书下载操作并不能直接去官网操作。我们可以选择多种 客户端工具 来与 Let’s Encrypt 进行交互,常见的有以下三种:
-
acme-tiny
:是一个由 Python 编写的证书申请脚本。开源地址:https://gitcode.com/diafygi/acme-tiny/overview
-
acme.sh
:是一个由 Shell 编写的证书申请脚本。开源地址:https://github.com/acmesh-official/acme.sh
-
Certbot
:是一款比较齐全的证书管理工具。官方地址:https://certbot.eff.org/
这里我们主要使用 acme.sh
来进行证书管理,因为它比较轻量级,而且操作简单。
补充: 可能有小伙伴发现了,为什么前两个工具都命名为 acme,什么是
acme
?
ACME协议
是由 Let’s Encrypt 组织开发的一种 通信协议,主要 用于服务器和证书颁发机构(CA)之间的交互。它的主要目标是 简化SSL/TLS证书的申请、验证和管理流程。通过ACME协议,开发者可以构建自动化的证书管理工具,使得普通用户也能轻松获取并更新安全的数字证书。
3.2 下载安装 acme.sh
先来到家目录下:
cd ~
执行如下命令,下载并安装 acme.sh
:
curl https://get.acme.sh | sh -s email=my@example.com
如果出现网络问题:
- 0curl: (6) Could not resolve host: raw.githubusercontent.com
- 0curl: (7) Failed connect to raw.githubusercontent.com:443; 拒绝连接
可以执行如下命令:
git clone https://gitee.com/neilpang/acme.sh.git
cd acme.sh
./acme.sh --install -m my@test.com
注意: 这里不要再用官方的 my@example.com
了,这个邮箱已经被禁用了,后面会报错的:
执行结果如下,说明安装成功了:
如果是通过 git clone
的方式安装的,此时可以删除克隆下来的文件了。
cd ~
rm -rf acme.sh
安装之后,会在 ~
家目录创建一个 .acme.sh
文件夹,如下所示:
.acme.sh
文件夹中的内容如下:
3.3 申请并下载证书
执行如下命令,通过提交 域名
、webroot
来申请并下载证书:
sh /root/.acme.sh/acme.sh --issue -d 23jw3585ev35.vicp.fun --webroot /data/webroot --server letsencrypt
23jw3585ev35.vicp.fun
:由于没有域名,这是我通过花生壳
工具用 内网穿透 做的临时域名,仅用于测试,实际环境中可以使用自己的域名。--server letsencrypt
:告诉 acme.sh 客户端将所有的证书请求都发送到 Let’s Encrypt 的服务器进行处理。- 如果需要配置多个域名共用一个证书,可以添加多个
-d 域名
的配置。
这里可能会出现各种报错,在了解这些报错之前,我们需要先了解一下 DV 证书申请包含了哪些过程,因为 我们的报错点都是可以在这些过程中找到出处 的:
- 过程1,验证当前账号信息: 判断当前账号是否存在,不存在则自动注册。
- 过程2,验证域名是否可以被DNS正常解析: 如果无法正常解析,则报错。
- 过程3,验证域名下新生成的文件是否可以正常访问: acme.sh 会在 webroot 路径下随机生成一个文件,然后尝试通过域名访问,并核验文件内容,从而确认域名是否为当前服务器所有。
以上三点 全部验证通过 之后,才可以正常颁发并下载证书。
成功申请并下载证书的结果如下:
下面列举一下小编在申请证书过程中遇到的几种报错场景:
报错1:没有指定账号
对应过程1:验证当前账号信息。如果之前注册的时候没有指定邮箱,这里执行之后会报错如下:
-
Please update your account with an email address first.
请先用邮箱注册一个账号。
我们根据提示执行如下命令,注册一个邮箱地址上去即可
acme.sh --register-account -m my@test.com
执行结果如下:
再次执行上面的命令即可。
报错2:DNS无法解析的域名
对应过程2:验证域名是否可以被DNS正常解析。如果当前申请证书的域名不存在、没有注册,就会报错:
-
www.domain123.cn:Verify error:DNS problem: NXDOMAIN looking up A for www.domain123.cn - check that a DNS record exists for this domain; DNS problem: NXDOMAIN looking up AAAA for www.domain123.cn - check that a DNS record exists for this domain
www.domain123.cn域名解析失败,域名的
A记录
(用于将域名指向IPv4)和AAAA记录
(用于将域名指向IPv6)没有找到。
报错3:无效的响应 404
对应过程3:验证域名下新生成的文件是否可以正常访问。如果当前的域名存在,但是脚本新创建的测试文件无法被正常映射出去的话,就会报错:
-
www.myweb.cn:Verify error:170.33.13.246: Invalid response from http://www.myweb.cn/.well-known/acme-challenge/tgvilsyFFlCql3VnyC51rHmGoirf6l9mMPMHiTgmfVI: 404
www.myweb.cn 验证失败,文件路径不存在:404。
-
日志中的
Pending, The CA is processing your order, please just wait. (2/30)
就是为了防止网络延迟导致没有访问新生成的文件而 重试。
3.4 配置 Nginx
HTTPS 协议默认使用 443 端口,nginx.conf
中相关的配置内容如下:
http {
server {
listen 443 ssl; # https默认为443端口,当然也可以用任何端口。后面ssl用于告诉Nginx在指定的端口上启用SSL/TLS加密
server_name example.com; # 你网站的域名(查看说明1)
# 下面输入证书和私钥的地址
ssl_certificate certs/my_cert.crt; # 证书(查看说明2)
ssl_certificate_key certs/my_cert.key; # 证书对应的私钥文件(查看说明3)
ssl_session_cache shared:SSL:1m; # 可选配置,设置了 SSL 会话缓存的类型和大小。(具体查看说明5)
ssl_session_timeout 5m; # 可选配置,设置了 SSL 会话缓存的超时时间为 5 分钟。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; # 可选配置, 指定了 SSL/TLS 握手过程中允许使用的加密算法的优先级顺序。(具体查看说明7)
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; # 可选配置,指定了允许使用的 SSL/TLS 协议版本。(具体查看说明8)
ssl_prefer_server_ciphers on; # 可选配置(具体查看说明9)
# 指定 webroot 路径
location / {
root /data/webroot/;
access_log /data/httplogs/root/access.log main;
error_log /data/weblogs/root/error.log;
}
}
}
配置说明:
server_name
:域名配置,需要和申请SSL证书的域名保持一致。ssl_certificate
:证书文件,包含:服务器的公钥、服务器信息、证书办法机构(CA)的数字签名。可以是.pem
格式,也可以是.cer
或.crt
格式的文件。(.cer和.crt格式除了名称没有区别)ssl_certificate_key
:私钥文件,包含证书文件中公钥相对应的私钥,用于对数据进行解密和签名操作,必须严格保密。可以是.pem
格式,也可以是.key
格式的文件。.pem
格式和.crt
/.cer
格式有什么区别?- SSL 证书的 PEM 和 CRT/CER 格式都是用于存放证书文件的公钥,有一些区别,但是 大多数情况下可以互换使用。
ssl_session_cache
:设置了 SSL 会话缓存的类型和大小。启用 SSL 会话缓存可以提高性能,因为它允许客户端在后续连接中重用之前协商的会话参数,避免了重复进行完整的 SSL/TLS 握手过程。shared
:表示在所有工作进程之间共享缓存。SSL
:是缓存的名称。1m
:表示缓存的最大限制为1M。
ssl_session_timeout
:设置 SSL 会话缓存的超时时间,5m 表示5分钟后过期。ssl_ciphers
:设置 SSL/TLS 握手过程中允许使用的加密算法的优先级顺序,优先级从高到低排列。- 建议禁用一些不安全的算法(如 NULL、aNULL、MD5、ADH、RC4等)。
ssl_protocols
:设置允许使用的 SSL/TLS 协议版本。- 建议只启用安全的版本协议,如 TLSv1.1、TLSv1.2、TLSv1.3。
- 禁用不安全的版本协议,如:SSL v2、SSL v3。
ssl_prefer_server_ciphers
:设置 SSL/TLS 握手过程中,优先使用服务器端指定的加密算法,而不是客户端提供的加密算法。这样可以确保使用更安全的加密算法。
3.5 证书过期刷新
我们只需要重新执行申请证书的命令,就可以查看证书的过期时间:
sh /root/.acme.sh/acme.sh --issue -d 23jw3585ev35.vicp.fun --webroot /data/webroot --server letsencrypt
23jw3585ev35.vicp.fun
:由于没有域名,这是我通过花生壳
工具用 内网穿透 做的临时域名,仅用于测试,实际环境中可以使用自己的域名。--server letsencrypt
:告诉 acme.sh 客户端将所有的证书请求都发送到 Let’s Encrypt 的服务器进行处理。
再次执行即可看到证书过期时间:
可以通过增加 --force
强制刷新刷新证书:
sh /root/.acme.sh/acme.sh --issue -d 23jw3585ev35.vicp.fun --webroot /data/webroot --server letsencrypt
执行结果如下所示:
四、补充
4.1 同一域名的不同端口,可以共用一个SSL证书吗?
- 可以的。 SSL 证书是基于域名颁发的,而不是基于端口号。具体配置方式如下所示:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/certificate.crt;
ssl_certificate_key /path/to/private.key;
...
}
server {
listen 8443 ssl;
server_name example.com;
ssl_certificate /path/to/certificate.crt;
ssl_certificate_key /path/to/private.key;
...
}
4.2 Nginx 转发 403 问题
403 Forbidden
如果没有自己特殊指定的话,指的是 访问的资源没有权限,nginx中指定的 location 转发后的地址要确保 当前执行 Nginx 命令的 用户有权限访问webroot文件夹才行。
整理完毕,完结撒花~🌻
参考地址:
1.nginx配置ssl支持https的详细步骤,https://blog.csdn.net/weixin_45501219/article/details/136825372
2.免费的SSL证书(Let‘s Encrypt / acme),https://blog.csdn.net/weixin_45602663/article/details/126631496
3.DNS解析中的A记录、AAAA记录、CNAME记录、MX记录、NS记录、TXT记录、SRV记录、URL转发等,https://blog.csdn.net/weixin_44388689/article/details/132466543