注释

当初很多站长都会思考将本人的站点从http降级到https,不仅是基于平安的思考,有的也是因为第三方平台的限度,如谷歌浏览器会将http站点标记为不平安的站点,微信平台要求接入的微信小程序必须应用https等。

那如何将一个http站点降级为https站点呢?

http与https的区别

为了数据传输的平安,https在http的根底上退出了ssl协定,ssl协定依附证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。要想将http降级为https,只须要给http站点减少一个CA证书即可。

目前获取CA证书有两种路径:

  • 购买免费的CA证书
  • 获取收费的证书 免费的CA证书各大服务提供商都有卖,如阿里云、腾讯云等。免费的证书不便宜,从阿里云官方网站看,它的价格能够从几千元到上万元不等。

这对于小公司平台,甚至是集体站点来说,是一个不小的开销。

Letsencrypt是一个收费、自动化和凋谢的证书颁发机构,其颁发的证书一次有效期为三个月,然而只有能继续更新,根本能够永恒应用。

明天举荐的这个脚本acme.sh,实现了 acme 协定, 能够帮你继续主动从Letsencrypt更新CA证书。下载地址如下:

https://github.com/Neilpang/acme.sh

装置 acme.sh

装置acme.sh很简略,一个命令即可:

curl get.acme.sh | sh

普通用户和 root 用户都能够装置应用。装置过程进行了以下几步:

1、把acme.sh装置到你的home目录下:

~/.acme.sh/

并创立 一个 bash 的 alias,不便你应用:alias acme.sh=~/.acme.sh/acme.sh

2、主动为你创立 cronjob,每天 0:00 点自动检测所有的证书。如果快过期了,须要更新,则会自动更新证书,装置过程不会净化已有的零碎任何性能和文件,所有的批改都限度在装置目录中:

~/.acme.sh/

生成证书

acme.sh 实现了 acme 协定反对的所有验证协定, 个别有两种形式验证:http 和 dns 验证。

1、http 形式,须要在你的网站根目录下搁置一个文件, 来验证你的域名所有权,实现验证,而后就能够生成证书了。

acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/

acme.sh 会全自动的生成验证文件, 并放到网站的根目录,而后主动实现验证。最初会聪慧的删除验证文件,整个过程没有任何副作用。

如果你用的是apache服务器,acme.sh 还能够智能的从 apache的配置中主动实现验证,你不须要指定网站根目录:

acme.sh --issue -d mydomain.com --apache

如果你用的是nginx服务器,或者反代,acme.sh还能够智能的从 nginx的配置中主动实现验证,你不须要指定网站根目录:

acme.sh --issue -d mydomain.com --nginx

留神:无论是 apache 还是 nginx 模式,acme.sh在实现验证之后,会复原到之前的状态,都不会擅自更改你自身的配置。益处是你不必放心配置被搞坏,但也有一个毛病,你须要本人配置 ssl 的配置,否则,只能胜利生成证书,你的网站还是无法访问https。然而为了平安,你还是本人手动改配置吧。

如果你还没有运行任何 web 服务,80 端口是闲暇的, 那么 acme.sh 还能伪装本人是一个webserver, 长期听在80 端口,实现验证:

acme.sh --issue -d mydomain.com --standalone

2、dns形式,在域名上增加一条 txt 解析记录,验证域名所有权。

这种形式的益处是,你不须要任何服务器,不须要任何公网 ip,只须要 dns 的解析记录即可实现验证。不过,害处是,如果不同时配置 Automatic DNS API,应用这种形式 acme.sh 将无奈自动更新证书,每次都须要手动再次从新解析验证域名所有权。

acme.sh --issue --dns -d mydomain.com

而后,acme.sh 会生成相应的解析记录显示进去,你只须要在你的域名治理面板中增加这条 txt 记录即可。

期待解析实现之后, 从新生成证书:

acme.sh --renew -d mydomain.com

留神:第二次这里用的是 --renew

dns 形式的真正弱小之处在于能够应用域名解析商提供的 api 主动增加 txt 记录实现验证。

acme.sh 目前反对 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等数十种解析商的主动集成。

copy/装置 证书

后面证书生成当前,接下来须要把证书 copy 到真正须要用它的中央。

留神:默认生成的证书都放在装置目录下:~/.acme.sh/,请不要间接应用此目录下的文件。例如,不要间接让 nginx/apache 的配置文件应用这上面的文件。这外面的文件都是外部应用,而且目录构造可能会变动。

正确的应用办法是应用 --installcert 命令,并指定指标地位,而后证书文件会被copy到相应的地位,例如:

acme.sh --installcert -d <domain>.com --key-file /etc/nginx/ssl/<domain>.key --fullchain-file /etc/nginx/ssl/fullchain.cer --reloadcmd "service nginx force-reload"

一个小揭示,这里用的是service nginx force-reload,不是service nginx reload,据测试, reload并不会从新加载证书,所以用的force-reload。

Nginx的配置ssl_certificate应用/etc/nginx/ssl/fullchain.cer,而非/etc/nginx/ssl/.cer ,否则SSL Labs的测试会报Chain issues Incomplete谬误。

--installcert命令能够携带很多参数,来指定指标文件。并且能够指定 reloadcmd, 当证书更新当前,reloadcmd会被主动调用,让服务器失效。

值得注意的是,这里指定的所有参数都会被自动记录下来,并在未来证书自动更新当前,被再次主动调用。

更新证书

目前证书在 60 天当前会自动更新,你无需任何操作。今后有可能会缩短这个工夫,不过都是主动的,你不必关怀。

更新 acme.sh

目前因为 acme 协定和 Letsencrypt CA 都在频繁的更新,因而 acme.sh 也常常更新以放弃同步。

降级 acme.sh 到最新版 :

acme.sh --upgrade

如果你不想手动降级, 能够开启主动降级:

acme.sh --upgrade --auto-upgrade

之后, acme.sh 就会主动放弃更新了。

你也能够随时敞开自动更新:

acme.sh --upgrade --auto-upgrade 0

出错怎么办:如果出错, 请增加 debug log:

acme.sh --issue ..... --debug或者:acme.sh --issue ..... --debug 2

链接:https://www.toutiao.com/i6674...