Letsencrypt,nginx和Ubuntu上的虚拟服务器

我正在使用一个有用的工具来自动化从letsencrypt创build和更新SSL证书。 我已经“参数化”链接站点上显示的步骤,以便我可以使用说明来获取和维护多个网站的SSL证书。

我在Ubuntu 16.0.4 LTS上运行nginx。 我使用nginx运行多个虚拟服务器。

我成功地获得了第一个域名(foo.com,www.foo.com,mail.foo.com)的证书,所以我知道我的步骤/脚本等的“参数化”工作。

我正在尝试为其他网站获取证书。 我正试图获得foobar.com,www.foobar.com,mail.foobar.com和staff.foobar.com的证书。

当我运行我的getcert.sh脚本(修改为foobar.com)时,它返回以下消息:

memyself@yourbox:/opt/sslcert/foobar# su -s /bin/bash -c '/opt/sslcert/foobar/bin/getcert.sh' sslcert acme/challenge failed: { "type": "http-01", "status": "invalid", "error": { "type": "urn:acme:error:unauthorized", "detail": "Invalid response from http://mail.foobar.com/.well-known/acme-challenge/RsX0GNAPx-ODGvMTHCjQ9uSru7AazwkmmG6gmo-yAkk: \"\u003chtml\u003e\r\n\u003chead\u003e\u003ctitle\u003e404 Not Found\u003c/title\u003e\u003c/head\u003e\r\n\u003cbody bgcolor=\"white\"\u003e\r\n\u003ccenter\u003e\u003ch1\u003e404 Not Found\u003c/h1\u003e\u003c/center\u003e\r\n\u003chr\u003e\u003ccenter\u003e\"", "status": 403 }, "uri": "https://acme-v01.api.letsencrypt.org/acme/challenge/83fRVxQHUjMUHzqK2Cc0gTflM_3wuwuItW5-Y6Xlfo0/360341585", "token": "RsX0GNAPx-ODGvMTHCjQ9uSru7AazwkmmG6gmo-yAkk", "keyAuthorization": "RsX0GNAPx-ODGvMTHCjQ9uSru7AazwkmmG6gmo-yAkk.9CRniSJOopxytAkBrkdIFkhM5tJzGI6kbXfB0998SNk", "validationRecord": [ { "url": "http://mail.foobar.com/.well-known/acme-challenge/RsX0GNAPx-ODGvMTHCjQ9uSru7AazwkmmG6gmo-yAkk", "hostname": "mail.foobar.com", "port": "80", "addressesResolved": [ "66.228.37.10" ], "addressUsed": "66.228.37.10" } ] } 

有几点值得一提:

  1. foo.com和foobar.com的nginxconfiguration是相同的(除非指定了服务器名称)
  2. 文件夹结构和权限是完全相同的网站foo和foobar。
  3. 这些网站具有相同的物理静态IP地址,但是不同的服务器名称; 即不同的域名parsing为相同的IP地址。

这里是错误日志的内容后,我试图获得foob​​ar证书:

 memyself@yourbox:~# cat /var/log/nginx/error.log 2016/11/19 10:07:41 [error] 30345#30345: *78 open() "/opt/sslcert/foo/acme-challenge/1aLrSYLJGhDBtihuoXAsdh1K0jpdmcWBYWYPGxFNJXo" failed (2: No such file or directory), client: 66.133.109.36, server: foo.com, request: "GET /.well-known/acme-challenge/1aLrSYLJGhDBtihuoXAsdh1K0jpdmcWBYWYPGxFNJXo HTTP/1.1", host: "mail.foobar.com" 

从上面可以看出,这个证书正试图从/opt/sslcert/foo/acme-challenge/读取,应该是/opt/sslcert/foobar/acme-challenge/

任何人都可以解释是什么导致这个问题? – 如何解决?

你看看let-nginx是怎么做的吗? 这听起来像你试图做本质上是在它的entrypoint.sh脚本,但在一个容器内。

这完全可以使用Docker容器,但如果你不能这样做,可能会帮助指导你完成一个脚本的设置。

一个节省时间的建议,添加这个位置块在你的服务器块,并尝试

 location ~ /.well-known { allow all; root /path/to/webroot/; } 

如果你没有问题使用另一个命令(正在使用):

 /opt/letsencrypt/letsencrypt-auto certonly -a webroot --webroot-path="/path/to/webroot/" -d "domain_name1" -d "domain_name2" --non-interactive --email="you@email.com" --agree-tos 

注意事项:

  • 假设您将letsencrypt安装路径安装为/ opt / letsencrypt /

  • 在Ubuntu 14.04&16.04上测试过,希望在任何linux系统下使用它都没有问题

  • 如果您使用新的certbot,请将 letsencrypt-auto重命名为certbot-auto