最近接手公司云服务器运维工作时,发现一个重要问题:服务器上的HTTPS证书即将过期。作为刚接触运维的新手,我需要找到一种安全可靠的方式将本地生成的证书部署到云服务器上。经过多次尝试,总结出一套适合新手的证书申请与部署方案,虽然过程有些"奇怪"且效率不高,但确实解决了实际问题。
这个方案的核心在于:
整个过程不需要直接操作云服务器命令行,适合运维新手操作。下面将详细介绍每个步骤的实现方法和注意事项。
我选择在本地使用VMware Workstation创建Ubuntu虚拟机作为证书生成环境,主要考虑以下几点:
具体安装步骤:
从清华大学开源镜像站下载Ubuntu LTS版本ISO镜像
在VMware中创建新虚拟机
安装Ubuntu系统
sudo apt update && sudo apt upgrade更新系统提示:虚拟机安装完成后,建议先创建一个快照,方便后续操作失误时恢复。
在Ubuntu中需要安装以下工具:
安装命令:
bash复制sudo apt update
sudo apt install -y certbot openssh-client nginx
验证Certbot安装:
bash复制certbot --version
# 应输出类似:certbot 2.6.0
在申请证书前,需要确保:
我这次需要为example.com和所有子域名申请通配符证书,命令如下:
bash复制sudo certbot certonly --manual --preferred-challenges dns \
-d example.com -d *.example.com
参数说明:
certonly:只申请证书,不自动安装--manual:手动模式,适合离线申请--preferred-challenges dns:使用DNS验证方式-d:指定域名,可以多次使用执行上述命令后,Certbot会暂停并显示类似以下信息:
code复制Please deploy a DNS TXT record under the name:
_acme-challenge.example.com
with the following value:
Xr4K9ZqQ3wLm2NpO7v8J1xY2zA5B6C8D0E4F5G6H7I
在华为云DNS解析中的操作步骤:
_acme-challenge重要提示:DNS记录生效可能需要几分钟到几十分钟不等,可以通过
dig TXT _acme-challenge.example.com命令检查是否生效。
DNS验证通过后,Certbot会自动生成证书文件,通常位于:
code复制/etc/letsencrypt/live/example.com/
该目录下包含以下重要文件:
cert.pem:域名证书chain.pem:中间证书fullchain.pem:完整证书链(包含域名证书和中间证书)privkey.pem:私钥文件安全提示:privkey.pem是敏感文件,必须严格限制访问权限,建议设置为600权限。
由于Certbot生成的证书文件位于系统目录,普通用户无权限直接访问。可以先将文件复制到用户目录:
bash复制mkdir -p ~/certs/example.com
sudo cp /etc/letsencrypt/live/example.com/fullchain.pem ~/certs/example.com/
sudo cp /etc/letsencrypt/live/example.com/privkey.pem ~/certs/example.com/
sudo chown -R $USER:$USER ~/certs
有多种方式可以将证书文件传输到云服务器:
方法1:SCP命令(推荐)
bash复制scp -r ~/certs/example.com user@server_ip:/path/to/certs/
方法2:SFTP客户端
方法3:华为云OBS中转
安全建议:传输完成后,应立即删除临时存储的证书文件,特别是私钥文件。
进入"Hosts"列表
编辑对应的代理主机
在SSL选项卡中:
保存设置并测试访问
常见问题:如果出现证书不生效的情况,可以尝试重启Nginx服务或清除浏览器缓存。
Let's Encrypt证书有效期为90天,建议设置监控:
检查证书有效期命令:
bash复制sudo certbot certificates
续期步骤与首次申请类似:
bash复制sudo certbot renew --manual --preferred-challenges dns
虽然本文介绍的是手动方式,但实际生产环境建议自动化:
编写续期脚本,包含:
设置cron定时任务:
bash复制0 3 * * * /path/to/renew_script.sh
| 记录类型 | 用途说明 | 证书申请相关 |
|---|---|---|
| A记录 | 域名到IPv4地址映射 | 必须正确指向服务器IP |
| AAAA记录 | 域名到IPv6地址映射 | 同A记录 |
| CNAME记录 | 域名别名 | 可用于子域名 |
| TXT记录 | 任意文本信息 | 用于DNS验证 |
| MX记录 | 邮件服务器指向 | 不影响证书申请 |
HTTPS = HTTP + SSL/TLS,提供:
握手过程:
浏览器验证证书的流程:
可能原因:
解决方法:
dig TXT _acme-challenge.example.com验证记录可能原因:
解决方法:
openssl x509 -noout -modulus -in cert.pem和openssl rsa -noout -modulus -in privkey.pem检查密钥是否匹配nginx -s reload重载配置可能原因:
解决方法:
/etc/letsencrypt/renewal/目录下的配置文件私钥保护:
证书管理:
服务器配置:
在实际操作中,我总结了以下几点经验:
对于新手来说,DNS验证虽然步骤多,但比HTTP验证更可靠,特别是对于通配符证书
在虚拟机中操作可以提供安全的实验环境,避免影响生产系统
证书文件传输务必使用加密通道,SCP/SFTP比FTP更安全
虽然手动操作繁琐,但理解每个步骤的原理对排查问题很有帮助
生产环境建议最终过渡到自动化方案,如使用DNS API自动更新TXT记录
这套方案虽然看起来有些"绕",但对于不熟悉服务器命令行操作的运维新手来说,提供了一种相对安全可靠的证书管理方式。随着经验积累,可以逐步过渡到更高效的自动化方案。