Certificat SSL auto-signé du Serveur/Client Tomcat

j'ai Un Apache Tomcat 6.serveur x fonctionnant avec un certificat SSL auto-signé. Je veux que le client présente son propre certificat au serveur pour que je puisse les authentifier à partir d'une base de données d'utilisateurs. J'ai tout fonctionne sur la base d'un exemple que j'ai trouvé en ligne, mais l'exemple est venu avec des certificats en conserve et un datastore pré-construction JKS. Je veux créer mon propre datastore avec mes propres certs 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 forcer Tomcat à faire confiance à la signature du client?

je joue avec java keytool depuis des heures maintenant.

42
demandé sur ROMANIA_engineer 2009-07-25 01:59:29

4 réponses

J'ai finalement 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 Logiciel de Pensées & de Divagations j'ai découvert que:

keytool par défaut utilise la DSA algorithme lors de la génération du auto-signé cert. Versions antérieures de Firefox a accepté ces clés sans problème. Avec Firefox 3 beta 5, en utilisant Le DSA ne fonctionne pas, mais utiliser le RSA le fait. En passant "-keyalg RSA " lors de la génération le certificat auto-signé crée un cert Firefox 3 beta 5 entièrement accepter.

j'ai simplement mis ce drapeau, nettoyé toutes les caches de FireFox et ça a fonctionné comme un charme! J'utilise ceci comme configuration de test pour mon projet et j'ai besoin de partager cela avec d'autres personnes, donc j'ai écrit un petit script batch qui crée deux certificats SSL. L'un peut être abandonné dans la configuration Tomcat et l'autre est A.fichier p12 qui peut être importé dans FireFox / IE. Merci!

Usage: le premier argument en ligne de commande est le nom d'utilisateur du client. Tous les mots de passe sont "password" (sans guillemets). Modifier l'unité de bits codés 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. L'un appelé serveur.jks que vous tombez dans Tomcat et un autre fichier appelé {nom d'utilisateur}.p12 que vous importez dans votre navigateur. Serveur.dans le fichier jks, le certificat client est ajouté en tant que certificat fiable.

j'espère que quelqu'un le trouve utile.

et voici le XML qui doit être ajouté à votre conf/sever Tomcat.fichier xml (testé seulement 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" />    
59
répondu davidemm 2015-12-23 11:35:45

pour activer l'authentification client, vous devez spécifier un "magasin de confiance" pour Tomcat: un magasin de clés contenant des certificats des Autorités de certification racine en lesquelles vous avez confiance, chacun étant étiqueté comme "trustEntry".

ceci est spécifié par le Connector attributs de l'élément: truststoreFile,truststorePass (par défaut à la valeur de keystorePass) et truststoreType (qui est par défaut "JKS").

si un client utilise un certificat auto-signé, alors son CA "racine" est le certificat il s'ensuit que vous devez importer le certificat auto-signé du client dans le magasin de confiance de Tomcat.

si vous avez beaucoup de clients, cela va rapidement devenir un problème. Dans ce cas, vous pourriez vouloir examiner la signature des certificats pour vos clients. The Java keytool la commande ne peut pas faire cela, mais tous les utilitaires en ligne de commande nécessaires sont disponibles dans OpenSSL. Ou vous pouvez regarder dans quelque chose comme EJBCA sur une grande échelle.

Mieux encore, demandez à vos clients d'utiliser une CA gratuite existante, comme 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 Tomcat trust store.

3
répondu erickson 2009-07-24 23:42:15

Créer un certificat:

keytool -genkey -alias tomcat -keyalg RSA -keystore /home/bob/mykeystore

saisissez toutes les données pour le certificat auto-signé dont vous avez besoin puis éditez le serveur.xml et spécifiez 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" />

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

2
répondu Jon 2009-07-24 22:21:53

les réponses précédentes sont utiles pour moi, mais n'ont pas de version d'outil shell. J'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

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"
    />
1
répondu Eric Wang 2015-04-22 11:57:00