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

Développement Web en Java Discussion :

HTTPClient & SSL : could not find trusted certificate


Sujet :

Développement Web en Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 255
    Par défaut HTTPClient & SSL : could not find trusted certificate
    Salut,

    j'essai d'établir une connexion avec un serveur HTTPS pour y créer des répertoires.

    La fonction :

    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
        public static String creer_rep(String hote, String login, String password, String chemin, String nom_repertoire) {
            try {
            //Configuration de l'hôte
            HostConfiguration hostConfig = new HostConfiguration();
            Protocol easyhttps = new Protocol("https",(ProtocolSocketFactory) new EasySSLProtocolSocketFactory(),443);
            Protocol.registerProtocol("https", easyhttps);
            hostConfig.setHost(hote, 443, easyhttps);
            //On défini un HttpConnectionManager, qui permet de gérer les connexions, et éventuellement le multithreading 
            HttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();
            HttpConnectionManagerParams params = new HttpConnectionManagerParams();
            int maxHostConnections = 20;
            params.setMaxConnectionsPerHost(hostConfig, maxHostConnections);
            connectionManager.setParams(params);
            //On créé l'objet HttpClient et on lui passe les données d'authentification 
            HttpClient client = new HttpClient(connectionManager);
            client.setHostConfiguration(hostConfig);
            Credentials creds2 = new UsernamePasswordCredentials(login,password);
            client.getState().setCredentials(AuthScope.ANY, creds2);
     
            //Création du répertoire via la méthode MKCOL
            EntityEnclosingMethod mkcol = new EntityEnclosingMethod(chemin + nom_repertoire){
                public String getName() { return "MKCOL"; }
            };
            client.executeMethod(mkcol);
            System.out.println("Répertoire " + chemin + nom_repertoire + " créé avec succès.");
            mkcol.releaseConnection();
     
            return "OK";
            }
            catch(IOException ioe) {
                ioe.printStackTrace();
                return ioe.toString();
            }
        }
    J'essai d'accepter tous les certificats "self-signed" grâce à la classe EasySSLProtocolSocketFactory fournit par Apache.

    J'obtiens :

    javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: Could not find trusted certificate
    Si je tente d'intégrer le chargement du certificat dans la classe EasySSLProtocolSocketFactory :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
         private static SSLContext createEasySSLContext() {
              try {
                Provider provider = Security.getProvider("SUN");
                KeyStore keyStore = KeyStore.getInstance("jks",provider);
                FileInputStream walletFile = new FileInputStream("/ORA/db001/syscontrol/etc/WALLETS/rdbms/cwallet.sso");
                keyStore.load(walletFile,"".toCharArray());
                walletFile.close();
                SSLContext context = SSLContext.getInstance("SSL");
                context.init(null, new TrustManager[] { new EasyX509TrustManager(keyStore) }, null);
                return context;
              } catch (Exception e) {
                   throw new HttpClientError(e.toString());
              }
         }
    J'obtiens :

    org.apache.commons.httpclient.HttpClientError: java.io.IOException: Invalid keystore format
    Le code run dans la base de données (Oracle 10G R2, JVM intégrée v1.4).

    Si quelqu'un à une idée, mois je ne sais plus quoi faire.

    Merci !

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    d'après la doc de common httpclient, l'utilisation d'un socketfactory custom se fait par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Protocol myhttps = new Protocol("https", new EasySSLProtocolSocketFactory(), 443);
    HttpClient httpclient = new HttpClient();
    httpclient.getHostConfiguration().setHost("www.whatever.com", 443, myhttps);

  3. #3
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 255
    Par défaut
    Hmm c'est ce que je fais non ?

    Merci pour la réponse.

    J'ai quand même retesté en simplifiant comme ceci :

    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
        public static String creerRepertoireDFS(String chemin, String nom_repertoire) {
           try
           {
                Protocol myhttps = new Protocol("https", (ProtocolSocketFactory) new EasySSLProtocolSocketFactory(), 443);
                HttpClient client = new HttpClient();
                client.getHostConfiguration().setHost("truc.cern.ch", 443, myhttps);
                Credentials creds2 = new UsernamePasswordCredentials("mon_login","mon_password");
                client.getState().setCredentials(AuthScope.ANY, creds2);
                EntityEnclosingMethod mkcol = new EntityEnclosingMethod(chemin + nom_repertoire){
                    public String getName() { return "MKCOL"; }
                };
                client.executeMethod(mkcol);
                System.out.println("Répertoire " + chemin + nom_repertoire + " créé avec succès.");
                mkcol.releaseConnection();
     
               return "OK";
           }
           catch(IOException ioe) {
               ioe.printStackTrace();
               return ioe.toString();
           }
        }
    et toujours pareil :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: Could not find trusted certificate

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    quand tu accède à la page depuis le browser, il te dit quoi?

  5. #5
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 255
    Par défaut
    Le code Java run dans la base de données. La fonction PL/SQL qui appel la fonction Java est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    create or replace
    function creer_dossier_dfs(chemin in varchar2, nom_rep in varchar2) return varchar2
    AS LANGUAGE JAVA NAME 'project1.AccesDFS.creerRepertoireDFS(java.lang.String, java.lang.String) return java.lang.String';
    L'application est une application Oracle ApEx. J'exécute simplement la fonction comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DECLARE
      v_Return VARCHAR2(200);
    BEGIN
      v_Return := CREER_DOSSIER_DFS('https://truc.cern.ch/dfs/rep1/rep2/rep3/', 'rep_test');
      HTP.P('v_Return = ' || v_Return);
    END;
    et donc dans la page j'obtiens simplement l'affichage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    v_Return = javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: Could not find trusted certificate
    J'obtient la même chose lorsque j'exécute la fonction CREER_DOSSIER_DFS depuis SQLDeveloper.

    Merci d'essayer de m'aider

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    oui mais que te dit ton browser quand tu tente d'accéder à https://truc.cern.ch/dfs/rep1/rep2/rep3/

    Il te dit quoi à propos du certificat. J'ai l'impression que ton serveur n'utilise pas un certificat autosigné (que EasySSLProtocolSocketFactory devrait accepter) mais qu'il n'a simplement pas de signature (ce qui le rend inutilisable). Donc le browser te dit quoi
    -> pas signé
    -> signé mais non vérifiable
    -> signé mais pour un autre site
    ?

Discussions similaires

  1. Réponses: 3
    Dernier message: 28/03/2014, 08h13
  2. [Hibernate] : Erreur Could not find datasource
    Par tipaquo dans le forum Hibernate
    Réponses: 2
    Dernier message: 12/10/2005, 10h43
  3. [3.1][Debian]problème de Could not find library 'swt-pi-gtk
    Par zlavock dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 27/09/2005, 13h07
  4. Réponses: 6
    Dernier message: 17/04/2005, 10h58
  5. Réponses: 3
    Dernier message: 30/03/2005, 23h15

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