Я использую nginx, чтобы добавить функциональность TLS поверх существующего TCP-сервера (Redis), проксируя его следующим образом (пожалуйста, прочитайте, прежде чем сказать «Redis имеет встроенную поддержку TLS»):
транслировать {
сервер {
слушать 6379 ssl;
ssl_certificate /etc/ssl/private/tls.crt;
ssl_certificate_key /etc/ssl/private/tls.key;
ssl_client_certificate /etc/ssl/private/ca.crt;
ssl_verify_client включен;
proxy_pass redis: 679;
}
}
Однако это примет все клиентские сертификаты, подписанные указанным ЦС. Я хотел бы принимать только клиентские сертификаты с определенным CN: cn=api
. При проксировании HTTP я могу использовать если
такое заявление
если ($ ssl_client_s_dn! = "CN = API") {
вернуть 403;
}
Однако кажется, что если
подобные утверждения не допускаются на потоковых серверах. В качестве обходного пути я использовал карта
оператор для маршрутизации запросов, не соответствующих CN, несуществующему восходящему потоку, например:
транслировать {
восходящий поток redis_backend {
сервер редис: 6379;
}
карта $ssl_client_s_dn $backend_svr {
"CN=API" redis_backend;
ноль по умолчанию;
}
сервер {
...
прокси_пасс $backend_svr;
}
}
Однако я не могу не чувствовать, что должен быть лучший способ отклонить соединение из-за несоответствия клиентских сертификатов.