无需root权限,如何通过acme.sh在非80端口申请Let's Encrypt证书
解决方案:非root用户用acme.sh在非80端口完成Let's Encrypt验证
首先明确:Let's Encrypt的HTTP-01挑战必须通过80端口接收验证请求,这是官方规范,无法让Let's Encrypt直接访问8000或其他端口做验证。你之前用--httpport参数无效,是因为该参数仅在acme.sh的--standalone独立模式下生效,webroot模式会忽略这个参数。
下面提供两种可行方案,均无需root权限(前提是你能控制80端口的反向代理,或能配置自己的Web应用):
方案1:让现有Web应用(8000端口)处理验证请求
- 创建专门的验证目录,比如
~/acme-challenges - 配置你的Web应用(8000端口),将
/.well-known/acme-challenge/路径的请求映射到这个目录的静态文件(具体配置方式取决于你的应用框架:比如Nginx反向代理可在location中加alias指向该目录;Python Flask可添加静态路由) - 确保80端口的反向代理(比如服务器上的Nginx/Apache)将
/.well-known/acme-challenge/路径的请求转发到8000端口的应用 - 运行acme.sh的webroot模式命令,指定验证目录:
/home/webapp/.acme.sh/acme.sh --issue --webroot ~/acme-challenges -d mydomain.com --staging --debug
方案2:acme.sh独立模式+反向代理转发
- 配置80端口的反向代理,将
/.well-known/acme-challenge/路径的请求转发到一个高于1024的端口(比如3000,非root用户可监听) - 用acme.sh的独立模式监听该端口,处理验证请求:
/home/webapp/.acme.sh/acme.sh --issue --standalone --httpport 3000 -d mydomain.com --staging --debug
此时acme.sh会在3000端口启动临时HTTP服务,反向代理将80端口的验证请求转发过来,即可完成验证。
补充选项:TLS-ALPN-01挑战(依赖443端口)
如果你的服务器443端口可用,也可以尝试这种挑战方式,用acme.sh的--alpn模式指定监听端口:
/home/webapp/.acme.sh/acme.sh --issue --alpn --alpnport 8443 -d mydomain.com --staging --debug
需要反向代理将443端口的ALPN请求转发到8443端口。
内容的提问来源于stack exchange,提问作者MrTux01
相关产品推荐
相关产品推荐

