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

Sécurité Java Discussion :

[JAXWS][PKCS11]plusieurs certifs sur une carte a puce


Sujet :

Sécurité Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    responsable technique
    Inscrit en
    Novembre 2002
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : responsable technique

    Informations forums :
    Inscription : Novembre 2002
    Messages : 100
    Par défaut [JAXWS][PKCS11]plusieurs certifs sur une carte a puce
    Bonjour,
    J'appelle en Java un Web Service JAX-WS avec SSL et authent mutuelle, en utilisant l'objet SSLSocketFactory.
    J'utilise un keystore PKCS11 initialisé à partir des certificats présents sur une carte à puce.
    Ca marche très bien, j'ai suivi ce tuto : http://javaandcryptosmartcards.blogs...ards-this.html
    Mon problème est que ça ne marche que lorsque j'ai un seul certificat (d'authent) sur la carte à puce, si j'ai une carte avec plusieurs certificats (authent et signature), il prend le certif de signature pour réaliser l'authent SSL et ça ne marche pas
    Voici mon 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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
     
      try
      {
    	 final Provider pkcs11Provider = initProvider();
            .........
             // provider initialization is OK
    	 Security.addProvider(pkcs11Provider);
     
    	 // initialize properties
    	 System.setProperty("javax.net.debug", "SSL,handshake");
    	 System.setProperty("java.security.debug", "all");
    	 System.setProperty("javax.net.ssl.keyStoreProvider", pkcs11Provider.getName());
    	 System.setProperty("javax.net.ssl.keyStoreType", "PKCS11");
    	 System.setProperty("javax.net.ssl.keyStore", "NONE");
    	 System.setProperty("javax.net.ssl.keyStorePassword", pinCode);
    	 System.setProperty("javax.net.ssl.trustStore", "C:\\Program Files\\Java\\jdk\\jre\\lib\\security\\cacerts");
    	 System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
    	 System.setProperty("javax.net.ssl.trustStoreType", "JKS");
     
    	 // creating ssl factory
    	 final KeyStore keystorePkcs11 = KeyStore.getInstance("PKCS11");
    	 keystorePkcs11.load(null, pinCode.toCharArray());
    	 final KeyManagerFactory kKeyManagerFactory = KeyManagerFactory.getInstance("SunX509");
    	 kKeyManagerFactory.init(keystorePkcs11, pinCode.toCharArray());
    	 final KeyStore keystoreTrusted = KeyStore.getInstance("JKS");
    	 keystoreTrusted.load(new FileInputStream("C:\\Program Files\\Java\\jdk\\jre\\lib\\security\\cacerts"), "changeit".toCharArray());
    	 final TrustManagerFactory tTrustManagerFactory = TrustManagerFactory.getInstance("SunX509");
    	 tTrustManagerFactory.init(keystoreTrusted);
    	 final SSLContext sslc = SSLContext.getInstance("TLS");
    	 sslc.init(kKeyManagerFactory.getKeyManagers(), tTrustManagerFactory.getTrustManagers(), null);
    	 final SSLSocketFactory factory = sslc.getSocketFactory();
    	 final SSLSocket socket = (SSLSocket) factory.createSocket("localhost", 8443);
    	 socket.setUseClientMode(true);
    	 socket.startHandshake();
     
    	 // getting proxy and initialize context infos
    	 final WSTest service = new WSTest();
    	 final WSTestImpl proxy = service.getWSTestImplPort();
    	 final Map<String, Object> reqContext = ((BindingProvider) proxy).getRequestContext();
    	 reqContext.put(MessageContext.HTTP_REQUEST_METHOD, "POST");
    	 reqContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "https://localhost:8443/test-service/WSTest?wsdl");
    	 reqContext.put(JAXWSProperties.SSL_SOCKET_FACTORY, factory);
     
    	 // calling web service
    	 final String result = proxy.getMessage("toto");
    	 System.out.println("Response : " + result);
      }
      catch (Exception e)
      {
    	 e.printStackTrace();
    	 fail(e.getMessage());
      }
    Est-il possible de préciser quel certificat utiliser sur la carte ? Si oui comment ? Sinon, j'avais pensé créé un nouveau keystore d'un autre type à partir du keystore PKCS11 mais je ne sais pas comment faire (sans créer un fichier jks en dur sur le disque) ?

    Merci d'avance

    le marlou

  2. #2
    Membre confirmé
    Homme Profil pro
    responsable technique
    Inscrit en
    Novembre 2002
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : responsable technique

    Informations forums :
    Inscription : Novembre 2002
    Messages : 100
    Par défaut
    Bon j'ai enfin résolu mon pb. Voila la soluce pour ceux que ça intéresse :
    1/ d'abord on ne peut pas créer un nouveau keystore (qq soit son type JKS, PKCS12, ...) à partir du keystore PKCS11 existant, ça donne une erreur d'encoding.
    2/ il faut créer son propre keymanager qui implemente un X509KeyManager. Le mien prend en paramètre du constructeur le keystore et l'alias du certificat à utiliser. Je peux ainsi gérer moi-même quel certificat sera utilisé pour l'authent.
    3/ il faut ensuite créer la sslFactory en utilisant le keyManager créé précédemment.
    4/ Enfin, il semble que JAX-WS soit buggé car il ne prend pas en compte ma SSLFactory que je lui passe comme indiqué ici : https://jax-ws.dev.java.net/guide/HT...etFactory.html
    Ca ne marche pas, la sslFactory n'est pas prise en compte, Dans mon cas, j'ai été obligé d'initialiser la SSLFactory avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HttpsURLConnection.setDefaultSSLSocketFactory(factory);
    Maintenant c'est ok, l'authent est opérationnelle.

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

Discussions similaires

  1. Plusieurs adresses IP sur une carte réseau et vice-versa
    Par Pandansta dans le forum Windows 8
    Réponses: 4
    Dernier message: 05/04/2013, 11h56
  2. Réponses: 0
    Dernier message: 23/09/2011, 08h42
  3. [Google Maps] affichage de plusieurs marqueurs sur une carte de google maps
    Par franklin19 dans le forum APIs Google
    Réponses: 5
    Dernier message: 30/06/2011, 18h32
  4. [Google Maps] afficher plusieurs marker sur une carte
    Par l'coy dans le forum APIs Google
    Réponses: 7
    Dernier message: 24/04/2011, 07h32
  5. Calque -> Un point sur une carte de france
    Par TATAYET dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 02/04/2005, 14h48

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