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