1、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
2、安装 acme.sh
安装acme.sh
curl https://get.acme.sh | sh
普通用户和 root 用户都可以安装使用。安装过程进行了以下几步:
把acme.sh安装到home目录下:
mkdir ~/.acme.sh/
并创建 一个 bash 的 alias,方便使用:
alias acme.sh=~/.acme.sh/acme.sh
自动创建 cronjob
每天 0:00 点自动检测所有的证书。如果快过期了,需要更新,则会自动更新证书,安装过程不会污染已有的系统任何功能和文件,所有的修改都限制在安装目录中:~/.acme.sh/
3、生成证书
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 等数十种解析商的自动集成。
4、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会被自动调用,让服务器生效。
值得注意的是,这里指定的所有参数都会被自动记录下来,并在将来证书自动更新以后,被再次自动调用。
5、更新证书
目前证书在 60 天以后会自动更新,无需任何操作。今后有可能会缩短这个时间,不过都是自动的。
6、更新 acme.sh
目前由于 acme 协议和 Letsencrypt CA 都在频繁的更新,因此 acme.sh 也经常更新以保持同步。
升级acme.sh 到最新版
acme.sh --upgrade
开启自动升级
acme.sh --upgrade --auto-upgrade
关闭自动更新
acme.sh --upgrade --auto-upgrade 0
7、诊断日志 debug log
acme.sh --issue ..... --debug
或者:
acme.sh --issue ..... --debug 2