J'ai un serveur Apache Tomcat 6.x fonctionnant avec un certificat SSL auto-signé. Je veux que le client présente son propre certificat au serveur afin que je puisse les authentifier sur la base d'une base de données d'utilisateurs. J'ai tout cela basé sur un exemple que j'ai trouvé en ligne, mais l'exemple est venu avec des certificats prédéfinis et une banque de données JKS pré-build. Je veux créer mon propre magasin de données avec mes propres certificats mais je n'ai pas de chance.
Comment créer un magasin de données pour Tomcat?
Comment créer un certificat auto-signé pour Tomcat?
Comment créer un certificat auto-signé pour le client?
Comment forcer Tomcat à faire confiance à la signature du client?
Je joue avec Java keytool depuis de nombreuses heures maintenant.
J'ai enfin trouvé la solution à mon problème, donc je posterai les résultats ici si quelqu'un d'autre est coincé.
Merci à Michael Martin de Michael's Software Thoughts & Ramblings J'ai découvert que:
keytool utilise par défaut l'algorithme DSA lors de la génération du certificat auto-signé. Les versions antérieures de Firefox acceptaient ces clés sans problème. Avec Firefox 3 beta 5, l'utilisation de DSA ne fonctionne pas, mais l'utilisation de RSA fonctionne. Passer "-keyalg RSA" lors de la génération du certificat auto-signé crée un certificat que Firefox 3 beta 5 accepte pleinement.
J'ai simplement mis ce drapeau, effacé toutes les caches dans FireFox et cela a fonctionné comme un charme! Je l'utilise comme test-setup pour mon projet et j'ai besoin de le partager avec d'autres personnes, j'ai donc écrit un petit script batch qui crée deux certificats SSL. L'un peut être déposé dans la configuration de Tomcat et l'autre est un fichier .p12 qui peut être importé dans FireFox/IE. Merci!
Utilisation: le premier argument de la ligne de commande est le nom d'utilisateur du client. Tous les mots de passe sont des "mots de passe" (sans guillemets). Modifiez l'un des bits codés en dur pour répondre à vos besoins.
@echo off
if "%1" == "" goto usage
keytool -genkeypair -alias servercert -keyalg RSA -dname "CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=US" -keypass password -keystore server.jks -storepass password
keytool -genkeypair -alias %1 -keystore %1.p12 -storetype pkcs12 -keyalg RSA -dname "CN=%1,OU=Unit,O=Organization,L=City,S=State,C=US" -keypass password -storepass password
keytool -exportcert -alias %1 -file %1.cer -keystore %1.p12 -storetype pkcs12 -storepass password
keytool -importcert -keystore server.jks -alias %1 -file %1.cer -v -trustcacerts -noprompt -storepass password
keytool -list -v -keystore server.jks -storepass password
del %1.cer
goto end
:usage
echo Need user id as first argument: generate_keystore [username]
goto end
:end
pause
Les résultats sont deux fichiers. Un appelé server.jks que vous déposez dans Tomcat et un autre fichier appelé {username} .p12 que vous importez dans votre navigateur. Le fichier server.jks a le certificat client ajouté en tant que certificat approuvé.
J'espère que quelqu'un d'autre trouvera cela utile.
Et voici le XML qui doit être ajouté à votre fichier Tomcat conf/sever.xml (testé uniquement sur Tomcat 6.x)
<Connector
clientAuth="true" port="8443" minSpareThreads="5" maxSpareThreads="75"
enableLookups="true" disableUploadTimeout="true"
acceptCount="100" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="${catalina.home}/conf/server.jks"
keystoreType="JKS" keystorePass="password"
truststoreFile="${catalina.home}/conf/server.jks"
truststoreType="JKS" truststorePass="password"
SSLVerifyClient="require" SSLEngine="on" SSLVerifyDepth="2" sslProtocol="TLS"
/>
Pour Tomcat 7:
<Connector protocol="org.Apache.coyote.http11.Http11NioProtocol"
port="8443" SSLEnabled="true"
maxThreads="200" scheme="https" secure="true"
keystoreFile="${catalina.base}/conf/server.jks" keystorePass="password"
clientAuth="false" sslProtocol="TLS" />
Pour activer l'authentification client, vous devez spécifier un "magasin de confiance" pour Tomcat: un magasin de clés contenant les certificats des autorités de certification racine auxquelles vous faites confiance, chacun marqué comme "trustEntry".
Ceci est spécifié par les attributs de l'élément Connector
: truststoreFile
, truststorePass
(qui prend par défaut la valeur de keystorePass
) et truststoreType
( qui est par défaut "JKS").
Si un client utilise un certificat auto-signé, son autorité de certification "racine" est le certificat lui-même; il s'ensuit donc que vous devez importer le certificat auto-signé du client dans le magasin de confiance de Tomcat.
Si vous avez de nombreux clients, cela deviendra rapidement un problème. Dans ce cas, vous souhaiterez peut-être étudier la signature de certificats pour vos clients. La commande Java keytool
ne peut pas faire cela, mais tous les utilitaires de ligne de commande nécessaires sont disponibles dans OpenSSL. Ou vous pouvez regarder quelque chose comme EJBCA à grande échelle.
Mieux encore, demandez à vos clients d'utiliser une autorité de certification gratuite existante, comme startcom.org . Cela ne fonctionne pas toujours pour les certificats de serveur, car le certificat de StartCom n'est pas inclus dans tous les navigateurs, mais cette situation est inversée et le certificat racine StartCom peut facilement être importé dans le magasin de confiance Tomcat.
Créer un certificat:
keytool -genkey -alias Tomcat -keyalg RSA -keystore /home/bob/mykeystore
Saisissez toutes les données du certificat auto-signé dont vous avez besoin, puis modifiez le fichier server.xml de Tomcat et spécifiez les propriétés du magasin de clés sur le connecteur SSL, par exemple:
<Connector port="8443" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
keystoreFile="/home/bob/mykeystore"
clientAuth="false" sslProtocol="TLS" />
ou suivez les documents Tomcat ...
Les réponses précédentes me sont utiles, mais n'ont pas de version d'outil Shell. J'en ai donc écrit un.
key_gen.sh:
#! /bin/bash
# a key generator for https,
basename=server
key_algorithm=RSA
password_key=123456
password_store=123456
country=US
# clean - pre
rm "${basename}.jks"
# generate server side
keytool -genkeypair -alias "${basename}cert" -keyalg $key_algorithm -dname "CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=${country}" -keypass $password_key -keystore "${basename}.jks" -storepass $password_store
Pour Tomcat8
, pourrait ajouter la configuration suivante à server.xml
:
<Connector port="8443" protocol="org.Apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
acceptCount="75" keystoreFile="${catalina.home}/conf/server.jks" keystorePass="123456"
/>