如何生成通配符SSL证书
推荐项目allinssl,该项目可以自动续期SSL证书,一键部署,证书监控等。教程:SSL证书免费申请!!!
安装前准备
操作系统:centos 7.9
web服务器:nginx 1.18.0
背景
阿里云或者腾讯云都可以申请免费的单域名ssl证书,但是泛域名证书的价格都很贵。本文介绍如何使用工具自己生成泛域名ssl证书,但是证书只有3个月有效期,需要定期生成。有很多平台也可以免费申请泛域名的ssl证书,原理是一样的,感兴趣也可以试试。
目前使用量最大的免费SSL证书就是Let’s Encrypt,自2018-03开始,Let’s Encrypt官方发布上线了免费的SSL泛域名证书。acme.sh实现了acme协议,可以从Let’s Encrypt生成免费的证书,自动创建cron任务, 每天零点自动检测所有的证书,如果发现证书快过期了,需要更新,则acme.sh会自动更新证书,安装过程不会污染已有的系统任何功能和文件,所有的修改都限制在安装目录中。
安装ACME
CentOS系统,使用下面的命令先进行依赖下载和更新。
yum update && yum install curl -y && yum install cron -y && yum install socat -y接着使用下面的命令安装 acme.sh:
下载可能失败,可以多试几次
curl https://gitee.com/neilpang/acme.sh | shwget https://gitee.com/neilpang/acme.sh/repository/archive/master.zip
unzip master.zip
cd acme.sh-master
./acme.sh --install \
--email my@example.comhttps://gitee.com/neilpang/acme.sh
https://new-developer.aliyun.com/article/1193074
普通用户和 root 用户都可以安装使用. 安装过程进行了以下几步:
把 acme.sh 安装到你的 home 目录下:
~/.acme.sh/并创建 一个 shell 的 alias, 例如 .bashrc,方便你的使用: alias acme.sh=~/.acme.sh/acme.sh
自动为你创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书.
如果看到输出下图所示的内容,则表示acme.sh已经成功安装!如果是root用户登录的centos系统,则可以进入到/root/.acme目录看到安装的acme.sh
[Sat Mar 25 20:58:58 CST 2023] Installing to /root/.acme.sh
[Sat Mar 25 20:58:58 CST 2023] Installed to /root/.acme.sh/acme.sh
[Sat Mar 25 20:58:58 CST 2023] Installing alias to '/root/.bashrc'
[Sat Mar 25 20:58:58 CST 2023] OK, Close and reopen your terminal to start using acme.sh
[Sat Mar 25 20:58:58 CST 2023] Installing alias to '/root/.cshrc'
[Sat Mar 25 20:58:58 CST 2023] Installing alias to '/root/.tcshrc'
[Sat Mar 25 20:58:58 CST 2023] Installing cron job
54 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
[Sat Mar 25 20:58:58 CST 2023] Good, bash is found, so change the shebang to use bash as preferred.
[Sat Mar 25 20:58:59 CST 2023] OK
[Sat Mar 25 20:58:59 CST 2023] Install success!设置默认CA 为 Let's Encrypt
acme.sh --set-default-ca --server letsencrypt至此,acme已经安装完成。
生成证书
acme.sh 实现了 acme 协议支持的所有验证协议. 一般有两种方式验证: http 和 dns 验证.
http 方式需要在你的网站根目录下放置一个文件, 来验证你的域名所有权,完成验证. 然后就可以生成证书了.
例如我的域名是vvhz.com,我的nginx配置webroot目录为/home/soft/nginx/web/
nginx对应的配置为
server {
listen 80; # 监听80端口
server_name vvhz.com www.vvhz.com; # 自己的域名
#把http的域名请求转成https
return 301 https://$host$request_uri;
}
server {
listen 443;
server_name vvhz.com www.vvhz.com;
client_max_body_size 100m;
ssl_certificate /home/soft/nginx/cert/vvhz.com/vvhz.com_bundle.crt;
ssl_certificate_key /home/soft/nginx/cert/vvhz.com/vvhz.com.key;
#### 主要是这一段配置,用来验证域名所有权
location ^~ /.well-known/ { # 用于ssl证书生成,webroot的配置
allow all;
root /home/soft/nginx/web/;
default_type "text/plain";
try_files $uri =404; # 找不到文件返回404
}
location / {
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8099/;
}
}
对应的执行命令为
./acme.sh --issue -d vvhz.com --webroot /home/soft/nginx/web/看到下面的输出表示证书已成功生成,在输出的证书目录下可以找到对应的证书。
上传证书
这里只介绍如何上传到DnsPod,其他平台一样的道理。
登录DnsPod控制台:https://www.dnspod.cn/
点击SSL证书,找到上传证书
将证书目录下的fullchain.cer的内容拷贝到签名证书输入框内,将vvhz.com.key的内容拷贝到签名私钥输入框内,点击确定即可。
在证书列表可以看到我们刚上传的证书!
