如今不少站长都会考虑将本身的站点从http升级到https,不只是基于安全的考虑,有的也是由于第三方平台的限制,如谷歌浏览器会将http站点标记为不安全的站点,微信平台要求接入的微信小程序必须使用https等。nginx
那如何将一个http站点升级为https站点呢?git
为了数据传输的安全,https在http的基础上加入了ssl协议,ssl协议依靠证书来验证服务器的身份,并为浏览器和服务器之间的通讯加密。要想将http升级为https,只须要给http站点增长一个CA证书便可。github
目前获取CA证书有两种途径:web
收费的CA证书各大服务提供商都有卖,如阿里云、腾讯云等。apache
【系统架构】如何升级到https?一个脚本帮你搞定,且永久免费小程序
收费的证书不便宜,从阿里云官方网站看,它的价格能够从几千元到上万元不等。微信小程序
【系统架构】如何升级到https?一个脚本帮你搞定,且永久免费浏览器
这对于小公司平台,甚至是我的站点来讲,是一个不小的开支。安全
Letsencrypt是一个免费、自动化和开放的证书颁发机构,其颁发的证书一次有效期为三个月,可是只要能持续更新,基本能够永久使用。
今天推荐的这个脚本acme.sh,实现了 acme 协议, 能够帮你持续自动从Letsencrypt更新CA证书。下载地址以下:
github.com/Neilpang/ac…
安装acme.sh很简单,一个命令便可:
curl get.acme.sh | sh
普通用户和 root 用户均可以安装使用。安装过程进行了如下几步:
一、把acme.sh安装到你的home目录下:
~/.acme.sh/
并建立 一个 bash 的 alias,方便你使用:alias acme.sh=~/.acme.sh/acme.sh
二、自动为你建立 cronjob,天天 0:00 点自动检测全部的证书。若是快过时了,须要更新,则会自动更新证书,安装过程不会污染已有的系统任何功能和文件,全部的修改都限制在安装目录中:~/.acme.sh/
acme.sh 实现了 acme 协议支持的全部验证协议, 通常有两种方式验证:http 和 dns 验证。
一、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
二、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 到真正须要用它的地方。
注意:默认生成的证书都放在安装目录下:~/.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 协议和 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