【docker系列】linux上使用Let’s Encrypt 生成通配符 HTTPS 证书

说明

acme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书.

主要步骤:

  1. 安装 acme.sh
  2. 生成证书
  3. copy 证书到 nginx/apache 或者其他服务
  4. 更新证书
  5. 更新 acme.sh
  6. 出错怎么办, 如何调试

下面详细介绍.

1. 安装 acme.sh

安装很简单, 一个命令:

curl  https://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/、

3、可选择高级安装

git clone https://github.com/Neilpang/acme.sh.git
cd acme.sh
./acme.sh --install  \
--home /opt/acme-home \
--config-home /opt/acme-home/data \
--cert-home  /opt/acme-home/mycerts \
--accountemail  "[email protected]" \
--accountkey  /opt/acme-home/myAccount.key \
--accountconf /opt/acme-home/myAccountconf.conf \
--useragent  "this is my client."

您不需要全部设置它们,只需设置您关心的那些。

说明:

  • --home是要安装的自定义目录acme.sh。默认情况下,它安装到~/.acme.sh
  • --config-home是一个可写文件夹,acme.sh将在其中写入所有文件(包括cert / keys,configs)。默认情况下--home
  • --cert-home是自定义的目录,用于保存您颁发的证书。默认情况下,它保存在中--config-home
  • --accountemail是用于向Let's Encrypt注册帐户的电子邮件,您将在此处收到续订通知电子邮件。默认为空。
  • --accountkey是保存您帐户私钥的文件。默认情况下,它保存在中--config-home
  • --useragent 是用于发送到“让我们加密”的用户代理标头值。

2. 生成证书

acme.sh 实现了 acme 协议支持的所有验证协议. 一般有两种方式验证: http 和 dns 验证.

1. http 方式需要在你的网站根目录下放置一个文件, 来验证你的域名所有权,完成验证. 然后就可以生成证书了.

a、指定域名格式如下

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

b、通配符命令格式如下

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

区别: www.mydomain.com  和 *.mydomain.com 。

只需要指定域名, 并指定域名所在的网站根目录. acme.sh 会全自动的生成验证文件, 并放到网站的根目录, 然后自动完成验证. 最后会聪明的删除验证文件. 整个过程没有任何副作用.

这条命令,是多域名注册。  格式 : -d 域名1 -d域名2 -d域名...  至少需要一个 -d 。

特别注意:
--wwbroot  后面的路径。必须是 你前面域名的,根目录。 即通过域名,能访问到该目录里面文件的。 不然,生成证书会失败。

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 等数十种解析商的自动集成.

以 dnspod 为例, 你需要先登录到 dnspod 账号, 生成你的 api id 和 api key, 都是免费的. 然后:

export DP_Id="1234"

export DP_Key="sADDsdasdgdsf"

acme.sh   --issue   --dns dns_dp   -d aa.com  -d www.aa.com

证书就会自动生成了. 这里给出的 api id 和 api key 会被自动记录下来, 将来你在使用 dnspod api 的时候, 就不需要再次指定了. 直接生成就好了:

acme.sh  --issue   -d  mydomain2.com   --dns  dns_dp

3. 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/<domain>.cer ,否则 SSL Labs 的测试会报 Chain issues Incomplete 错误。

--installcert命令可以携带很多参数, 来指定目标文件. 并且可以指定 reloadcmd, 当证书更新以后, reloadcmd会被自动调用,让服务器生效.

如果是docker 形式的nginx。  并且生成的证书是在  宿主机上。 则可以忽略 最后一条的 reloadcmd命令。  将证书 通过以上命令,移动到 nginx 容器的 挂载目录里 。 然后进入 nginx 容器,添加 server 监听 433 和 80 端口。 最后重启 nginx 容器即可

贴上我的server配置

server {
  listen 80;
  listen 443 ssl;
  ssl_certificate /etc/nginx/conf.d/ssl/fullchain.cer;
  ssl_certificate_key /etc/nginx/conf.d/ssl/mydomain.key;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
  ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
  ssl_prefer_server_ciphers on;
  ssl_session_timeout 10m;
  ssl_session_cache builtin:1000 shared:SSL:10m;
  ssl_buffer_size 1400;
  add_header Strict-Transport-Security max-age=15768000;
  ssl_stapling on;
  ssl_stapling_verify on;
  server_name pay.mydomain.com;
  access_log /var/log/nginx/pay.mydomain.log combined;
  index index.html index.htm index.jsp;
  root /usr/share/nginx/html;
  
  error_page 404 /404.html;
  error_page   500 502 503 504  /50x.html;
  
  location / { 
	# proxy_set_header Host $host;
	# proxy_set_header X-Real-IP $remote_addr;
	# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
        root   /usr/share/nginx/html;
        index  index.html index.htm;
  }
  location = /50x.html {
	root   html;
  }
  
  location ~ .*\.(wma|wmv|asf|mp3|mmf|zip|rar|jpg|gif|png|swf|flv|mp4)$ {
    valid_referers none blocked *.kedaqianbao.com facepay.kedaqianbao.com;
    if ($invalid_referer) {
        return 403;
    }
  }
  location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
    expires 30d;
    access_log off;
  }
  location ~ .*\.(js|css)?$ {
    expires 7d;
    access_log off;
  }
  location ~ /\.ht {
    deny all;
  }
}

4. 更新证书

目前证书在 60 天以后会自动更新, 你无需任何操作. 今后有可能会缩短这个时间, 不过都是自动的, 你不用关心.

5. 更新 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

6、强制续签证书

acme.sh --renew -d mydomain.com --force
发布了111 篇原创文章 · 获赞 28 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_42697074/article/details/103726273