SSL Client Authentication Step By Step


Installing an operating system and Apache is outside the scope of the blog post and I assume you have a functioning Apache install before we get started. I am using an Ubuntu 12.04.4 system in this blog post.

Generate a certificate authority (CA) cert

The first step is to generate a CA certificate. This CA certificate does not need to be generated on your web server – it can sit on whatever machine you will use to generate SSL certificates. Once created, the CA cert will act as the trusted authority for both your server and client certs. It is the equivalent of the Verisign or Comodos in the real world of SSL, however you wouldn’t want to use your CA cert for a major public website as its trust isn’t going to be built into browsers everywhere.

Generate your CA certificate using this command:


Then keep them secret – keep them safe. If someone were to get a hold of these files they would be able to generate server and client certs that would be trusted by our web server as it will be configured below.

Generate your Apache server SSL key and certificate

Now that we have our CA cert, we can generate the SSL certificate that will be used by Apache.

  1. Generate a server private key.
    openssl genrsa -out server.key 4096
  2. Use the server private key to generate a certificate generation request.
    openssl req -new -key server.key -out server.req -sha256
  3. Use the certificate generation request and the CA cert to generate the server cert.
  4. Clean up – now that the cert has been created, we no longer need the request.
    rm server.req

Install the server certificate in Apache

My server is running Ubuntu 12.04.4 so all paths and commands referenced here are for that operating system.

    cp ca.cer /etc/ssl/certs/
  2. Copy the server cert and private key to permanent place.
    cp server.cer /etc/ssl/certs/server.crt
    cp server.key /etc/ssl/private/server.key
  3. Activate the SSL module in Apache.
    a2enmod ssl
  4. Activate the SSL site in Apache and disable the HTTP site.
    a2ensite default-ssl
    a2dissite default
  5. Edit /etc/apache2/sites-enabled/000-default-ssl (the config file for the SSL enabled site) and add:
    SSLCACertificateFile /etc/ssl/certs/ca.cer
    SSLCertificateFile    /etc/ssl/certs/server.crt
    SSLCertificateKeyFile /etc/ssl/private/server.key
  6. Apply the config in Apache.
    service apache2 restart


Generate a client SSL certificate

  1. Generate a private key for the SSL client.
    openssl genrsa -out client.key 4096
  2. Use the client’s private key to generate a cert request.
    openssl req -new -key client.key -out client.req
  3. Issue the client certificate using the cert request and the CA cert/key.
  4. Convert the client certificate and private key to pkcs#12 format for use by browsers.
    rm client.key client.cer client.req

Looks like a pretty similar process to generating a server certificate, huh?

Lastly, import the .p12 file into your browser. On Windows you can double click the file to import into the operating system’s keystore that will be used by IE and Chrome. For Firefox, open the Options -> Advanced -> Certificates -> View Certificates -> Your Certificates and import the certificate.


8 thoughts on “SSL Client Authentication Step By Step”

  1. Hi, this is a very clear description…Thx. But one question please, can the client certificate be used as a pinned certificate in an android application?

    1. That is a very good question. I do not know the answer, sorry, but if you figure it out, please leave a comment back to let us know!

  2. Nice article. Can you please share regarding buying an certificates (Server as well as client)? Do we need to buy both the certificates(client cert & server cert) from same CA or different?

    1. I don’t have any experience with buying certificates unfortunately. I would assume they should be from the same CA though. Good luck.

  3. Hi Dan,

    i miss following configuration in your description:

    SSLVerifyClient require
    SSLVerifyDepth 1 (or more)
    SSLCACertificateFile /etc/ssl/certs/bla..bla..

    1. Hi, do you mean that those statements are required for client cert validation to take place? That is not what I have seen in practice on my server.

  4. Hi Dan,
    Could you explain the process for windows server as well? Certificate generated like above is not working in windows server.

    1. The openssl commands should work on Windows server to generate the certificates if you have the openssl software installed. Unfortunately I do not have experience with installing certificates on Windows server so I can’t help with the installation piece.

Leave a Reply
