Comment puis-je informer Apache pour forcer l'authentification du client mais pour l'autoriser en fonction d'une list de certificates approuvés plutôt que d'une autorité de certificateion?

J'essaie de créer un server SSL Apache pour être utilisé dans les tests de pré-production et que même dans la production serait accessible par less de 5 users. En raison de la petite base d'users, j'ai estimé que le moyen le plus simple de gérer les certificates serait simplement de les signer automatiquement et ensuite de dire explicitement à Apache de ne faire confiance qu'au petit nombre de certificates que nous créons. D'après ce que je peux dire, il semble que Apache ait besoin d'une CA, même si j'espère qu'il y a un moyen de le faire.

De plus, en ce qui concerne le développement, j'ai tendance à connaître mes trucs, mais je suis plutôt un newb en étant un sysadmin, donc plus il est préférable en termes de solutions.

En guise de note, j'ai également vu cette publication: ici, je pense que c'est semblable à ce que je request, mais pas une solution que je search. Idéalement, je pourrais simplement utiliser openSSL pour générer des certs auto-signés à la volée et en append des copys à un directory, alors quand ils ont l'habitude d'accéder au server, Apache va permettre de créer la connection.

Il y a deux choses que vous devez faire.

Tout d'abord, vous devez générer des certificates pour les browsers que vous allez vous connecter.

Ensuite, vous devez définir Apache pour exiger ces certs pour un dossier.

La partie apache est simple: ajoutez-la simplement à votre /etc/apache2/sites-enabled/your_apache_file.conf:

<Location /path/to/folder> SSLVerifyClient require SSLVerifyDepth 1 </Location> 

Maintenant, en supposant que vous avez configuré votre SSL apache comme ceci:

 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 

Vous devez également vous constituer en CA.

Voici un morceau de code Python que nous utilisons pour générer des certs clients – cela devrait vous donner une bonne idée de ce que vous devez faire à partir d'ici:

 commonname = "name_of_client_machine" serial_file = open('/usr/local/my/web/certs/ca.srl','r') serial = serial_file.read().ssortingp() 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})) 

Maintenant, vous prenez le file .p12 et vous l'importez dans le browser client. On vous requestra le mot de passe (ce qui précède était «mypassword»), puis il sera installé et prêt à fonctionner.

Après une grande lutte, nous avons finalement trouvé une solution. Pas tout à fait idéal, mais maintenant que nous l'avons en place, cela semble fonctionner bien.

Dans Apache, nous avons d'abord dû activer mod_ssl, exiger l'authentification du client, puis définir la profondeur de vérification à 1. Ensuite, nous avons dû configurer le cert du server et la key de quelque chose généré et signé par notre CA (j'y arriverai en une minute ) et configurez le file SSLCACertificateFile dans le cert de notre CA. En ce qui concerne la création de votre CA, ce guide était assez approfondi et je l'ai trouvé très précis. Autre que la modification légère de quelques paths d'annuaire afin qu'il ait fonctionné avec Ubuntu, c'est-à-dire en utilisant / etc / ssl, cela a bien fonctionné. Nous avons créé une autorité de certificateion, puis nous avons généré un certificate CA. Nous avons ensuite généré une key de server et une request de certificate de server, et nous avons signé la requête auprès de l'autorité de certificateion. Nous définissons ensuite Apache pour utiliser le nouveau cert et la key du server. À ce stade, vous avez pu authentifier le server mais pas l'authentification du client. Pour faire la dernière partie, nous avons simplement construit quelques exemples déjà dans le lien ci-dessus. Le process de création / signature de combinaisons de cert-key est générique, c'est-à-dire que vous pouvez utiliser le combo sur un server ou un client. Nous avons simplement répété le process pour créer un cert client (et pourrait le faire encore et encore pour créer plus). Une fois que nous avons eu que nous avons converti les deux files dans un .pk12

 # openssl pkcs12 -export -in certs/client.crt -inkey private/client.key -out ~/clientcred.p12 

Et finalement, nous avons importé le crédit dans Firefox pour l'utiliser. Nous avons également ajouté notre nouvelle CA à la list interne des CA fiables de Firefox. J'espère que cela aide quelqu'un d'autre qui essaie quelque chose de similaire.