最近发现当访问博客时,如果不用https时,右正解会出现广告,当用https是就不会有广告,估计是运营商把网络给劫持了,不过看到广告真的很烦,毕竟自己的网站出现了广告,于是把所有的域名全换成https了。
这里使用的是Let's Encrypt 泛域名证书,以下为Let's Encrypt 泛域名证书的申请与安装方法。
1.安装acme.sh
这里使用 acme.sh 来安装 Let's Encrypt 证书,详见 https://github.com/Neilpang/acme.sh,可以通过下面的简单命令来安装:
curl https://get.acme.sh | sh
在安装时,需要提交安装 curl 和 socat 模块
安装完成以后,会有当前用户的 home 目录下生成 .acme.sh 文件目录
2.生成证书
acme.sh 实现了 acme 协议支持的所有验证协议. 一般有两种方式验证: http 和 dns 验证。这里面使用 dns 来验证域名所有权。
acme.sh --issue -d sviping.com -d *.sviping.com --dns dns_dp
当执行上面命令时会出现如下错误:
It seems that you are using dns manual mode. Read this link first: https://github.com/Neilpang/acme.sh/wiki/dns-manual-mode
通过 https://github.com/Neilpang/acme.sh/wiki/dns-manual-mode 找到发解决办法
acme.sh --issue -d sviping.com -d *.sviping.com --dns dns_dp --yes-I-know-dns-manual-mode-enough-go-ahead-please
这是 acme.sh 会生成相应的解析记录,如下:
这时需要将这些记录添加到域名控制面板中的 txt 记录,解析添加完成并成功解析之后,使用如下命令重新生成:
acme.sh --renew -d sviping.com -d *.sviping.com --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please
第二次使用的是 --renew 而不是 --issue
3.安装证书
上面生成的证书默认放到 .acme.sh/domain 下面,请不要直接使用此目录下的文件,此时需要将生成的证书复制到相应nginx的能访问到的目录中。正确的使用方法是使用 --installcert 命令,并指定目标位置, 然后证书文件会被copy到相应的位置, 例如:
acme.sh --installcert -d sviping.com \ --key-file /usr/local/nginx/ssl/sviping.com/sviping.com.key \ --fullchain-file /usr/local/nginx/ssl/sviping.comfullchain.cer \ --reloadcmd "service nginx force-reload"
当执行上面命令时会报错,原来是没有 service nginx force-reload 命令,于是将上面命令替换为
acme.sh --installcert -d sviping.com \ --key-file /usr/local/nginx/ssl/sviping.com/sviping.com.key \ --fullchain-file /usr/local/nginx/ssl/sviping.com/fullchain.cer \ --reloadcmd "service nginx stop && service nginx start"
4.证书更新
生成的证书有效期为60天,到期后需要进行更新。不过在安装 acme.sh 时已经在 crontab 中添加了一条计划任务来自己更新证书,所以不需要到期手动去更新,这些都是自动的,如下:
5.配置nginx
生成 ssl 证书后需要配置nginx支持https,在nginx的配置目录中添加一个域名ssl证书配置文件 sviping.com_ssl.conf
# /usr/local/nginx/conf/sviping.com_ssl.conf ssl on; ssl_certificate /usr/local/nginx/ssl/sviping.comfullchain.cer; ssl_certificate_key /usr/local/nginx/ssl/sviping.comgodruoyi.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_session_cache shared:SSL:10m; ssl_session_timeout 30m; ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4"; add_header Strict-Transport-Security "max-age=31536000;includeSubDomains;preload"; add_header X-Frame-Options deny; add_header X-Content-Type-Options nosniff; add_header x-xss-protection "1; mode=block"; add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https:; connect-src 'self' https:; img-src 'self' data: https: blob:; style-src 'unsafe-inline' https:; font-src https:";
Nginx 的配置 ssl_certificate 使用 fullchain.cer ,而非 <domain>.cer ,否则 SSL Labs 的测试会报 Chain issues Incomplete 错误。
在相应的域名配置文件中引入上面添加的文件并将今天端口改为 443
#/usr/local/nginx/conf/vhost/sviping.com.conf server{ listen 80; server_name sviping.com www.sviping.com; rewrite ^/(.*)$ https://www.sviping.com/$1 permanent; } server{ ... listen 443; include sviping.com_ssl.conf; ... }
到此,Let's Encrypt 泛域名证书申请与安装与全部完成。
由于之前申请了阿里云的免费ssl证书,所以暂时还是用的阿里云的ssl证书。
参考:https://laravel-china.org/articles/13496/lets-encrypt-pan-domain-name-application-and-configuration