tldr
Prin mTLS, încerc să găsesc o modalitate de a emite un certificat de client care să permită clientului să acceseze un anumit subdomeniu. Am o bănuială că acest lucru nu este posibil, dar nu sunt sigur.
Ceea ce încerc să realizez
Să presupunem că am un server care ascultă orice direcționat *.foo.flar.com
Fiecărui client i se atribuie propriul subdomeniu care îndeplinește wildcard-ul din adresa serverului.
De exemplu, client1
ar trebui să acceseze serverul prin customer1.foo.flar.com
, și client2
ar trebui să acceseze serverul prin customer2.foo.flar.com
.
În plus, un client trebuie să fie împiedicat să acceseze serverul folosind un subdomeniu diferit al clientului. Deci, este ilegal pentru client1
la cerere customer2.foo.flar.com
, iar o astfel de cerere ar trebui respinsă.
Speram că voi putea realiza acest lucru la nivelul de sesiune prin mTLS și o utilizare inteligentă a certificatului SAN, dar întâmpin probleme să funcționeze corect.
Cum am configurat lucrurile
Sunt destul de nou în a juca cu TLS, așa că multe din asta au venit acest răspuns SO despre configurația SAN și acest articol despre configurația mTLS de bază.
Am omis câteva lucruri aici, cum ar fi generarea certificatelor CA și generarea CSR pentru client și server pentru a încerca să mențin lucrurile concentrate, dar le pot adăuga dacă doriți.
Am creat un certificat de server folosind ceva de genul:
openssl x509 \
-req \
-extfile <(printf "subjectAltName=DNS:*.foo.flar.com") \
-zile 365 \
-in server.csr \
-CA ca.crt \
-CAkey ca.key \
-CAcreateserial \
-out server.crt
Apoi am creat un certificat client folosind ceva de genul:
openssl x509 \
-req \
-extfile <(printf "subjectAltName=DNS:customer1.foo.flar.com") \
-zile 365 \
-in client.csr \
-CA ca.crt \
-CAkey ca.key \
-CAcreateserial \
-out client.crt
Serverul (scris în Go) este configurat să solicite și să verifice certificatele client.
Problema
Problema este că atunci când testez această configurare, conexiunea reușește atunci când m-aș aștepta să eșueze.
Dacă am un client care a emis client1
cert sunați la server la customer1.foo.flar.com
, conexiunea reușește.
Cu toate acestea, dacă am un client care a emis client1
cert sunați la server la customer2.foo.flar.com
, acea conexiune reușește și atunci când m-aș aștepta să eșueze.
Speram că, după inspecția certificatului clientului, serverul va vedea asta client1
nu are acces la client2...
, și ar respinge cererea. Dar acest lucru nu pare să se întâmple.
Idei?