diff --git a/docker-compose.yaml b/docker-compose.yaml index 7af052e..d788777 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -16,5 +16,6 @@ services: - 443:443 volumes: - ${VOLUME_PATH}/conf.d:/etc/nginx/conf.d + - ${VOLUME_PATH}/letsencrypt-acme-challenge:/data/letsencrypt-acme-challenge - ${VOLUME_PATH}/etc/letsencrypt:/etc/letsencrypt - ${VOLUME_PATH}/tmp:/tmp diff --git a/includes/letsencrypt-acme-challenge.conf b/includes/letsencrypt-acme-challenge.conf new file mode 100644 index 0000000..ff2a782 --- /dev/null +++ b/includes/letsencrypt-acme-challenge.conf @@ -0,0 +1,30 @@ +# Rule for legitimate ACME Challenge requests (like /.well-known/acme-challenge/xxxxxxxxx) +# We use ^~ here, so that we don't check other regexes (for speed-up). We actually MUST cancel +# other regex checks, because in our other config files have regex rule that denies access to files with dotted names. +location ^~ /.well-known/acme-challenge/ { + # Since this is for letsencrypt authentication of a domain and they do not give IP ranges of their infrastructure + # we need to open up access by turning off auth and IP ACL for this location. + auth_basic off; + auth_request off; + allow all; + + # Set correct content type. According to this: + # https://community.letsencrypt.org/t/using-the-webroot-domain-verification-method/1445/29 + # Current specification requires "text/plain" or no content header at all. + # It seems that "text/plain" is a safe option. + default_type "text/plain"; + + # This directory must be the same as in /etc/letsencrypt/cli.ini + # as "webroot-path" parameter. Also don't forget to set "authenticator" parameter + # there to "webroot". + # Do NOT use alias, use root! Target directory is located here: + # /var/www/common/letsencrypt/.well-known/acme-challenge/ + root /data/letsencrypt-acme-challenge; +} + +# Hide /acme-challenge subdirectory and return 404 on all requests. +# It is somewhat more secure than letting Nginx return 403. +# Ending slash is important! +location = /.well-known/acme-challenge/ { + return 404; +}