要在CentOS上通过Certbot申请通配符HTTPS证书并设置自动续订,请按照以下步骤操作:
-
安装Certbot:
-
首先确保你的系统是最新的,运行以下命令:
sudo yum update -y
-
安装Certbot:
sudo yum install certbot -y
-
确认Certbot版本是否为0.22以上,这是申请通配符证书所需的最低版本:
certbot --version
-
-
申请通配符证书:
-
使用以下命令申请证书,将
*.yourdomain.com
替换成你的域名:certbot certonly -d *.yourdomain.com --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory
-
这个命令会提示你添加一个DNS TXT记录来验证域名的所有权。你需要登录到你的DNS提供商的控制面板,添加相应的TXT记录。
-
-
验证DNS记录:
-
添加DNS记录后,等待DNS记录生效。可以使用以下命令来检查TXT记录是否生效:
dig -t txt _acme-challenge.yourdomain.com
-
-
完成证书申请:
- 一旦DNS记录生效,返回到命令行,按下回车键继续。Certbot将会验证TXT记录,如果验证成功,将会颁发证书。
-
安装证书:
-
证书申请成功后,你需要将证书安装到你的Web服务器。如果你使用的是Nginx,可以创建一个新的Nginx配置文件或者修改现有的配置文件,指向Certbot生成的证书文件:
server { server_name *.yourdomain.com; listen 443 ssl; ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; ... }
-
-
设置自动续订:
-
Certbot默认会每天检查证书是否需要续订。你可以创建一个cron job来确保自动续订:
sudo crontab -e
-
在打开的编辑器中添加以下行来每天自动检查和续订证书:
0 0,12 * * * /usr/bin/certbot renew --quiet
-
-
测试续订:
-
你可以运行以下命令来测试续订过程是否正常工作:
sudo certbot renew --dry-run
-
以上步骤应该能够帮助你在CentOS上成功申请并自动续订通配符HTTPS证书。如果在操作过程中遇到任何问题,可以参考Certbot的官方文档或者搜索到的相关文章获取更多帮助。
第5步给出完整配置文件
当然,以下是一个完整的Nginx配置文件示例,用于安装和使用通过Certbot申请的通配符证书。请确保将yourdomain.com
替换为你的实际域名。
server {
listen 80;
server_name *.yourdomain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name *.yourdomain.com;
# 证书文件路径
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
# 强烈建议的SSL配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# 启用HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# 配置SSL Stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
ssl_trusted_certificate /etc/letsencrypt/live/yourdomain.com/chain.pem;
# 配置日志文件
access_log /var/log/nginx/yourdomain.com.access.log;
error_log /var/log/nginx/yourdomain.com.error.log;
# 网站根目录
root /var/www/yourdomain.com/html;
# 默认页面
index index.html index.htm;
# 配置代理,如果你的网站是动态的,比如使用了Django、Flask等
location / {
try_files $uri $uri/ =404;
# 代理到后端应用服务器
# proxy_pass http://127.0.0.1:8000;
}
# 配置静态文件的缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
}
# 配置SSL重定向
if ($ssl_protocol = "") {
return 301 https://$host$request_uri;
}
}
在这个配置文件中:
- 第一个
server
块用于将所有的HTTP请求重定向到HTTPS。 - 第二个
server
块用于处理HTTPS请求,并配置了SSL证书和相关的安全设置。 -
ssl_certificate
和ssl_certificate_key
指向Certbot生成的证书文件。 -
ssl_trusted_certificate
和ssl_stapling
用于启用OCSP Stapling,这可以提高SSL握手的效率。 -
root
和index
指令指定了网站的根目录和默认页面。 -
location /
块用于处理对网站根目录的请求,你可以在这里配置代理,将请求转发到后端应用服务器。 -
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$
块用于设置静态文件的缓存过期时间。
请根据你的实际需求调整这个配置文件。一旦配置完成,你需要重新加载Nginx以应用新的配置:
sudo nginx -t # 检查配置文件是否有语法错误
sudo systemctl reload nginx # 重新加载Nginx配置
确保在进行任何更改之前备份你的原始Nginx配置文件。
我如果有两个子域名的话,要如何配置
如果你有两个子域名,例如 sub1.yourdomain.com
和 sub2.yourdomain.com
,并且你已经为 *.yourdomain.com
通配符证书申请了SSL证书,你可以在Nginx配置文件中为每个子域名设置不同的服务器块。这样,你可以根据需要为每个子域名提供特定的配置。
以下是一个示例配置,展示了如何为两个子域名设置服务器块:
# 子域名 sub1 的服务器块
server {
listen 80;
server_name sub1.yourdomain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name sub1.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
# 其他 SSL 配置...
root /var/www/sub1/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
# 其他配置...
}
# 子域名 sub2 的服务器块
server {
listen 80;
server_name sub2.yourdomain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name sub2.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
# 其他 SSL 配置...
root /var/www/sub2/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
# 其他配置...
}
# 捕获所有其他子域名的服务器块
server {
listen 80;
server_name *.yourdomain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name *.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
# 其他 SSL 配置...
root /var/www/default/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
# 其他配置...
}
在这个配置中:
- 每个子域名
sub1.yourdomain.com
和sub2.yourdomain.com
都有自己的服务器块,用于处理HTTP和HTTPS请求。 - 每个子域名的服务器块都有自己的
root
和index
指令,指向各自的网站内容目录。 - 一个通用的服务器块用于捕获所有其他可能的子域名,并提供默认的网站内容。
确保在进行任何更改之前备份你的原始Nginx配置文件,并且在应用新配置之前检查配置文件的语法是否正确:
sudo nginx -t # 检查配置文件是否有语法错误
sudo systemctl reload nginx # 重新加载Nginx配置
这样,你就可以为每个子域名提供特定的配置,同时确保所有子域名都使用相同的SSL证书。
子域名 443 nginx配置中也是填写通配符的证书吗?
是的,对于子域名,你仍然可以使用通配符证书(例如 *.yourdomain.com
)在Nginx配置中。通配符证书允许你为一个域名及其所有子域名提供SSL加密,而不需要为每个子域名单独申请证书。
在Nginx配置中,你可以为每个子域名设置一个server
块,并且每个server
块都可以使用相同的通配符证书。这里是一个简化的示例,展示了如何为两个子域名sub1.yourdomain.com
和sub2.yourdomain.com
使用相同的通配符证书:
# 子域名 sub1 的服务器块
server {
listen 80;
server_name sub1.yourdomain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name sub1.yourdomain.com;
# 使用通配符证书
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
# SSL 配置...
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
root /var/www/sub1/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
# 其他配置...
}
# 子域名 sub2 的服务器块
server {
listen 80;
server_name sub2.yourdomain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name sub2.yourdomain.com;
# 使用通配符证书
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
# SSL 配置...
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
root /var/www/sub2/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
# 其他配置...
}
在这个配置中:
- 每个子域名都有自己的HTTP到HTTPS重定向规则。
- 每个子域名的HTTPS服务器块都使用相同的通配符证书文件路径。
-
ssl_certificate
和ssl_certificate_key
指向通配符证书的路径,这些证书文件由Certbot生成并管理。
确保在应用新配置之前检查配置文件的语法是否正确,并重新加载Nginx以应用更改:
sudo nginx -t # 检查配置文件是否有语法错误
sudo systemctl reload nginx # 重新加载Nginx配置
这样,你就可以确保每个子域名都通过SSL/TLS安全地提供服务,而不需要为每个子域名单独管理证书。