ssl证书申请及配置

2357 字
12 分钟
ssl证书申请及配置

一、自签名SSL证书#

1.1 创建自签名 SSL 证书#

自签名证书适合测试、内网环境使用(浏览器会提示 “不安全”,但通信本身是加密的)。

1.1.1 前提条件#

确保服务器已安装 opensslnginx:本篇nginx为源码安装,因此nginx的配置目录可能有所不同

Terminal window
# CentOS/RHEL 系统
yum install -y openssl nginx
# Ubuntu/Debian 系统
apt update && apt install -y openssl nginx

1.1.2 创建证书存放目录#

Terminal window
# 创建目录,建议将证书放在 /etc/nginx/ssl 下
mkdir -p /usr/local/nginx/ssl
cd /usr/local/nginx/ssl

1.1.3 生成自签名证书#

执行以下命令生成私钥(key)和证书(crt),过程中会提示输入信息,直接按回车默认即可(测试环境无需填写真实信息):

Terminal window
# 生成有效期 3650 天(10 年)的自签名证书
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout server.key -out server.crt
  • 命令参数解释:
    • -x509:生成自签名证书(而非证书请求);
    • -nodes:私钥不加密(避免 Nginx 启动时需要输入密码);
    • -days 3650:证书有效期 10 年;
    • -newkey rsa:2048:同时生成 2048 位 RSA 私钥;
    • server.key:生成的私钥文件;
    • server.crt:生成的证书文件。

1.1.5 设置证书权限(关键!避免 Nginx 无权读取)#

Terminal window
# 仅 root 用户可读写,Nginx 进程(www-data/nginx 用户)可读
chmod 600 /usr/local/nginx/ssl/server.key
chmod 644 /usr/local/nginx/ssl/server.crt
chown root:root /usr/lcoal/nginx/ssl/*

1.2 配置 Nginx 启用 HTTPS#

1.2.1 编辑 Nginx 配置文件#

Nginx 主配置文件/usr/local/nginx/conf/nginx.conf,添加如下内容:

Terminal window
user root;
worker_processes auto;
error_log logs/error.log;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
server_tokens off;
keepalive_timeout 65;
types_hash_max_size 4096;
include mime.types;
default_type application/octet-stream;
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
include conf.d/*.conf;
}

1.2.2 编辑虚拟主机#

进入/usr/local/nginx/conf/conf.d/目录下创建虚拟主机文件static_web.conf,添加如下内容:

Terminal window
server {
# 监听 443 端口(HTTPS 默认端口)
listen 443 ssl;
# 你的域名/服务器IP(需和证书一致)
server_name _;
# 证书文件路径
ssl_certificate /usr/local/nginx/ssl/server.crt;
# 私钥文件路径
ssl_certificate_key /usr/local/nginx/ssl/server.key;
# 可选:优化 SSL 配置(提升安全性和性能)
ssl_protocols TLSv1.2 TLSv1.3; # 仅启用安全的 TLS 版本
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384;
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
# 网站根目录(根据你的实际路径修改)
root /usr/local/nginx/html;
index index.html index.htm;
}
# 将 HTTP(80 端口)请求重定向到 HTTPS
server {
listen 80;
server_name _;
return 301 https://$host$request_uri;
}

主要修改:证书和公钥的配置

1.2.3 检查 Nginx 配置重启#

nginx -t

如果输出 nginx: configuration file /etc/nginx/nginx.conf test is successful,说明配置无错;否则根据提示修正。

Terminal window
# 重启
systemctl restart nginx
# 设置开机自启(可选)
systemctl enable nginx

1.3 验证 HTTPS 访问#

  1. 打开浏览器,访问 https://你的服务器IP/https://your_domain.com/
  2. 浏览器会提示 “证书不受信任”(自签名证书的正常现象),点击 “高级”→“继续访问”(不同浏览器表述略有差异);
  3. 页面能正常加载,且地址栏显示 “锁形” 图标(部分浏览器显示 “不安全”,但锁形图标仍在),说明 HTTPS 配置成功。

1.4 注意事项#

  1. 自签名证书的局限性:仅适合测试 / 内网,公网环境需使用 Let’s Encrypt 免费证书(可自动续期,浏览器信任);
  2. 端口放行:确保服务器防火墙 / 安全组放行 443 端口(HTTPS)和 80 端口(HTTP 重定向);
  3. 证书路径:配置文件中证书路径必须绝对正确,否则 Nginx 启动失败;
  4. 权限问题:Nginx 进程用户(通常是 nginxwww-data)必须能读取证书文件(server.crt 需 644 权

二、Let’s Encrypt免费证书申请#

2.1 为什么选择Let’s Encrypt?#

在网络安全威胁日益严峻的今天,SSL/TLS证书已成为网站标配。传统商业证书年费动辄数百美元,而Let’s Encrypt通过自动化流程向全球提供免费的DV域名验证证书,其核心优势体现在:

  1. 完全免费:无隐藏费用,支持无限次申请
  2. 全自动化:90天自动更新机制消除手动维护成本
  3. 行业认可:证书由非营利组织ISRG签发,被所有主流浏览器信任
  4. 广泛兼容:支持RSA 2048/4096及ECC加密算法

2.2 证书类型与适用场景#

Let’s Encrypt主要提供三种证书类型:

  1. 单域名证书:适用于单个域名(如example.com)
  2. SAN证书:支持多域名(Subject Alternative Name),最多可包含100个域名
  3. 通配符证书:使用*.example.com格式保护所有子域名

通配符证书特别适合以下场景:

  • 动态子域名系统(如用户自定义域名)
  • 微服务架构中的多服务部署
  • 需要频繁添加子域名的开发环境

2.3 申请前的准备工作#

2.3.1 服务器环境要求#

  • 公开可访问的域名(需完成DNS解析)
  • 运行中的Web服务器(Nginx/Apache等)
  • 服务器时间同步(建议配置NTP服务)
  • 80/443端口开放(用于ACME协议验证)

2.3.2 验证方式选择#

Let’s Encrypt支持两种验证方式:

  • HTTP-01验证:在网站根目录放置验证文件
  • DNS-01验证:通过添加TXT记录完成验证

对于通配符证书,必须使用DNS-01验证方式。建议提前在DNS服务商处配置API访问权限,以便实现自动化验证。

2.4 Certbot自动化部署指南#

2.4.1 安装Certbot#

2.4.1.1 Ubuntu/Debian系统:#

Terminal window
sudo apt update
sudo apt install certbot python3-certbot-nginx # Nginx用户
sudo apt install certbot python3-certbot-apache # Apache用户

2.4.1.2 CentOS/RHEL系统:#

Terminal window
yum install epel-release
yum install certbot python3-certbot-nginx

2.4.2 获取证书(以Nginx为例)#

sudo certbot --nginx -d example.com -d www.example.com

命令执行后,Certbot会自动:

  1. 验证域名所有权
  2. 生成私钥和证书
  3. 修改Nginx配置添加HTTPS
  4. 设置自动重定向(可选)

2.4.3 测试配置#

Terminal window
sudo nginx -t # 测试配置语法
sudo systemctl reload nginx # 重新加载配置

2.5 进阶使用场景#

2.5.1 通配符证书申请#

使用DNS插件实现自动化验证(以Cloudflare为例):

Terminal window
sudo apt install certbot python3-certbot-dns-cloudflare

创建/etc/letsencrypt/cloudflare.ini配置文件:

Terminal window
dns_cloudflare_email = your@email.comdns_cloudflare_api_key = your_api_key

执行申请命令:

sudo certbot certonly --dns-cloudflare \
-d "*.example.com" \
--dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini

2.5.2 多服务器证书共享#

对于负载均衡环境,建议:

  1. 在主服务器生成证书
  2. 使用certbot certificates命令查看证书路径
  3. 通过rsync同步证书文件到其他服务器
  4. 配置统一的cron任务进行更新

2.6 证书更新与续期策略#

Let’s Encrypt证书有效期为90天,建议设置自动更新:

2.6.1 测试更新流程#

Terminal window
sudo certbot renew --dry-run

2.6.2 配置自动更新#

编辑crontab:

Terminal window
sudo crontab -e

添加以下内容(建议每周一凌晨3点执行):

Terminal window
30 3 * * 1 /usr/bin/certbot renew --quiet --no-self-upgrade

2.6.3 更新后处理#

自动更新后可能需要:

  • 重新加载Web服务器
  • 通知依赖证书的服务(如邮件服务器)
  • 验证证书生效时间

2.7 安全实践与故障排除#

2.7.1 最佳安全实践#

  • 定期轮换账户密钥(每年至少一次)
  • 限制证书私钥的访问权限(600权限)
  • 启用OCSP Stapling提升连接速度
  • 配置HSTS头强制HTTPS访问

2.7.2 常见问题解决#

问题1:验证失败

  • 检查DNS记录是否生效
  • 确认服务器防火墙未阻止80/443端口
  • 检查Web服务器配置是否正确

问题2:证书未自动更新

  • 检查cron任务是否正常运行
  • 查看/var/log/letsencrypt/日志文件
  • 确认系统时间是否准确

问题3:通配符证书申请失败

  • 检查DNS API密钥权限
  • 确认TXT记录已全球生效(使用dig TXT _acme-challenge.example.com验证)

2.8 性能优化建议#

  1. ECC证书选择:使用--key-type ec参数生成更高效的ECC证书
  2. 证书链优化:确保包含完整的中间证书(通过-d参数指定)
  3. 会话恢复:在Web服务器中启用TLS会话票证
  4. 协议版本:禁用不安全的TLS 1.0/1.1,强制使用TLS 1.2+

2.9 监控与告警设置#

建议配置监控系统跟踪:

  • 证书过期时间(通过openssl x509 -noout -enddate -in /path/to/cert.pem
  • HTTPS可用性(使用工具如UptimeRobot)
  • 协议版本合规性(通过SSL Labs测试)

当证书剩余有效期少于30天时,应触发告警通知管理员。

2.10 替代方案对比#

对于特殊需求场景,可考虑:

  1. ZeroSSL:提供图形界面,适合非技术用户
  2. BuyPass Go SSL:免费证书有效期延长至180天
  3. AWS ACM:对AWS用户提供完全免费的证书管理

三、zeroSSL免费证书申请#

3.1 注册账号#

访问官网Free SSL Certificates and SSL Tools - ZeroSSL,注册账号

3.2 创建证书#

登录账号后,可以看到自身账号的数量,点击new certificate创建证书

image-20260306171538789
image-20260306171538789

填写ip或域名,zerossl支持申请纯ip及域名格式的证书

image-20260306171727844
image-20260306171727844

选择证书期限,选择90天免费证书

image-20260306171952033
image-20260306171952033

取消附加组件,否则会收费

image-20260306172139854
image-20260306172139854

取消自动获取商业证书,下一步

image-20260306172300489
image-20260306172300489

选择机密类型,默认即可

image-20260306172400557
image-20260306172400557

直接下一步,不用选择任何计划

image-20260306172518024
image-20260306172518024

image-20260306172549822
image-20260306172549822

提示这个,说明证书创建成功

3.3 验证服务器#

之后根据提示,选择验证服务器的方式,将证书上传至服务器中

image-20260306172955889
image-20260306172955889

3.4 证书使用示例#

image-20260309160540568
image-20260309160540568

下载的证书有这三个,nginx使用时需要将ca_bundle.crt导入到certificate.crt中,之后在nginx中,ssl_certificate指向certificate.crt,ssl_certificate_key指向private.key即可

Terminal window
cat ca_bundle.crt >> certificate.crt

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

ssl证书申请及配置
https://2233941.xyz/posts/ssl证书配置申请/
作者
lumifly
发布于
2026-04-22
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
lumifly
不逐世间万丈星河,自守一隅细碎明光
✨ 今日一言
" 加载中... "
——
公告
欢迎来到我的博客!这是一则示例公告。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
本年还剩 -- --%
本月还剩 -- --%
本周还剩 -- --%
距离--
--
--
天气预报
站点统计
文章
24
分类
1
标签
15
总字数
136,852
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.12.1
文章许可
CC BY-NC-SA 4.0

文章目录