Использование возможностей ретрансляции SMTP NGINX, как описано здесь , для прокси на коммерческом SMTP-сервере, эффективно «белой меткой» адреса ретрансляции (включая сертификат) при сохранении аутентификации.
Настроил NGINX следующим образом:
mail {
server_name smtp.proxy.mydomain.net;
auth_http 127.0.0.1:9000/auth;
proxy_pass_error_message on;
xclient off;
smtp_capabilities "8BITMIME" "STARTTLS" "PIPELINING" "ENHANCEDSTATUSCODES";
starttls on;
ssl_certificate /etc/letsencrypt/live/smtp.proxy.mydomain.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/smtp.proxy.mydomain.net/privkey.pem;
ssl_protocols TLSv1.2;
ssl_session_cache shared:SSL:10m;
server {
listen 587;
protocol smtp;
smtp_auth login plain;
}
}
Сертификат используется NGINX, когда клиент запрашивает STARTTLS, а клиент (в моем случае swaks
) отправляет учетные данные AUTH LOGIN в NGINX.
NGINX затем вызывает mail_auth_http_module OK. У меня есть простое приложение Python Flask, которое возвращает заголовки, указывающие, что аутентификация всегда принимается, и адрес сервера. Вы можете увидеть ответ сервера аутентификации на запрос curl
здесь:
$ curl -v localhost:9000/auth
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 9000 (#0)
> GET /auth HTTP/1.1
> Host: localhost:9000
> User-Agent: curl/7.61.1
> Accept: */*
>
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Content-Type: text/html; charset=utf-8
< Content-Length: 2
< Auth-Status: OK
< Auth-Server: 52.214.232.65
< Auth-Port: 587
< Server: Werkzeug/0.15.2 Python/3.6.8
< Date: Tue, 07 May 2019 23:10:29 GMT
<
* Closing connection 0
Затем NGINX пытается выполнить дальнейшую доставку на сервер, как и ожидалось. Я вижу, что он соответствует правильной конечной точке сервера.
К сожалению, в моем случае сервер требует (и всегда будет требовать) те же учетные данные для входа, которые были предоставлены клиентом. В этот момент доставка завершается с ошибкой «5.7.1 Требуется авторизация», поскольку NGINX не предоставляет их дальше.
Я подозреваю, что NGINX предполагает, что, поскольку он вызвал модуль аутентификации, серверу не потребуются дополнительные учетные данные, и поэтому он их не предоставляет.
Есть ли способ заставить NGINX "пропустить" аутентификационные данные на сервере?