对码当歌,猿生几何?

使用acme.h实现网站https化

什么是acme.h

acme.h就是实现了acme协议的客户端,可以从 lets encrypt 生成免费的证书。更多客户端参见 https://letsencrypt.org/zh-cn/docs/client-options/。

ACME (自动证书管理环境 - Automatic Certificate Management Environment) : 由 Let’s Encrypt 实现的协议。

什么是Let's Encrypt

为了在您的网站上启用 HTTPS,您需要从证书颁发机构(CA)获取证书(一种文件)。Let’s Encrypt 是一个证书颁发机构(CA)。要从 Let’s Encrypt 获取您网站域名的证书,您必须证明您对域名的实际控制权。您可以在您的 Web 主机上运行使用 ACME 协议的软件来获取 Let’s Encrypt 证书。

Let’s Encrypt 是一家全球性的证书颁发机构(CA)。我们让世界各地的人们和组织获取、续期和管理 SSL/TLS 证书。网站可以使用我们的证书来启用安全的 HTTPS 连接。免费使用,免费使用,免费使用

Let’s Encrypt 提供域名验证型(DV)证书我们不提供组织验证(OV)或扩展验证(EV),这主要是因为我们无法自动化地颁发这些类型的证书。

为了找出最适合您获取证书的方法,您需要知道您是否拥有服务器的命令行访问权限(注:链接为英文)(有时也被被称为 SSH 访问权限)。如果您仅使用控制面板(例如 cPanel、Plesk 或 WordPress)管理您的网站,您很有可能没有命令行访问权限。您可以联系您的托管服务提供商确认。

我们建议大多数具有命令行访问权限的人使用 Certbot ACME 客户端,官方建议使用certbot客户端。但是安装麻烦。这里推荐使用acme.h这个客户端

如何使用acme.h

1、安装 acme.sh

从git仓库安装,不需要拥有root权限


git clone https://github.com/acmesh-official/acme.sh.git 
cd ./acme.sh
./acme.sh --install

安装过程做个三个事情

a、复制acme.h到家目录($HOME): ~/.acme.sh/ 所有的证书都会安装到该目录。

b、创建一个别名 acme.sh=~/.acme.sh/acme.sh.

c、创建一个crontab检查和续签证书

如下:

0 0 * * * "/home/user/.acme.sh"/acme.sh --cron --home "/home/user/.acme.sh" > /dev/null


2、生成证书

acme.sh --issue -d bobjin.com -w /home/wwwroot

-d表示签发的域名

-w表示网站的根目录

acme.h在跟lets encrypt认证网站的时候会在网站目录下生成一个认证文件,在认证后删除该文件。证书会每60天续签一次。

最后生成四个文件

服务端证书(终端实体证书),包含服务端公钥
[Thu May  7 10:37:32 CST 2020] Your cert is in  /home/work/.acme.sh/bobjin.com/bobjin.com.cer
服务端证书私钥
[Thu May  7 10:37:32 CST 2020] Your cert key is in  /home/work/.acme.sh/bobjin.com/bobjin.com.key
中间证书,用于签发的终端证书的中间证书
[Thu May  7 10:37:32 CST 2020] The intermediate  CA cert is in  /home/work/.acme.sh/bobjin.com/ca.cer
包含服务端证书和中间证书
[Thu May  7 10:37:32 CST 2020] And the full chain certs is there:  /home/work/.acme.sh/bobjin.com/fullchain.cer

3、安装证书&更新证书

acme.sh --install-cert -d bobjin.com --key-file  /home/work/webwork/nginx/conf/cert/bobjin.key  --fullchain-file /home/work/webwork/nginx/conf/cert/bobjin.pem --reloadcmd  "sudo /home/work/webwork/cntl/nginx-cnt.sh stop && sudo /home/work/webwork/cntl/nginx-cnt.sh start"

把证书安装到指定目录下。

证书默认60天续签一次,续签之后必须重启服务器。

--install-cert 安装证书

--reloadcmd 重启命令

--key-file 产生的是服务端私钥

--fullchain-file 产生的是服务端证书(叶证书|终端实体证书),包含服务端证书、公钥以及根证书或者中间证书,客户端会从本地证书存储中验证服务器端证书是否是可信任的权威机构签发,本质上验证的是ca的根证书

4、更新 acme.sh

目前由于 acme 协议和 letsencrypt CA 都在频繁的更新, 因此 acme.sh 也经常更新以保持同步.

自动更新

acme.sh  --upgrade  --auto-upgrade

Nginx配置

server {
    listen 443;
    server_name bobjin.com;
    ssl on;
    index index.html index.htm;
    ssl_certificate   cert/bobjin.pem;
    ssl_certificate_key  cert/bobjin.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    location / {
        proxy_pass http://127.0.0.1:8080/;
    }
}

ssl_certificate 证书其实是个公钥,会下发给客户端

sl_certificate_key 私钥是用来解密的,所以它的权限要得到保护但nginx的主进程能够读取

ssl_session_timeout 客户端可以重用会话缓存中ssl参数的过期时间,内网系统默认5分钟太短了,可以设成30m即30分钟甚至4h

ssl_protocols 指令用于启动特定的加密协议,nginx在1.1.13和1.0.12版本后默认是ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2

ssl_ciphers 选择加密套件,不同的浏览器所支持的套件(和顺序)可能会不同。

ssl_prefer_server_ciphers on 设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件。


至此,开启https之旅吧!!!


参考文档

https://letsencrypt.org/zh-cn/docs/