nginx http acme module ngx_http_acme_module 能实现 nginx 自动签发、部署、续签 HTTPS 证书;有了 ngx_http_acme_module 就不用花钱买 TLS 证书了,所有操作全部由 nginx acme 模块自动完成,不需要任何人工操作。
这篇文章将展示 nginx http acme module ngx_http_acme_module 的具体配置,给出配置中容易踩的坑及避坑方法。
要配置 nginx acme module ngx_http_acme_module,需要先让 nginx 有 nginx acme module ngx_http_acme_module 模块;目前为止,它不是一个标准模块,不随 nginx 官方源码或预编译程序发行,需要自行编译,编译及使用方法见另一篇文章《编译使用 nginx http acme module ngx_http_acme_module 实现自动签发、部署、续签 HTTPS 证书》。
以下内容的前提是已经编译并且能成功使用 nginx http acme module ngx_http_acme_module。
第一步,配置 nginx 配置文件,让 nginx 配置文件必须有以下配置,其他配置按需要自行把控。
如果将 nginx http acme module ngx_http_acme_module 编译成了动态加载模块,在 nginx 主配置文件中的 main 配置块(最顶层配置)加入以下配置来加载模块文件——不要放在太靠后的位置,尽量靠前,否则有可能报错;如果将 nginx http acme module ngx_http_acme_module 静态编译进了 nginx 主程序,可以跳过这一步。- load_module modules/ngx_http_acme_module.so;
复制代码 在 nginx http 配置块加入以下配置。- acme_issuer qsez.org {
- uri https://acme-v02.api.letsencrypt.org/directory;
- contact ohcc@163.com;
- challenge tls-alpn;
- ssl_verify on;
- state_path /wuxiancheng.cn/nginx/etc/ssl/acme;
- accept_terms_of_service;
- }
- acme_shared_zone zone=ngx_acme_shared:4M;
- resolver [2001:4860:4860::8888] [2606:4700:4700::1111] 1.1.1.1 8.8.8.8;
复制代码 uri 是证书颁发机构用来签发 HTTPS 证书的接口链接地址;如果使用其他证书颁发机构,根据实际情况改写。
challenge 配置验证网站的方式;tls-apln 不依赖于 80 端口,http 依赖于 80 端口,纯 HTTPS 网站必须使用 tls-alpn。
state_path 是用来存放账号及证书相关文件的目录,目录路径可以自己定义;这个配置可以不写,但会导致重启 nginx 后账号及证书相关文件丢失。
resolver 配置的是 DNS 解析服务器地址,可以根据需要配置为其他服务器的地址;这个配置必须存在,不能去掉,否则 nginx 会直接报错。
第二步,配置 server 块。- server {
- listen 443 ssl;
- listen 443 quic;
- listen [::]:443 ssl;
- listen [::]:443 quic;
- http3 on;
- http2 on;
- server_name wxc.me www.wxc.me;
- acme_certificate qsez.org;
- ssl_certificate $acme_certificate;
- ssl_certificate_key $acme_certificate_key;
- location / {
- return 301 https://www.wuxiancheng.cn$request_uri;
- }
- }
复制代码 server_name 指定网站的服务域名。
注意这里说的域名和“域名注册”中的“域名”不是一个概念——它是指用来访问网站的主机名称,它可以是域名、域名的子域名或 localhost 这样的非标准域名。在这里配置的每一个值都会被签发到同一张 HTTPS 证书中去。
每一个服务域名都必须提前做好域名记录的解析,能够被公网访问到;证书颁发机构会用这些服务域名来验证网站归属,只有网站能被证书颁发机构访问才可能正常申请到 TLS 证书,只要有任何一个服务域名无法通过验证,整个 server 都不会有任何一个服务域名能申请到 HTTPS 证书。
必须使用确切的 server name 值,保证签发证书时知道哪些具体的服务域名需要签发证书;不能使用 *.wuxiancheng.cn 这样包含通配符或 [a-z0-9]+\.qsez\.org$ 这样包含正则表达式的 server name;只要有任何一个在申请证书时不能确定其具体内容的服务域名值,nginx acme 将不能为任何一个服务域名签发证书;像 .qsez.org 这种以点打头的服务域名,不会导致配置失效,而会被去掉前置点号来申请证书——在 nginx 配置文件中,.qsez.org 和 qsez.org *.qsez.org 等效,但 nginx acme HTTP 和 TLS-ALPN 两种验证方式将它解释为 qsez.org。
nginx http acme module 不会自动为域名添加带 www 前缀的服务域名,所有服务域名都需要显式定义。
如果证书已经签发,又加入了新的服务域名,nginx acme 不会自动重新签发证书来将新添加的服务域名也签进 TLS 证书中;要让新服务域名被签进 HTTPS 证书中,需要删除它所在 server 之前签发成功的证书的证书文件和私钥文件。
acme_certificate 的值,是 acme_issuer 后面的名称,它代表的不是域名;一个 acme_issuer 可以被多个 server 使用。
location 不是必须的。其他参数根据实际情况配置。
第三步,完成上述配置后,重启 nginx 或重新加载 nginx 配置。
如果配置正确,并且不存在会导致无法确定要签发证书的域名的 server_name 值,nginx acme module ngx_http_acme_module 会自动向证书颁发机构发送请求来完成证书的签发流程。成功申请到 HTTPS 证书后,nginx 会自动加载证书文件和私钥文件,不需要人工干预。如果配置了 state_path,在证书签发成功后,证书文件和私钥文件会以第一个 server_name 作为部分文件名保存在 state_path 配置的目录中;完整文件名类似于 wxc.me-9ff4c39c170313a4.crt 和 wxc.me-9ff4c39c170313a4.key;nginx acme 会自动续签新的证书。
其他配置可以参考 nginx 官方文档中的 ngx_http_acme_module 章节 |
|