
私は、マルチテナント SAAS プラットフォーム内で、OpenResty/Lua と LetsEncrypt を使用して SSL 証明書を自動生成する Nginx プロキシ サーバーを実行しています。証明書を必要とするドメインが多数あり、それらをホワイトリストに登録できないため、証明書サーバーは、そのサーバーを指すすべての要求を受け入れます。
次のドメイン構造に一致する無効なドメイン リクエストが多数届くようになりました:
www.randomsubdomain.anydomain.com
そのドメイン名構造は私のサービスでは有効ではないので、この構造をキャッチして 444 応答を返すサーバー ブロックを nginx 構成に作成し、LE から証明書がまったく要求されないようにしたいと思います。
私がテストしたものは次のとおりです:
server {
listen 80;
server_name ~^www\.(.+)\.(.+)\.com$;
return 444;
}
残念ながら、構成をリロードすると、このブロックはテスト ドメインをキャッチしないようです。テスト ドメイン (www.randomsubdomain.anydomain.com) は通過し、証明書が発行されますが、これは私が望んでいることではありません。これは私の正規表現の問題でしょうか? 私は PCRE/nginx 正規表現の専門家からは程遠いので、私の正規表現は利用可能なオンライン テスターの 1 つを使用して構築されました。
しかし、server_name を実際のドメイン名「www.test.customdomain.com」に変更すると、サーバー ブロックがそれをキャッチし、必要な 444 応答を返します。
LetsEncrypt 証明書を発行するために、アプリにかなりの数の server_blocks を設定しています。そのため、正規表現が原因でない場合は、上記のブロックが上部近くにあるにもかかわらず、他のブロックのいずれかが優先されると思います。
以下に、参考までに完全なブロックを示します。app-server.com は私のサービスのドメイン名です。ヒントやガイダンスがあれば、ぜひ教えてください。
user ec2-user www;
events {
worker_connections 1024;
}
http {
lua_shared_dict auto_ssl 100m; #need 1MB per 100 domains in memory
lua_shared_dict auto_ssl_settings 64k;
resolver 8.8.8.8 ipv6=off;
init_by_lua_block {
auto_ssl = (require "resty.auto-ssl").new()
auto_ssl:set("allow_domain", function(domain)
return true
end)
auto_ssl:init()
}
init_worker_by_lua_block {
auto_ssl:init_worker()
}
# Handles SSL app-server.com subdomain requests so they aren't redirected
server {
listen 443 ssl;
server_name *.app-server.com;
location / {
proxy_pass http://ssl-sites.app-server.com;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Ssl on;
}
ssl_certificate_by_lua_block {
auto_ssl:ssl_certificate()
}
ssl_certificate /etc/ssl/resty-auto-ssl-fallback.crt;
ssl_certificate_key /etc/ssl/resty-auto-ssl-fallback.key;
}
# Capture SSL requests that already have www and redirect to https://www
server {
listen 443 ssl;
server_name www.*;
location / {
proxy_pass http://ssl-sites.app-server.com;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Ssl on;
}
ssl_certificate_by_lua_block {
auto_ssl:ssl_certificate()
}
ssl_certificate /etc/ssl/resty-auto-ssl-fallback.crt;
ssl_certificate_key /etc/ssl/resty-auto-ssl-fallback.key;
}
# Capture SSL requests without www and redirect to https://www on subsequent requests once the cert is issued
server {
listen 443 ssl default_server;
ssl_certificate_by_lua_block {
auto_ssl:ssl_certificate()
}
ssl_certificate /etc/ssl/resty-auto-ssl-fallback.crt;
ssl_certificate_key /etc/ssl/resty-auto-ssl-fallback.key;
return 301 https://www.$host$request_uri;
}
# Capture invalid subdomains
server {
listen 80;
server_name ~^www\.(.+)\.(.+)\.com$;
return 444;
}
# Capture requests that already have www and redirect to https://www
server {
listen 80;
server_name www.*;
location / {
return 301 https://$host$request_uri;
}
# send to challenge if looking for it
location /.well-known/acme-challenge/ {
content_by_lua_block {
auto_ssl:challenge_server()
}
}
}
# Captures the app-server.com subdomain requests and redirects them
server {
listen 80 ;
server_name *.app-server.com;
location / {
return 301 https://$host$request_uri;
}
# send to challenge if looking for it
location /.well-known/acme-challenge/ {
content_by_lua_block {
auto_ssl:challenge_server()
}
}
}
# Capture requests without www and redirect to https://www
server {
listen 80 default_server;
location / {
return 301 https://www.$host$request_uri;
}
# Endpoint used for Let's Encrypt domain validation
location /.well-known/acme-challenge/ {
content_by_lua_block {
auto_ssl:challenge_server()
}
}
}
server {
listen 127.0.0.1:8999;
client_body_buffer_size 128k;
client_max_body_size 128k;
location / {
content_by_lua_block {
auto_ssl:hook_server()
}
}
}
}