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

时间:2016-11-23 15:28:28

标签: ubuntu ssl nginx ssl-certificate lets-encrypt

我使用useful tool来自letsencrypt自动创建和续订SSL证书。我有"参数化#34;链接网站上显示的步骤,以便我可以使用说明获取和维护多个网站的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的nginx配置完全相同(除非指定了服务器名称)
  2. foo和foobar网站的文件夹结构和权限完全相同。
  3. 网站具有相同的物理静态IP地址,但服务器名称不同;即不同的域名解析为相同的IP地址。
  4. 以下是我尝试获取 foobar 证书后的错误日志的内容:

    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/

    任何人都能解释造成这个问题的原因吗? - 如何解决?

2 个答案:

答案 0 :(得分:0)

节省时间的建议,在服务器块中添加此位置块并尝试

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

答案 1 :(得分:0)

你看过let-nginx是如何做到这一点的吗?听起来你正试图在它的entrypoint.sh脚本中进行基本上正在做的事情,但是在容器内。

完全使用docker容器可能更容易,但是如果你不能这样做可能会有助于指导你完成脚本的设置。