Existem duas coisas que você precisa fazer.
Primeiro, você precisa gerar certificados para os navegadores que você vai conectar.
Em seguida, você precisa definir o Apache para exigir esses certificados para alguma pasta.
A parte do apache é simples - basta adicionar isso ao seu /etc/apache2/sites-enabled/your_apache_file.conf:
<Location /path/to/folder>
SSLVerifyClient require
SSLVerifyDepth 1
</Location>
Agora, supondo que você tenha configurado seu SSL do Apache assim:
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key
SSLCACertificateFile /etc/apache2/ssl/ca.crt
SSLVerifyClient optional
SSLOptions +StdEnvVars +ExportCertData
Você também precisa se configurar como uma autoridade de certificação.
Aqui está um trecho do código Python que usamos para gerar certificados de clientes - isso deve dar uma boa ideia do que você precisa fazer a partir daqui:
commonname = "name_of_client_machine"
serial_file = open('/usr/local/my/web/certs/ca.srl','r')
serial = serial_file.read().strip()
cert_folder = '/usr/local/my/web/certs/clients/%s_%s' % (serial,commonname)
try:
os.makedirs(cert_folder, 0755)
except OSError:
pass
commands.getstatusoutput("sed s/hostname/%s/ /usr/local/my/web/certs/client.tpl > %s/client.tpl" % (commonname,cert_folder))
commands.getstatusoutput("openssl genrsa -des3 -passout pass:mypassword -out %s/web_client.key 4096" % cert_folder)
commands.getstatusoutput("openssl req -new -key %(cert_folder)s/web_client.key -out %(cert_folder)s/web_client.csr -config %(cert_folder)s/client.tpl -passin pass:mypassword" % ({'cert_folder':cert_folder}))
commands.getstatusoutput("openssl x509 -req -days 3650 -in %(cert_folder)s/web_client.csr -CA /usr/local/my/web/certs/ca.crt -CAkey /usr/local/my/web/certs/ca.key -out %(cert_folder)s/web_client.crt -passin pass:mypassword" % ({'cert_folder':cert_folder}))
commands.getstatusoutput("openssl pkcs12 -export -clcerts -in %(cert_folder)s/web_client.crt -inkey %(cert_folder)s/web_client.key -out %(cert_folder)s/web_client.P12 -passin pass:mypassword -passout pass:mypassword" % ({'cert_folder':cert_folder}))
Agora, pegue o arquivo .p12 e importe-o no navegador do cliente. Você será perguntado pela senha (que acima era apenas 'mypassword'), e então ela estará instalada e pronta para ser usada.