Folosesc nginx pentru a adăuga funcționalitate TLS peste un server TCP existent (Redis) prin proxy-l așa (vă rugăm să citiți înainte de a spune „Redis are suport TLS încorporat”):
curent {
Server {
asculta 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 activat;
proxy_pass redis:679;
}
}
Cu toate acestea, acest lucru va accepta toate certificate de client care au fost semnate de CA specificată. Aș dori să accept doar certificate de client cu un anumit CN: cn=api
. Când fac proxy HTTP pot folosi un dacă
afirmație ca aceasta
if ($ssl_client_s_dn != "CN=api") {
întoarce 403;
}
Cu toate acestea, se pare că dacă
astfel de declarații nu sunt permise în serverele de flux. Ca o soluție, am folosit un Hartă
declarație pentru a direcționa cererile care nu se potrivesc cu CN la un amonte inexistent, ca acesta:
curent {
în amonte redis_backend {
server redis:6379;
}
harta $ssl_client_s_dn $backend_svr {
"CN=api" redis_backend;
implicit nul;
}
Server {
...
proxy_pass $backend_svr;
}
}
Cu toate acestea, nu pot să nu simt că trebuie să existe o modalitate mai bună de a respinge conexiunea pentru certificatele client nepotrivite.