随笔
在互联网部署建站的过程中,数据安全也变的极为重要,传统的 HTTP 明文传输隐藏着的数据被劫持、泄漏安全风险,给数据加密传输也变得尤其重要,使用 SSL 对称和非对称加密技术来保证数据的安全性,能够确保数据在传输过程中不被篡改,也确保接收方收到的信息与发送方发出的信息一致。
证书颁发机构
证书颁发机构(Certificate Authority, CA)是负责签发、管理和撤销数字证书的组织,CA 的主要作用是验证申请者的身份,并为其颁发 SSL/TLS 证书,以确保安全通信,常见的免费证书颁发机构如下
证书颁发机构 | 免费证书有效期 | 自动续期 | 特性备注 |
Let’s Encrypt | 90 天 | 是 | 最广泛使用的免费 CA,自动化程度高。 |
ZeroSSL | 90 天 | 是 | 提供手动和自动验证选项,用户友好。 |
Buypass Go SSL | 180 天 | 是 | 适合长期使用的用户,提供稳定的服务。 |
Freemium SSL | 通常为 90 天 | 是 | 提供免费和付费证书选项,灵活性高。 |
证书申请
使用 ACME(Automatic Certificate Management Environment)协议自动申请和管理 SSL/TLS 证书,可以使用 acme.sh
工具。acme.sh
是一个轻量级的 ACME 客户端,支持多种 DNS 提供商和 Web 服务器。以下是在 CentOS 7 上使用 acme.sh
申请和管理证书的详细步骤
前期准备
- 一个注册好的域名,已接入DNS服务商。
- 一台Linux系统服务器。
- 服务器防火墙放行 80 / 443 端口。
配置环境
以文章本次使用的 Centos7 系统为例,进行执行安装,首先安装一下需要的环境工具。
# 更新一下系统软件包
sudo yum update -y
# 安装EPEL仓库
sudo yum install -y epel-release
# 安装 acme 运行所需依赖软件
sudo yum install -y curl socat
安装 acme.sh
安装完成后,设定一个证书注册邮箱,这里设定为你自己的邮箱,用于接收证书后续续订的通知, [email protected]
为演示邮箱,这里替换为你自己的实际邮箱地址。
# 安装 acme.sh 脚本 并生效环境变量
curl https://get.acme.sh | sh && source ~/.bashrc
# 设定证书申请的注册帐户
acme.sh --register-account -m [email protected]
指定颁布机构 (可选)
指定证书下发机构,可以参照这个 “表格” ,选择你要申请证书的颁布机构,一遍不选情况默认。
# 切换 Let's Encrypt
acme.sh --set-default-ca --server letsencrypt
# 切换 Buypass
acme.sh --set-default-ca --server buypass
# 切换 ZeroSSL
acme.sh --set-default-ca --server zerossl
# 切换 Freemium
acme.sh --set-default-ca --server freemium
放行防火墙
证书申请过程中需放行80
跟443
端口,本段命令仅放行系统防火墙,如你的服务器是在阿里云或Azure云,还有其他服务商,注意需要在相关的服务商面板先放行安全组,再来放行系统防火墙,避免出现端口暴漏安全风险,以下提供两种方式选择,一种申请过程中只放行 80
跟 443
端口,还有一种申请的时候临时关闭防火墙,申请完成再打开。
方式一
只放行需要的 80
与 443
端口
# 开放 HTTP 端口(80)与 HTTPS 端口(443)
sudo firewall-cmd --permanent --add-port=80/tcp --add-port=443/tcp
# 重新加载防火墙规则
sudo firewall-cmd --reload
方式二
临时关闭防火墙,申请完成后再记得启动打开
# 临时关闭防火墙
sudo systemctl stop firewalld
# 申请完成,启动防火墙
sudo systemctl start firewalld
# 查看防火墙状态
sudo systemctl status firewalld
更多防火墙命令帮助
# 启动的时候开启防火墙
sudo systemctl enable firewalld
# 启动的时候禁用防火墙
sudo systemctl disable firewalld
# 查看防火墙规则
sudo firewall-cmd --list-all
# 移除端口(例如,端口 80 和 443)
sudo firewall-cmd --permanent --remove-port=80/tcp
sudo firewall-cmd --permanent --remove-port=443/tcp
sudo firewall-cmd --reload
# 永久性添加端口(例如,端口 80 和 443)
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --reload
# 查看所有可用区域
sudo firewall-cmd --get-zones
# 切换活动区域
sudo firewall-cmd --set-default-zone=public
# 查看日志
sudo journalctl -u firewalld
# 更多帮助信息
firewall-cmd --help
证书签发
验证域名所有权完成证书的下发,命令行中的 example.com 替换为你实际需要申请证书的域名,以下命令选择一条验证类型即可。
HTTP 验证方式
HTTP 验证方式是最常用的方式之一,适用于大多数 Web 服务器环境。acme.sh
会在指定的 Web 根目录下创建一个临时文件,用于验证域名所有权。
acme.sh --issue -d example.com --webroot /var/www/html
Standalone 验证方式
适用于无法使用 HTTP 验证的情况。acme.sh
会在指定的端口上启动一个临时的 Web 服务器,用于验证域名所有权, 上述都无法申请成功,强烈推荐这个。
acme.sh --issue -d example.com --standalone --keylength ec-256
DNS 验证方式
DNS 验证方式适用于无法公开访问的服务器或需要在不同环境中验证域名所有权的情况。acme.sh
会生成一个 DNS 记录,你需要在你的 DNS 提供商处添加这个记录。
Cloudflare 服务商申请
# 设置 Cloudflare API 密钥和邮箱变量
export CF_Key="cloudflare_api_key"
export CF_Email="cloudflare_email"
# 使用 Cloudflare DNS 验证方式申请证书
acme.sh --issue --dns dns_cf -d example.com
查看更多的服务商申请方式
阿里云服务商申请
# 设置阿里云密钥ID和密钥变量
export Ali_Key="aliyun_access_key_id"
export Ali_Secret="aliyun_access_key_secret"
# 使用阿里云 DNS 验证方式申请证书
acme.sh --issue --dns dns_ali -d example.com
腾讯云服务商申请
# 设置腾讯云密钥ID和密钥变量
export TX_Key="tencent_cloud_secret_id"
export TX_Secret="tencent_cloud_secret_key"
# 使用腾讯云 DNS 验证方式申请证书
acme.sh --issue --dns dns_tx -d example.com
使用GoDaddy服务商申请
# 设置 GoDaddy API和密钥
export GD_Key="godaddy_api_key"
export GD_Secret="godaddy_api_secret"
# 使用 GoDaddy DNS 验证方式申请
acme.sh --issue --dns dns_gd -d example.com
TLS-ALPN 验证方式
适用于已经运行 HTTPS 的服务器。acme.sh
会通过 TLS-ALPN 协议进行域名验证。
acme.sh --issue -d example.com --alpn
成功签发
完成上述域名验证后,证书就开始下发,由于系统刚安装,没有安装任何Web服务,系统比较干净,博主使用的是 Standalone 验证方式
进行证书签发,下图为成功签发证书图。
证书安装开启SSL
证书申请成功后,通常会将证书文件存储在 ~/.acme.sh
目录下,再把证书文件配置到Web服务器,常见的 Nginx / Apache 按照以下配置,命令中的 example.com
替换为你自己实际申请成功的域名,安装证书前需安装好对应Web服务。
安装Web服务
已安装Web可以跳过,博主这里以安装Nginx服务作为演示。
# 安装 Nginx 并 启动服务
yum install -y nginx && systemctl start nginx
# 设置 Nginx 开机自启
systemctl enable nginx
安装证书
Nginx
sudo mkdir -p /etc/nginx/ssl && acme.sh --install-cert -d example.com \
--key-file /etc/nginx/ssl/example.key \
--fullchain-file /etc/nginx/ssl/example.fullchain.cer \
--reloadcmd "systemctl restart nginx"
博主安装证书命令修改示列
以博主实际域名为 exple.58r.my
修改实际命令如下,关于参数解释
- 使用 指定要安装证书的域名。
-d exple.58r.my
- 使用 指定私钥文件的存储路径。
--key-file /etc/nginx/ssl/exple.58r.key
- 使用 指定证书链文件的存储路径。
--fullchain-file /etc/nginx/ssl/exple.58r.fullchain.cer
sudo mkdir -p /etc/nginx/ssl && acme.sh --install-cert -d exple.58r.my \
--key-file /etc/nginx/ssl/exple.58r.key \
--fullchain-file /etc/nginx/ssl/exple.58r.fullchain.cer \
--reloadcmd "systemctl restart nginx"
Apache
acme.sh --install-cert -d example.com \
--key-file /etc/pki/tls/private/example.key \
--fullchain-file /etc/pki/tls/certs/example.fullchain.cer \
--reloadcmd "systemctl restart httpd"
站点启用HTTPS
以 Nginx 为例,证书已安装到到Web服务目录,现在只需要通过添加Web配置启用证书,随便创建一个配置文件,并绑定好已申请好证书的域名,以博主文章申请成功的域名exple.58r.my
为例,按照下面的注释根据实际情况修改。
Nginx配置
server
{
#监听ipv6与ipv4端口
listen 80;
listen 443 ssl http2 ;
listen [::]:443 ssl http2 ;
listen [::]:80;
#绑定域名为 “exple.58r.my”
server_name exple.58r.my;
index index.php index.html index.htm;
#指定Web页面根目录
root /usr/share/nginx/html;
#error_page 404/404.html;
#指定 SSL 证书文件路径,修改成刚才申请证书文件存储位置
ssl_certificate /etc/nginx/ssl/exple.58r.fullchain.cer;
#指定 SSL 私钥文件路径, 修改刚才申请的证书私钥存储位置
ssl_certificate_key /etc/nginx/ssl/exple.58r.key;
#启用 SSL 安全相关支持
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";
error_page 497 https://$host$request_uri;
}
最后博主根据上面的配置文件,写入到Nginx配置文件位置,下图是域名启用成功HTTPS后的完成图,不同的Web服务可能证书位置有偏差,但同理一样方式申请 。
贴一下博主写入配置文件命令,仅供参考,根据实际情况修改写入到配置文件。
sudo bash -c 'cat > /etc/nginx/conf.d/exple.58r.my.conf' <<EOF
server {
# 监听 IPv6 与 IPv4 端口
listen 80;
listen 443 ssl http2;
listen [::]:443 ssl http2;
listen [::]:80;
# 绑定域名为 “exple.58r.my”
server_name exple.58r.my;
# 指定 Web 页面根目录
root /usr/share/nginx/html;
# 指定索引文件
index index.php index.html index.htm;
# 指定 SSL 证书文件路径,修改为刚才申请证书文件存储位置
ssl_certificate /etc/nginx/ssl/exple.58r.fullchain.cer;
# 指定 SSL 私钥文件路径,修改为刚才申请的证书私钥存储位置
ssl_certificate_key /etc/nginx/ssl/exple.58r.key;
# 启用 SSL 安全相关支持
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";
error_page 497 https://$host$request_uri;
}
EOF
#重载配置文件
sudo systemctl reload nginx
最后
上述内容就是acme脚本申请证书使用全过程,特别注意的是申请过程中防火墙,还有提前把域名解析到你申请证书的服务器地址上,以上内容有点干,希望能帮到您。
Tips:为啥不使用宝塔一键申请,多方便 😂
博主:有道理,但记录一下原生方式申请😄