对于非 PHP/非静态文件网站,lettcrypt certbot-auto 的“webroot-path”应该是什么?

Bas*_*asj 10 apache node.js flask lets-encrypt certbot

如果您有一个仅使用 Apache(可能使用 PHP)的网站,该网站位于:

/home/www/mywebsite/
/home/www/mywebsite/index.php
/home/www/mywebsite/style.css
Run Code Online (Sandbox Code Playgroud)

然后,很容易certbot设置--webroot-path

./certbot-auto certonly --webroot --webroot-path /home/www/mywebsite/
                        --domain example.com --domain www.example.com --email a@example.com
Run Code Online (Sandbox Code Playgroud)

问题:当使用由 NodeJS 或 Python Flask 或 Bottle 运行的网站时,通过 WSGI (mod_wsgi) 或简单代理链接到 Apache(我知道在 Python 的情况下不推荐后者)

RewriteEngine On
RewriteRule /(.*)           http://localhost:5000/$1 [P,L]
Run Code Online (Sandbox Code Playgroud)

应该是什么--webroot-path

更具体地说,如果我们有:

/home/www/mywebsite/       (Pyton example)
/home/www/mywebsite/myapp.py
/home/www/mywebsite/myapp.sqlite
/home/www/mywebsite/static/style.css
...
Run Code Online (Sandbox Code Playgroud)

或者

/home/www/mywebsite/        (NodeJS example)
/home/www/mywebsite/myapp.js
/home/www/mywebsite/myapp.sqlite
/home/www/mywebsite/static/style.css
...
Run Code Online (Sandbox Code Playgroud)

--webroot-path那么选择as就没有意义了/home/www/mywebsite/,对吧?

事实上,我不希望任何其他程序/脚本(例如 LetsEncrypt certbot)来摆弄我的 .py 文件。

无论如何,--webroot-pathin是certbot做什么的?那里的文件会被分析、解析吗?

Dam*_*nic 13

非常有趣的问题,但有一个微不足道的答案。官方文档指出:

\n\n
\n

webroot 插件的工作原理是为您请求的每个\n 域创建一个临时文件${webroot-path}/.well-known/acme-challenge。然后,Let\xe2\x80\x99s 加密验证服务器发出 HTTP 请求来验证每个请求域的 DNS 是否解析为运行 certbot 的服务器。

\n
\n\n

因此,对于 Certbot 来说,你的实际Webroot 实际驻留在哪里并不重要,只要它在你尝试获取证书的域下提供服务,并且它对你的项目/框架是什么并不真正感兴趣结构岛。

\n\n

换句话说,certbot不需要访问包含源文件的项目目录。

\n\n

例如,服务器上任何应用程序的 Apache 配置都可以共享所谓的 webroot,并且 Certbot 仅需要/.well-known/acme-challenge/作为静态目录提供,其中可以在服务器端存储可供 Certbot 验证服务器使用的质询文件:

\n\n
Alias /.well-known/acme-challenge/ "/var/www/html/.well-known/acme-challenge/"\n\n<Directory "/var/www/html/">\n    AllowOverride None\n    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec\n    Require method GET POST OPTIONS\n</Directory>\n
Run Code Online (Sandbox Code Playgroud)\n\n

当设置特定服务器块配置时,它与 NGINX 的工作方式相同:

\n\n
server {\n\n    location /.well-known/acme-challenge/ {\n        alias /var/www/html/.well-known/acme-challenge/;\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果随后请求证书:

\n\n
certbot-auto certonly --webroot --webroot-path /var/www/html -d domain.com\n
Run Code Online (Sandbox Code Playgroud)\n


Bas*_*asj 5

这是对 DamagedOrganic 答案的补充信息(完全归功于他)。

为了让certbot/Letscrypt验证证书,它必须能够访问质询/响应 URL,例如http://example.com/.well-known/acme-challenge/B39sdfoyoesdf21-qksl2638761867648514
因此,它将创建一个临时文件(在最后删除,这就是为什么在成功后你将不再找到它) ,例如在 给定的路径中certbot命名。(然后 Letsencrypt 的服务器将访问之前提到的 URL,以验证一切是否正常。)。.well-known/acme-challenge/B39sdfoyoesdf21-qksl2638761867648514--webroot-path

解决方案:选择--webroot-path作为静态文件的服务目录。示例:如果您有以下结构:

/home/www/mywebsite/
/home/www/mywebsite/myapp.py
/home/www/mywebsite/myapp.sqlite
/home/www/mywebsite/static/style.css        # /static/ serves static files... 
/home/www/mywebsite/static/favicon.ico
...
Run Code Online (Sandbox Code Playgroud)

然后使用

./certbot-auto certonly --webroot --webroot-path /home/www/mywebsite/static/
                        --domain example.com --domain www.example.com --email a@example.com
Run Code Online (Sandbox Code Playgroud)

PS:这是一个 Bottle 的解决方案(我认为它与 Flask 类似):

@route('/.well-known/acme-challenge/<filename>')
def wellknown(filename):           # Letsencrypt certbot-auto
    return static_file(filename, root='./static/.well-known/acme-challenge')
Run Code Online (Sandbox Code Playgroud)