I have been operating websites that use client certificates to authenticate the users.

To my understanding, you need to make your own CA.

First of all, that way an attacker will have huge troubles to even present a suitable certificate, meaning the website is - by default - completely inaccessible to anyone but the users that have been handed the correct client certificates. If a client certificate from a public CA were used, an attacker would be able to establish the connection (using any client certificate from that public CA), and I'd need to check the certificate's serial number, or thumbprint to authenticate the user. Which isn't a major issue, I'd be okay with that.

Second, however, while public CA have no problem issuing you certificates, there's much fewer that'll do client certificates, and they likely won't do it for free (such as let's encrypt).

The problem with the own CA is that the browsers - understandably - present a huge security warning when you try to connect to the site, before letting you choose the client certificate.

Now of course, you could add your own CA to their trust store, but for one, you aren't doing your users any good, because that obviously is a huge security issue, as while they probably trust you, you could still issue certificates for just about any website you'd like then. And second, at least from what I tried, on Android, Chrome presents warnings regardless.

So I issue client certificates from my own CA, and I tell the users to ignore the certificate warning. That doesn't sound right. How am I supposed to do it?

1 Answer 1


I think that you have a misconception here: using your own CA for client certificates does not imply that you have to use your own CA for the server certificate too. It is perfectly fine to use a public CA like Let's Encrypt for the server certificate, while at the same time using your own CA for the client certificates.

In this case the server certificate is checked by the client against the clients trust store and no warnings would happen since the client trusts this public CA. The client certificate is then checked by the server against whatever is configured as CA for checking client certificates - for example using the ssl_client_certificate directive in nginx or SSLCACertificateFile in Apache.

  • You are completely correct. I have set up Apache to have the Let's Encrypt certificates/key in SSLCertificateFile and SSLCertificateKeyFile, and the CA the client certificates need to be checked against in SSLCACertificateFile. Everything works exactly as it should. I also didn't realize that SSLCACertificateFile was only used for client certificate authentication - everything's much clearer now. Thank you!
    – Michael
    May 3, 2022 at 7:41

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .