docker logs -f letsencrypt
最后,我卡在 Cleaning up challenges 这一步。这是因为我域名没有备案,无法通过域名访问到我所在的主机。这个时候打开域名链接被重定向到云主机提供商的网页禁止访问,Let’s encrypt 没办法通过域名访问到本机,所以验证失败(事实上它也没有说失败,只是一直停在那里)。
毋庸置疑,我是因为这个原因被禁止访问的。
既然 HTTP(80端口)方式验证走不通,tls-sni本来就不行,那就只能用 dns 验证了。
2.2 使用dns方式验证
这里以CloudFlare为例
第一步 完成域名服务器配置
首先,要有一个 cloudflare 账号。然后,在域名提供商那里将域名的 DNS 服务器改成 cloudflare 提供的 DNS 服务器。然后,在cloudflare那里添加对应的解析记录。
注意:解析记录 Status 的图标应该是灰色的,表示 DNS only。如果图标亮了,表示 DNS and HTTP proay(CDN),要使用 let’s encrypt 的 DNS 校验的话就不要再开 HTTP 代理和 CDN 了。开了代理的话 cloudflare 会免费给你提供(及自动维护更新)SSL证书,就可以直接 HTTP 访问了。不需要本文再干嘛了,而且还有免费 CDN,可谓十分良心。
第二步 完成域名服务器 API-KEY 相关配置并启动
这一步先正常启动,会启动失败但会生成所有的配置文件。再根据相应的 ini 文件里的提示去域名服务器提供商那里找到相对应的凭证,修改 ini 文件,重新启动容器。
启动如下。这次我映射到宿主机目录 /opt/letsencrypt2 下,把 VALIDATION 改为 dns,增加 DNSPLUGIN 配置为 cloudflare。
docker run -d \
--cap-add=NET_ADMIN \
--name=letsencrypt \
-v /opt/letsencrypt2:/config \
-e PGID=1002 -e PUID=1001 \
-e URL=my.com \
-e SUBDOMAINS=www \
-e VALIDATION=dns \
-e DNSPLUGIN=cloudflare \
-p 80:80 -p 443:443 \
-e TZ=Asia/Shanghai \
linuxserver/letsencrypt
使用 docker logs -f letsencrypt 查看。
这次是在 Cleaning up challenges 之后报错… 错误提示也很明确,是 Unknown X-Auth-Key or X-Auth-Email 的问题,配置是在 /config/dns-conf/cloudflare.ini 这个文件里面。
Cleaning up challenges
Error determining zone_id: 9103 Unknown X-Auth-Key or X-Auth-Email. Please confirm that you have supplied valid Cloudflare API credentials. (Did you enter the correct email address?)
IMPORTANT NOTES:
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
ERROR: Cert does not exist! Please see the validation error above. Make sure you entered correct credentials into the /config/dns-conf/cloudflare.ini file.
打开 /config/dns-conf/cloudflare.ini 可以看到
# Instructions: https://github.com/certbot/certbot/blob/master/certbot-dns-cloudflare/certbot_dns_cloudflare/__init__.py#L20
# Replace with your values
dns_cloudflare_email = cloudflare@example.com
dns_cloudflare_api_key = 0123456789abcdef0123456789abcdef01234567
感兴趣的可以到介绍的页面去查看相关信息,也可以直接到对应域名解析服务提供商那里去看。cloudflare 查看的地址是 https://dash.cloudflare.com/profile,最上面是 Email,最下面是 API Keys。
将对应内容替换到 /config/dns-conf/cloudflare.ini 里面(即宿主机的 /opt/letsencrypt2/dns-conf/cloudflare.ini 里面)。然后,使用 docker rm -f letsencrypt 强制删掉原容器。再重新运行上面的 docker run 就可以成功启动了。
查看日志如下:
最终会停在 Server ready 这一行(如果用 root 用户的 uid 和 gid 的话,现在会一直报错,但仍可使用)。这个时候就可以用 HTTPS 打开了(内置的 Nginx 只监听443端口,所以不能用 HTTP 打开),显示如下界面即为正常。
3. 设置
3.1 安全和密码保护
可以使用 Nginx 的 htpasswd 来对网站进行密码保护。htpasswd 的相关用法可见 htpasswd命令。
- 添加第一个密码访问用户(
-c
参数表示创建一个加密文件,如果原来有的话则把原来的删掉)
docker exec -it letsencrypt htpasswd -c /config/nginx/.htpasswd <username>
docker exec -it letsencrypt htpasswd /config/nginx/.htpasswd <username>
如下为添加两个用户(lin 和 shen)
查看用户信息文件(/opt/letsencrypt2 是我映射到容器 /config 的目录)
然后,还需要在 Nginx 的配置文件(默认为 /config/nginx/site-confs/default)里面开启 auth_basic,如下:
location / {
try_files $uri $uri/ /index.html /index.php?$args =404;
# 将下列两行放到location{}里面,**Restricted**是网站要求输入账号密码时