部署 HTTPS 网站的时候需要证书,证书由 CA 机构签发,大部分传统 CA 机构签发证书是需要收费的,但是Let's Encrypt这个CA机构签发的证书是免费的!利用acme.sh脚本就可以自动生成Let's Encrypt证书,并且现在支持域名泛解析证书,意思就是*.baidu.com旗下所有的子域名都可以使用同一个证书,而不用每个域名都得申请单独的证书。

全局301跳转指的是网站多个子域名都跳转到同一个域名,例如浏览器输入http://cocosec.comhttps://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”,并且只显示这一次,所以请一定复制保存好。
wthqjgdspn.jpeg
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_certificatessl_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
Last modification:February 15th, 2019 at 04:36 pm