部署 HTTPS 网站的时候需要证书,证书由 CA 机构签发,大部分传统 CA 机构签发证书是需要收费的,但是Let's Encrypt这个CA机构签发的证书是免费的!利用acme.sh脚本就可以自动生成Let's Encrypt证书,并且现在支持域名泛解析证书,意思就是*.baidu.com旗下所有的子域名都可以使用同一个证书,而不用每个域名都得申请单独的证书。
全局301跳转指的是网站多个子域名都跳转到同一个域名,例如浏览器输入http://cocosec.com
、https://cocosec.com
或者http://www.cocosec.com
均会自动301跳转到https://www.cocosec.com
,实现http跳转到https和no-www跳转到www。这样做的好处在于统一域名后利于SEO优化,因为cocosec.com和www.cocosec.com在爬虫看来是两个网站,将会分别爬取,可能会分散权重。
一、安装依赖环境
yum -y install curl && yum -y install cron && yum -y install socat
二、下载acme.sh
curl https://get.acme.sh | sh
三、获取域名API并运行脚本
1、以腾讯云为例,默认使用的是DNSPod.cn
,没有DNSPod.cn账号的朋友可以先注册一个账号,然后把要申请免费证书的域名接入到DNSPod,并使用DNSPod的NS服务器进行解析。然后再按下图操作创建API。创建API后需要注意,弹出的窗口显示完整的“Token”,并且只显示这一次,所以请一定复制保存好。
2、回到服务器,输入下面代码。DP_Id=""中请填写你的ID,DP_Key=""中请填写Token。
export DP_Id="1234"
export DP_Key="dasfdjlkj"
3、输入下面命令申请免费SSL证书。其中代码中的example.com
请改成自己域名即可。
~/.acme.sh/acme.sh --issue --dns dns_dp -d example.com -d *.example.com
如果dns解析服务器用的阿里云
的话,则需要登录 阿里云获得API密钥,然后服务器输入以下命令
#Ali_Key=""中请填写你的key,Ali_Secret=""中请填写secret
export Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export Ali_Secret="jlsdflanljkljlfdsaklkjflsa"
~/.acme.sh/acme.sh --issue --dns dns_ali -d example.com -d *.example.com
其他的dns解析服务器,可以参考官方文档《How to use DNS API》
:https://github.com/Neilpang/acme.sh/blob/master/dnsapi/README.md
四、生成证书
等待几分钟时间,显示如下信息表示申请成功,找一个记事本把这些路径信息记下来。
Your cert is in /root/.acme.sh/example.com/example.com.cer
Your cert key is in /root/.acme.sh/example.com/example.com.key
The intermediate CA cert is in /root/.acme.sh/example.com/ca.cer
And the full chain certs is there: /root/.acme.sh/example.com/fullchain.cer
我们最主要用到的是/root/.acme.sh/example.com/fullchain.cer
(证书)和/root/.acme.sh/example.com/example.com.key
(密钥),这两个文件路径在后面的建站中需要用到。
五、手动配置证书到nginx
这里提供一个简易的nginx.conf
配置参考,把域名替换成自己的域名,把ssl_certificate
和ssl_certificate_key
替换成上一步自己生成的证书文件。
server {
listen *:80;
listen *:443 ssl;
listen [::]:80;
listen [::]:443 ssl;
server_name example.com;
ssl on;
ssl_certificate /root/.acme.sh/example.com/fullchain.cer;
ssl_certificate_key /root/.acme.sh/example.com/example.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
return 301 https://www.example.com$request_uri; ##http://example.com和https://example.com做301跳转到https://www.example.com
}
server {
listen *:80;
listen [::]:80;
server_name www.example.com;
return 301 https://www.example.com$request_uri; ##http://www.example.com做301跳转到https://www.example.com
}
server {
listen *:443 ssl;
listen [::]:443 ssl;
server_name www.example.com;
ssl on;
ssl_certificate /root/.acme.sh/example.com/fullchain.cer;
ssl_certificate_key /root/.acme.sh/example.com/example.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
root #你网站根目录;
index index.php;#指定网站根目录的index.php文件为默认首页
location / {
#这里指定服务器跳转首页的路径
#一般来说代码如下
#root 你的网站根目录;
#index index.html;
}
}
如果想实现http和https的www都能访问,或者加www和不加www的https都能访问,请参考该文档进行修改: https://blog.csdn.net/eebaicai/article/details/84540439
六、检查配置是否正确
更改配置文件保存并退出后,运行nginx -t
检查nginx配置文件是否正确,不正确则根据提示找出有问题的地方进行修改。一般问题出在多加或者少了大括号}
符号。配置正确后,运行重启命令 service restart nginx
就好,然后浏览器手动试验一下(这里提前清空一下浏览器缓存、历史记录、cookie等)是否都能跳转到https://www,如果像我博客一样,均指向https://www 则大功告成。
七、证书续期
该证书的有效期为3个月,到期后是不是就不能使用https了呢?当然不是,acme.sh脚本自动写了个定时计划任务到系统里,运行crontab -l
就可以查看,定时计划任务每天运行一遍,保证证书到期时能够续上。
参考文档:
https://cloud.tencent.com/developer/article/1120684
https://blog.csdn.net/eebaicai/article/details/84540439
One comment
写的太好了!OωO