IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

utilisation de keystore - keytool pour certificat auto-signé


Sujet :

avec Java

  1. #1
    Membre actif Avatar de turican2
    Profil pro
    Inscrit en
    Août 2006
    Messages
    257
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2006
    Messages : 257
    Points : 239
    Points
    239
    Par défaut utilisation de keystore - keytool pour certificat auto-signé
    bonjour,

    je rencontre une difficulté quant à l'implémentation du keystore pour un certificat autosigné.

    En me basant sur la doc java: http://docs.sun.com/app/docs/doc/819...40fgu0d?a=view

    l'étape 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    keytool -genkey -alias tomcat -keyalg RSA -keystore /keystore-location
    -storepass password
    me génère mon keystore avec ma clé publique (si j'ai bien compris)

    l'étape 2 génère une clé public pour qu'une instance telle verisign me valide et me renvoi mon certificat (ma clé privé si j'ai bien compris):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    keytool -certreq -v -alias tomcat -keyalg RSA -keystore /keystore-location
    j'obtiens la clé public que je mets dans un fichiers crs qui une fois validé par une autorité de confiance me renvoie dans un fichier ".cert" (clé privé) que je peux importer dans mon keystore.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    keytool -v -import -trustcacerts -keystore /keystore-location
    -file certificate-reply-file -alias tomcat
    Mais voilà, j'aimerai auto-signer mon certificat et obtenir directement mon ".cert" sans avoir à payer. IL faut bien que je fasse des tests en local avant.

    Connaitriez vous la solution? (Si je me trompe sur les histoires de clé public, clé privé, j'en suis bien désolé, j'ai lu toutes les sources en anglais et c'est pas toujours évident.

    merci
    "La connaissance s'accroît quand on la partage."(Socrate)

    Si vous trouvez vous même la solution au POST que vous venez de poser, indiquez nous comment vous avez fait

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut

    Pas besoin de faire une requête de signature si tu ne veux pas faire signer ton certificat par une CA. Essaye ₵a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // Export in binary
    keytool -storepass password -alias myalias -export -file outfilename.cer
     
    // Export in text format
    keytool -storepass password -alias myalias -export -rfc -file outfilename.cer
    Sinon un petit point assez important : la CA qui reçoit ta requête n'aura jamais ta clef privée Elle elle reste dans ton keystore et n'est aps dans la requête. Un certificat ne contient que la clef publique, c'est d'ailleurs à ça que ça sert : affirmer que la clef publique contenue dedans est bien à la personne qui prétend la détenir

    A plus

  3. #3
    Membre actif Avatar de turican2
    Profil pro
    Inscrit en
    Août 2006
    Messages
    257
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2006
    Messages : 257
    Points : 239
    Points
    239
    Par défaut
    d'accord ça m'a aidé a comprendre j'ai donc suivi les indications de sun et les tiennes, via ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
       DefaultHttpClient httpclient = new DefaultHttpClient();
       KeyStore trustStore= null;
     
       trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());
     
     
       FileInputStream instream = new FileInputStream(new File("my.keystore"));
            try {
                trustStore.load(instream, "coucou".toCharArray());
            } finally {
                instream.close();
            }
     
        SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);
        Scheme sch = new Scheme("https", socketFactory, 443);
        httpclient.getConnectionManager().getSchemeRegistry().register(sch);
     
        HttpGet httpget = new HttpGet("https://localhost/md5/hello.php");
     
        System.out.println("executing request" + httpget.getRequestLine());
     
        HttpResponse response = httpclient.execute(httpget);
        HttpEntity entity = response.getEntity();
        System.out.println("----------------------------------------");
        System.out.println(response.getStatusLine());
        if (entity != null) {
                System.out.println("Response content length: " + entity.getContentLength());
        }
        if (entity != null) {
            entity.consumeContent();
        }
     
            // When HttpClient instance is no longer needed,
            // shut down the connection manager to ensure
            // immediate deallocation of all system resources
            httpclient.getConnectionManager().shutdown();
    qui est celui d'apache fondation: http://svn.apache.org/repos/asf/http...CustomSSL.java

    en mode pas à pas quand j'arrive à cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HttpResponse response = httpclient.execute(httpget);
    j'obtiens ce message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception in thread "main" javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
    quelque chose m'échappe sérieusement

    merci de vos aides
    "La connaissance s'accroît quand on la partage."(Socrate)

    Si vous trouvez vous même la solution au POST que vous venez de poser, indiquez nous comment vous avez fait

  4. #4
    Invité
    Invité(e)
    Par défaut
    Il semble dire ici que le server n'est pas connu et qu'il ne peut pas l'authentifier, comprendre : son certificat n'est pas dans ton truststore, et tu n'as aucune raison de lui faire confiance
    Est-ce que c'est le certificat que tu as généré avant celui du server ? le truststore que tu charges est bien celui contenant ce certificat ?

  5. #5
    Membre actif Avatar de turican2
    Profil pro
    Inscrit en
    Août 2006
    Messages
    257
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2006
    Messages : 257
    Points : 239
    Points
    239
    Par défaut
    et pourtant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    c:\Program Files\Java\jdk1.6.0_14\bin>keytool -v -list -keystore e:\Java\projet\httprequete\my.keystore
     
    Tapez le mot de passe du Keystore :
     
    Type Keystore : JKS
    Fournisseur Keystore : SUN
     
    Votre Keystore contient 1 entrÚe(s)
     
    Nom d'alias : snettv
    Date de crÚation : 3 juil. 2009
    Type dentrÚeá: {0}
    Longueur de cha¯ne du certificat : 1
    Certificat[1]:
    PropriÚtaireá: CN=localhost, C=FR
    ╔metteurá: CN=localhost, C=FR
    NumÚro de sÚrieá: 4a4dc62a
    Valide duá: Fri Jul 03 10:49:46 CEST 2009 auá: Mon Jul 02 10:49:46 CEST 2012
    Empreintes du certificatá:
             MD5á:  A0:2B:18:B3:8B:3F:FB:2B:B9:84:CB:FA:FA:6D:A4:BC
             SHA1á: 10:3D:45:3D:CE:EE:66:95:E6:B2:E0:3F:9B:79:AA:14:05:16:64:94
             Nom de lalgorithme de signatureá: {7}
             Versioná: {8}
     
    *******************************************
    *******************************************
    mon certificat semble donc etre dans mon keystore.
    "La connaissance s'accroît quand on la partage."(Socrate)

    Si vous trouvez vous même la solution au POST que vous venez de poser, indiquez nous comment vous avez fait

  6. #6
    Expert éminent sénior
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 413
    Points : 19 609
    Points
    19 609
    Par défaut
    Ton certificat il est paramétré sur ton serveur ?

    A priori le peer dont parle le message d'erreur pour moi c'est le serveur pas ton programme.

    EDIT : Pour être plus clair, au début de la connexion SSL, lors du handshake, le serveur commence par envoyer son certificat au client. Je pense que c'est ce certificat là qui n'est pas reconnu.
    Un problème avec Git ? Essayez la FAQ, sinon posez votre question sur le forum.



    "Toute personne croyant qu'une croissance exponentielle peut durer indéfiniment dans un monde fini est soit un fou, soit un économiste."
    Kenneth E. Boulding

    "Les richesses naturelles sont inépuisables, car, sans cela, nous ne les obtiendrions pas gratuitement. Ne pouvant être ni multipliées ni épuisées, elles ne sont pas l’objet des sciences économiques."
    Jean-Baptiste Say, Traité d'économie politique, 1803.

    "/home/earth is 102% full ... please delete anyone you can."
    Inconnu

  7. #7
    Membre actif Avatar de turican2
    Profil pro
    Inscrit en
    Août 2006
    Messages
    257
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2006
    Messages : 257
    Points : 239
    Points
    239
    Par défaut
    j'ai placé pourtant le certificat dans outfile.cer dans "apache\conf\ssl.crt" ensuite, j'ai fait clic droit + installer et un stop puis start du service.

    Ajout de cette ligne dans mon httpd-ssl.conf
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SSLCertificateFile conf/ssl.crt/outfilename.crt
    c'est strictement le meme souci.

    Je sèche complètement
    "La connaissance s'accroît quand on la partage."(Socrate)

    Si vous trouvez vous même la solution au POST que vous venez de poser, indiquez nous comment vous avez fait

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par turican2 Voir le message
    j'ai placé pourtant le certificat dans outfile.cer dans "apache\conf\ssl.crt" ensuite, j'ai fait clic droit + installer et un stop puis start du service.

    Ajout de cette ligne dans mon httpd-ssl.conf
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SSLCertificateFile conf/ssl.crt/outfilename.crt
    c'est strictement le meme souci.

    Je sèche complètement
    Hum...
    outfile.cer ou outfile.crt ? C'est juste une erreur de recopie que tes fichiers aient des noms différents ou c'est vraiment sur le server comme ça ?

  9. #9
    Membre actif Avatar de turican2
    Profil pro
    Inscrit en
    Août 2006
    Messages
    257
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2006
    Messages : 257
    Points : 239
    Points
    239
    Par défaut
    j'ai renommé le certificat outfilename.cer en .crt car le type mine des certificats pour apache est .crt sous windows.

    PS: j'ai généré le certificat sur la même machine que le serveur apache. C'est également la même machine qui sert de plateforme de développement pour java.

    Edit1:
    Le certificat c'est bien la clef public? si oui le serveur apache n'aurait il pas besoin de lui associer une clef privé pour pouvoir le decoder? (si oui comment le générer?)

    par exemple ma conf apache contient un fichier server.crt et une fichier server.key.
    "La connaissance s'accroît quand on la partage."(Socrate)

    Si vous trouvez vous même la solution au POST que vous venez de poser, indiquez nous comment vous avez fait

  10. #10
    Expert éminent sénior
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 413
    Points : 19 609
    Points
    19 609
    Par défaut
    Ben si t'as pas de clef privée associée au certificat dans le magasin c'est sûr que ça va pas marcher. La procédure TLS est la suivante selon le bouquin que j'ai sous les yeux :

    Le client dit bonjour.

    Le serveur est poli et dit aussi bonjour. Dans la foulée il envoie son certificat (donc sa clef publique mais bien sûr pas sa clef privée).

    Le client vérifie la validité du certificat du serveur (chaine de confiance, etc ...)
    Le client chiffre une clef de session pour un algo symétrique (AES, 3DES, etc ...) avec la clef publique du certificat du serveur et renvoie le tout au serveur.
    Si on veut gérer une vérification de l'identité du client, le client envoie aussi sont certificat. (mais on se fout de ça donc je développe pas +)

    Le serveur déchiffre la clef de session avec sa clef privée et initie une connexion sécurisée avec l'algo symétrique avec le client.
    Un problème avec Git ? Essayez la FAQ, sinon posez votre question sur le forum.



    "Toute personne croyant qu'une croissance exponentielle peut durer indéfiniment dans un monde fini est soit un fou, soit un économiste."
    Kenneth E. Boulding

    "Les richesses naturelles sont inépuisables, car, sans cela, nous ne les obtiendrions pas gratuitement. Ne pouvant être ni multipliées ni épuisées, elles ne sont pas l’objet des sciences économiques."
    Jean-Baptiste Say, Traité d'économie politique, 1803.

    "/home/earth is 102% full ... please delete anyone you can."
    Inconnu

  11. #11
    Membre actif Avatar de turican2
    Profil pro
    Inscrit en
    Août 2006
    Messages
    257
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2006
    Messages : 257
    Points : 239
    Points
    239
    Par défaut
    mon keystore a généré mon certificat par un export. A aucun moment je n'ai vu d'export pour une clé privé.

    Je prends peut être le probleme à l'envers.

    L'idée ne serait elle pas d'utiliser Openssl pour généré la clé privé + certificat et ensuite d'importer la bousine dans le keystore? y a t'il compatibilité entre openssl et le keystore?
    "La connaissance s'accroît quand on la partage."(Socrate)

    Si vous trouvez vous même la solution au POST que vous venez de poser, indiquez nous comment vous avez fait

  12. #12
    Invité
    Invité(e)
    Par défaut
    Alors si je comprends bien tu n'a pas donné la clef privée en configuration à Apache ? Parce que oui il en a besoin quand même
    Il faut donc exporter ta clef privée dasn un fichier et donner ce fichier à Apache grâce á SSLCertificateKeyFile

  13. #13
    Membre actif Avatar de turican2
    Profil pro
    Inscrit en
    Août 2006
    Messages
    257
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2006
    Messages : 257
    Points : 239
    Points
    239
    Par défaut
    edit: ben au final non même erreur un souci de web start qui me signalait un souci avant :/
    "La connaissance s'accroît quand on la partage."(Socrate)

    Si vous trouvez vous même la solution au POST que vous venez de poser, indiquez nous comment vous avez fait

  14. #14
    Membre actif Avatar de turican2
    Profil pro
    Inscrit en
    Août 2006
    Messages
    257
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2006
    Messages : 257
    Points : 239
    Points
    239
    Par défaut
    J'ai trouvé la solution à ce souci. En réalité plus un probleme de compréhension.

    [Pour faire court]
    Copier le certificat public (celui déjà signé par apache) "xampp/apache/conf/ssl.crt/server.crt" dans l'application java et importer ce certificat dans le keystore

    Pour l'import:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c:\Program Files\Java\jdk1.6.0_14\bin>keytool -import -keystore e:\Java\projet\httprequete\keystore.jks -file e:\Java\projet\httprequete\server.crt
    Code application:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
           DefaultHttpClient httpclient = new DefaultHttpClient();
               KeyStore trustStore= null;
     
               trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());
     
            FileInputStream instream = new FileInputStream(new File("keystore.jks"));
            try {
     
                trustStore.load(instream, "password".toCharArray());
            } finally {
                instream.close();
            }
     
            SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);
            Scheme sch = new Scheme("https", socketFactory, 443);
            httpclient.getConnectionManager().getSchemeRegistry().register(sch);
     
            HttpGet httpget = new HttpGet("https://localhost/md5/hello.php?client=seb"); // https://127.0.0.1 ou https://monpc renverrait une exception car le certificat ne correspond pas à ce nommage.
     
            System.out.println("executing request" + httpget.getRequestLine());
     
            HttpResponse response = httpclient.execute(httpget);
            HttpEntity entity = response.getEntity();
     
            System.out.println("----------------------------------------");
            System.out.println(response.getStatusLine());
            if (entity != null) {
                System.out.println("Response content length: " + entity.getContentLength());
                System.out.println(EntityUtils.toString(response.getEntity()));
     
            }
            if (entity != null) {
                entity.consumeContent();
            }
     
            // When HttpClient instance is no longer needed,
            // shut down the connection manager to ensure
            // immediate deallocation of all system resources
            httpclient.getConnectionManager().shutdown();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    https://localhost/md5/hello.php?client=seb
    permet de passer en GET des arguments à la page hello.php.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(EntityUtils.toString(response.getEntity()));
    permet de visualiser la page hello.php avec l'interpretation des entités.

    Affiche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bonjour seb : par la méthode GET
    Pour faire évoluer un peu ce truc, il faut que je comprennes comment générer une clé privé et un certificat public auto signé à l'aide de l'outil Openssl. Pour le moment je n'ai rien trouvé de très convaincant sur le net
    Cela me permettra d'appeler le FQDN de ma machine sur internet. Si quelqu'un a ça en stoque je prends
    "La connaissance s'accroît quand on la partage."(Socrate)

    Si vous trouvez vous même la solution au POST que vous venez de poser, indiquez nous comment vous avez fait

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Exception sur l'utilisation d'un certificat auto-signé
    Par hapalemur dans le forum Sécurité
    Réponses: 2
    Dernier message: 18/11/2011, 14h21
  2. Connexion SSL avec certificat auto-signé
    Par hornetbzz dans le forum Apache
    Réponses: 5
    Dernier message: 23/06/2010, 00h49
  3. Réponses: 1
    Dernier message: 16/05/2010, 11h12
  4. Récuperer un certificat auto-signé
    Par zaventem dans le forum VBA Word
    Réponses: 1
    Dernier message: 25/09/2009, 13h57
  5. Prism et https avec certificat auto signé
    Par wodel dans le forum Applications et environnements graphiques
    Réponses: 0
    Dernier message: 23/03/2008, 10h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo