44 votes

Certificat SSL auto-signé pour le serveur/client Tomcat

J'ai un serveur Apache Tomcat 6.x qui fonctionne avec un certificat SSL auto-signé. Je veux que le client présente son propre certificat au serveur afin que je puisse l'authentifier à partir d'une base de données d'utilisateurs. J'ai tout fait fonctionner sur la base d'un exemple que j'ai trouvé en ligne, mais l'exemple était fourni avec des certificats en conserve et un datastore JKS pré-construit. Je veux créer mon propre datastore avec mes propres certificats mais je n'ai pas de chance.

Comment créer un datastore pour Tomcat ?
Comment créer un certificat auto-signé pour Tomcat ?

Comment créer un certificat auto-signé pour le client ?
Comment puis-je forcer Tomcat à faire confiance à la signature du client ?

Je joue avec java keytool depuis de nombreuses heures maintenant.

60voto

davidemm Points 896

J'ai enfin trouvé la solution à mon problème, je vais donc poster les résultats ici si quelqu'un d'autre est coincé.

Merci à Michael Martin de Pensées et divagations de Michael sur les logiciels J'ai découvert ça :

keytool utilise par défaut la méthode DSA lors de la génération du certificat auto-signé. Les versions antérieures de Firefox acceptaient ces clés sans problème. problème. Avec Firefox 3 beta 5, l'utilisation de DSA ne fonctionne pas, mais l'utilisation de RSA fonctionne. Le passage de "-keyalg RSA" lors de la génération du le certificat auto-signé crée un Le certificat de Firefox 3 beta 5 est entièrement accepte.

J'ai simplement activé ce drapeau, effacé tous les caches dans FireFox et ça a marché comme sur des roulettes ! J'utilise ceci comme une configuration de test pour mon projet et j'ai besoin de partager ceci avec d'autres personnes, donc j'ai écrit un petit batch script 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 "password" (sans guillemets). Changez n'importe lequel 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é {nomd'utilisateur}.p12 que vous importez dans votre navigateur. Dans le fichier server.jks, le certificat du client est ajouté comme certificat de confiance.

J'espère que quelqu'un d'autre trouvera cela utile.

Et voici le XML qui doit être ajouté à votre fichier conf/sever.xml de Tomcat (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" />

3voto

erickson Points 127945

Pour permettre l'authentification des clients, 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 étant marqué comme une "trustEntry".

Ceci est spécifié par l'option Connector les attributs de l'élément : truststoreFile , truststorePass (qui prend par défaut la valeur de keystorePass ), et truststoreType (qui a pour valeur par défaut "JKS").

Si un client utilise un certificat auto-signé, alors son AC "racine" est le certificat lui-même ; il s'ensuit 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 pourriez envisager de signer des certificats pour vos clients. L'outil Java keytool ne peut pas le faire, mais tous les utilitaires de ligne de commande nécessaires sont disponibles dans OpenSSL. Ou vous pouvez regarder dans quelque chose comme EJBCA à grande échelle.

Mieux encore, demandez à vos clients d'utiliser un CA gratuit existant, tel que startcom.org . Cela ne fonctionne pas toujours pour les certificats de serveur, parce que le certificat de StartCom n'est pas inclus dans tous les navigateurs, mais cette situation est inversée, et le certificat racine de StartCom pourrait facilement être importé dans le magasin de confiance de Tomcat.

2voto

Jon Points 23749

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 de Tomcat server.xml et spécifier les propriétés du keystore 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 la documentation de Tomcat...

http://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html

1voto

fly bird Points 818

Les réponses précédentes me sont utiles, mais je n'ai pas de version de l'outil shell. J'en ai donc écrit une.

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 vous pouvez 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"
    />

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X