宝塔 Linux 面板申请 Let's Encrypt SSL 泛域名证书 (CentOS 7)
Let's Encrypt 是全球最大的 SSL 域名证书颁发者(CA)之一,也是目前唯一的一个由公益组织运营的机构。其运营方“互联网安全研究小组”(Internet Security Research Group),是美国加州一家专注于互联网安全的非营利性机构。Let's Encrypt 已经为全球超过一亿一千五百万网站提供证书。截至2018年7月底,它的根证书已被包括 Microsoft、Google、 Apple、Mozilla、 Oracle 和 Blackberry 在内的所有主要互联网服务提供商所信任。世界各国的很多服务器提供商都在自己的服务器上集成了它的证书签发服务。
2019年7月14日,宝塔 Linux 最新版已经可以流畅申请 Let's Encrypt 泛域名证书,只要使用 DNS 验证并且勾选主域名,以及“自动组合泛域名”,按照面板上的指引,选择你的域名解析服务商,设置好密钥即可。以下内容已无时效性,不用继续看了。
现在,Let's Encrypt 已经开始签发泛域名证书,并且为 CentOS 7 提供了自动签发插件。本文就来记录一下,如何在安装了宝塔面板的 CentOS 7 系统中,利用 Let's Encrypt 推荐的工具 Certbot 申请 Let's Encrypt SSL 泛域名证书。
首先,根据 Let's Encrypt 官方说明,要用 Certbot 申请泛域名证书,必须借助针对域名解析服务商的插件。这些插件包括
certbot-dns-cloudflare
certbot-dns-cloudxns
certbot-dns-digitalocean
certbot-dns-dnsimple
certbot-dns-dnsmadeeasy
certbot-dns-google
certbot-dns-linode
certbot-dns-luadns
certbot-dns-nsone
certbot-dns-ovh
certbot-dns-rfc2136
certbot-dns-route53
也就是说,我们的域名解析必须托管在特定的服务商那里。不过还好,上面的域名解析服务提供商,有一家是中国的,它就是 CloudXNS。2019年7月16日起,CloudXNS 不再提供免费服务,因此不再推荐该服务商。
我们可以访问 CloudXNS 官方网站
https://www.cloudxns.net
注册登录,提交实名认证资料后,把域名解析放在它这里。然后,访问
https://www.cloudxns.net/AccountManage/apimanage.html
点击 开通 API,把 API KEY 和 SECRET KEY 记录下来,保存在 cloudxns.ini 文件中。文件的内容这样写:
# CloudXNS API credentials used by Certbot
dns_cloudxns_api_key = 填写你自己的 API KEY
dns_cloudxns_secret_key = 填写你自己的 SECRET KEY
把这个文件上传到
/root/.secrets/certbot/
上面这个路径是官方的示例,这里照搬过来。
现在万事俱备,申请证书只是一分钟的事了。
打开终端,登录你的服务器,输入
sudo pip install certbot certbot-dns-cloudxns
chmod 600 ~/.secrets/certbot/cloudxns.ini
certbot certonly \
--dns-cloudxns \
--dns-cloudxns-credentials ~/.secrets/certbot/cloudxns.ini \
-d yourdomain.com \
-d *.yourdomain.com \
--server https://acme-v02.api.letsencrypt.org/directory
记得把 yourdomain.com 换成自己的域名。
根据提示,输入自己的邮箱,回车。然后同意协议,即输入 A,回车,最后选择是否订阅 Let's Encrypt 的邮件,即输入 Y 或者 N,回车。
然后静待 30 秒,看到 Congratulations (祝贺你),就说明你的证书已经申请成功了。
注意,由于不是通过面板申请的,所以申请成功后,要手动改一下站点配置文件。
这里依然要记得把 yourdomain.com 换成自己的域名。
以下是 Nginx 的配置文件:
server
{
listen 80;
listen 443 ssl http2;
server_name yourdomain.com;
index index.php index.html index.htm default.php default.htm default.html;
root /www/wwwroot/yourdomain.com;
#SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
#error_page 404/404.html;
#HTTP_TO_HTTPS_START
if ($server_port !~ 443){
rewrite ^(/.*)$ https://$host$1 permanent;
}
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";
#HTTP_TO_HTTPS_END
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
error_page 497 https://$host$request_uri;
这是配置文件最前面一部分。接下来一行是
#ERROR-PAGE-START 错误页配置,可以注释、删除或修改
保存后重启 Nginx 即可。
以下是 Apache 的配置文件,xx 改成你的 php 版本号,不带小数点:
<VirtualHost *:80>
ServerAdmin webmaster@example.com
DocumentRoot "/www/wwwroot/yourdomain.com"
ServerName f2f74081.yourdomain.com
ServerAlias euyyue.com
errorDocument 404 /404.html
ErrorLog "/www/wwwlogs/yourdomain.com-error_log"
CustomLog "/www/wwwlogs/yourdomain.com-access_log" combined
#HTTP_TO_HTTPS_START
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{SERVER_PORT} !^443$
RewriteRule (.*) https://%{SERVER_NAME}$1 [L,R=301]
</IfModule>
#HTTP_TO_HTTPS_END
#DENY FILES
<Files ~ (\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)$>
Order allow,deny
Deny from all
</Files>
#PHP
<FilesMatch \.php$>
SetHandler "proxy:unix:/tmp/php-cgi-xx.sock|fcgi://localhost"
</FilesMatch>
#PATH
<Directory "/www/wwwroot/yourdomain_com">
SetOutputFilter DEFLATE
Options FollowSymLinks
AllowOverride All
Require all granted
DirectoryIndex index.php index.html index.htm default.php default.html default.htm
</Directory>
</VirtualHost>
<VirtualHost *:443>
ServerAdmin webmasterexample.com
DocumentRoot "/www/wwwroot/yourdomain.com/"
ServerName SSL.yourdomain.com
ServerAlias euyyue.com
errorDocument 404 /404.html
ErrorLog "/www/wwwlogs/yourdomain.com-error_log"
CustomLog "/www/wwwlogs/yourdomain.com-access_log" combined
#SSL
SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/yourdomain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/yourdomain.com/privkey.pem
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3 -TLSv1
SSLHonorCipherOrder On
Header always set Strict-Transport-Security "max-age=31536000; includeSubdomains; preload"
#PHP
<FilesMatch \.php$>
SetHandler "proxy:unix:/tmp/php-cgi-xx.sock|fcgi://localhost"
</FilesMatch>
#DENY FILES
<Files ~ (\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)$>
Order allow,deny
Deny from all
</Files>
#PATH
<Directory "/www/wwwroot/yourdomain.com/">
SetOutputFilter DEFLATE
Options FollowSymLinks
AllowOverride All
Require all granted
DirectoryIndex index.php index.html index.htm default.php default.html default.htm
</Directory>
</VirtualHost>
保存后重启 Apache 即可。
总有人担心这证书到期后怎么办,其实很简单,在宝塔的计划任务中添加
certbot renew
这样系统就会每天两次检查是否需要续期证书。需要的话就会直接续期。
R