H, , ' ello. My my d xx xx xx be me z cc MC off to mm. Nx xx xx xx
On Thu, Mar 13, 2025, 20:02 Mik J via nginx <nginx@nginx.org> wrote: > Hello Thomas, > > Thank you for your answer and the time you took to write it down. > > Actually I had created a root CA and an Intermediate CA that I use to sign > my certificates. > I am confused by the name of the directive "ssl_client_certificate" and in > your explanation you tell me that I need to specify the CA certificate that > signed the client certificate. > So I will try that, that confused me. > > Thank you > > > > Le jeudi 13 mars 2025 à 01:54:04 UTC+1, Thomas Ward <tew...@ubuntu.com> a > écrit : > > > > > > > > > > On 2025-03-12 19:45, Mik J wrote: > > > When I read your explanation, I understand that in this file > > ssl_client_certificate /path/to/client/cert/ca.pem; > > => I would need to concatenate all my individual client certificates ? > > No. This is where a deeper understanding of how PKI works is important. > > In the proper scenario, you will have a Certificate Authority certificate > that is used to issue and sign all SSL Client Certificates. Using my > direct example of a PKI chain from before, let's assume this is the chain > of certs that exist in my PKI wherever I manage the X.509 certificates: > CN=Spigot-CA,OU=Technical,O=Spigot,C=US (Serial 69D2DC9DAAABD023) > |-> CN=teward,OU=Admin,O=Spigot (Serial 575EDDCAAA0D654F) > |-> CN=johndoe,OU=HR,O=Spigot > |-> CN=janedoe,OU=Random,O=Spigot > Only one is the Certificate Authority - CN=Spigot-CA - which is the > certificate that cryptographically signs every client certificate - > CN=teward, CN=johndoe, CN=janedoe are an example of multiple users. > > You ONLY specify in `ssl_client_certificate` the certificate that is the > CA certificate. In this case, `/etc/ssl/Spigot-CA/ca.crt` if put in for > ssl_client_certificate would have the PEM encoded form of the CA > certificate with the CN=Spigot-CA. > > > Every single client certificate in the PKI chain is **issued and signed** > by that CA certificate. Case in point, I just created this example PKI in a > local tree of certificates and want to show you the client certificate and > its data after its parsed by OpenSSL: > > $ openssl x509 -noout -text -in teward.crt > Certificate: > Data: > Version: 3 (0x2) > Serial Number: 6295713191616669007 (0x575eddcaaa0d654f) > Signature Algorithm: sha256WithRSAEncryption > Issuer: C = US, O = Spigot, OU = Technical, CN = Spigot-CA, > emailAddress = nore...@example.com > Validity > Not Before: Mar 11 23:26:00 2025 GMT > Not After : Mar 11 23:26:00 2026 GMT > Subject: O = Spigot, OU = Admin, CN = teward, emailAddress = > nore...@example.com > Subject Public Key Info: > Public Key Algorithm: rsaEncryption > Public-Key: (2048 bit) > Modulus: > ... > Exponent: 65537 (0x10001) > X509v3 extensions: > ... > Signature Algorithm: sha256WithRSAEncryption > Signature Value: > ... > > See the "Issuer" line where the issuing certificate authority is > CN=Spigot-CA? That means the certificate *must* be issued by that CA > certificate. However, that alone is not enough. By giving NGINX the > **trusted CA certificate** in `ssl_client_certificate`, we are explicitly > telling it what certificate to use for verification of the signature and > issuing line to validate against. > > Therefore, behind the scenes, NGINX will make sure the signature on the > certificate from its issuing CA is in fact from the CA certificate expected > (therefore preventing the Red Team or a bad guy from creating a different > CA certificate with the same DN and then a client cert with your same DN on > the client cert) to make sure it's legitimate. > > With my brief explanation of how PKI for client authentication works out > of the way... > > > > I wanted to remove "ssl_client_certificate /etc/ssl/certs/myuser.crt" > because I wanted that client verification would work for myuser1, > myuser2....not juste for one user. > > Basicly for all my users in my company, and the website would be exposed > on the internet. > > DO NOT remove the `ssl_client_certificate` line. As explained above, > that's CRITICAL to validate what client certificates are in fact allowed. > As long as all your authorized client certificates for all your users (in > my example, teward, johndoe, and janedoe) are *issued and signed* by the CA > certificate, then the client certificates will be validated against the CA > certificate to make sure that they're signed by the CA certificate NGINX is > told to expect, and then from there the clients will either be accepted or > rejected **based on the validity of the certificate and that it was issued > by the expected CA certificate**. > > You don't need to have a certificate with all the certificate public keys, > etc. of your client certificates, you just need the PEM-encoded file of the > CA certificate, that's how PKI validation will validate the signature on > the client certificates. > > > Thank you for clarifying the attack scenario, I didn't think about it > at all. > > > > You're welcome, there's OTHER attack scenarios (like the one i just > explained also in my example describing PKI above) but this one was > actually used in a pentester's exercise against an Internet-facing TLS > Client Certificate-shielded endpoint we actually have at my dayjob and they > failed to pass any way of generating a 'fake' cert to bypass the client > protections, because the CA certificate was actually used to check/test the > signatures for validity. > > (Also note as a disclaimer, I'm a CISSP certified security professional, > so there's an understanding of how cryptography and the PKI chains are > meant to be used and in fact are used in this scenario ingrained from the > CISSP training) > > --- > Thomas > _______________________________________________ > nginx mailing list > nginx@nginx.org > https://mailman.nginx.org/mailman/listinfo/nginx >
_______________________________________________ nginx mailing list nginx@nginx.org https://mailman.nginx.org/mailman/listinfo/nginx