Bonjour,

J'aimerais créer un webservice ssl 2 ways, malheureusement je manque un peu de connaissance dans le domaine et je suis pour l'instant bloqué.(Le webservice fonctionne en http)

Ce que j'ai déjà fait c'est un server keystore et server truststore dans lesquel j'ai ajouté la clé publique du client :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
Keystore type: jks
Keystore provider: SUN
 
Your keystore contains 2 entries
 
client, Jun 15, 2009, trustedCertEntry,
Certificate fingerprint (MD5): 8B:FE:FD:92:26:F3:6B:3B:AB:51:01:1E:B2:2F:19:64
server, Jun 15, 2009, keyEntry,
Certificate fingerprint (MD5): E7:1B:0C:88:0E:30:33:A7:EA:96:C5:58:E5:F0:95:97
En démarrant mon serveur jboss, j'ai bien donné la référence vers mon truststore : -Djavax.net.ssl.trustStore=...

Au niveau de mon fichier server.config, j'ai ajouté ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
	<Connector port="8443" address="${jboss.bind.address}"
        maxThreads="100" minSpareThreads="5" maxSpareThreads="15"
        scheme="https" secure="true" clientAuth="want"
        keystoreFile="${jboss.server.home.dir}/conf/certificates/server.keystore"
        keystorePass="********"
        truststoreFile="${jboss.server.home.dir}/conf/certificates/server.keystore"
        truststorePass="********"
        sslProtocol = "TLS" />
Je pense qu'au niveau du server, je ne dois rien faire d'autre.
Au niveau de mon application voici le code de mon webservice :
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
54
55
56
57
58
59
60
61
62
63
 
package ejb;
 
import java.rmi.RemoteException;
 
import javax.ejb.EJB;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
 
import org.jboss.wsf.spi.annotation.WebContext;
 
import repositories.XMLReceiverRepository;
import service.XMLReceiverService;
 
 
@Stateless
@WebContext
(
  contextRoot="/pd-xmlloading-core-1",
  urlPattern="/SecureXMLReceiverServiceBean",
  authMethod="CLIENT-CERT",
  transportGuarantee="CONFIDENTIAL"
 
)
@WebService(endpointInterface = "service.XMLReceiverService")
@Remote(XMLReceiverService.class)
@SOAPBinding(style=Style.RPC)
 
public class SecureXMLReceiverServiceBean{
	@EJB
	private XMLReceiverRepository xmlReceiverRepository;
 
	public XMLReceiverRepository getXMLReceiverRepository() {
		return xmlReceiverRepository;
	}
	public void setXMLReceiverRepository(final XMLReceiverRepository xmlRecRepository) {
		xmlReceiverRepository = xmlRecRepository;
	}		
 
	@WebMethod
	public String receiveXML(String XMLDoc) throws RemoteException{
		String response="OK";
		response = loaddata(XMLDoc);
		return response;		
	}
 
	private String loaddata(String XMLDoc){
		String status="OK";
		//create the instance of RepositoryBean and call the persistMethod();
		try{
			xmlReceiverRepository=getXMLReceiverRepository();
			status=xmlReceiverRepository.persistXML(XMLDoc);
		}	
		catch(Exception ex){
			status="FAIL";
		}
		return status;
	}
}
Au niveau de mon client qui essaie de se connecter j'ai 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
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
 
package service.xmlreceiverclient;
 
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.StringWriter;
import java.net.URL;
import java.util.Properties;
 
import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.rpc.Service;
import javax.xml.rpc.ServiceFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
 
import jaws.XMLReceiverService;
import org.jboss.ws.annotation.EndpointConfig;
 
@EndpointConfig(configName="Standard WSSecurity Endpoint")
public class XMLReceiverClient {
 
	String xmlReceiverServiceURL="";
	String xmlReceiverServiceQName="";
	String xmlReceiverServiceName="";
	static String xmlFilesDirName="";
 
	public XMLReceiverClient(){
		Properties prp = new Properties();
		try{
			InputStream is = getClass().getResourceAsStream("/pandora.properties");			
			prp.load(is);
    		xmlReceiverServiceURL = prp.getProperty("XMLRECEIVER_WSDL_URL");
    		xmlReceiverServiceQName = prp.getProperty("XMLRECEIVER_QNAME_URL");
    		xmlReceiverServiceName = prp.getProperty("XMLRECEIVER_SERVICE_NAME");
    		xmlFilesDirName = prp.getProperty("XML_FILES_DIRECTORY");
		}
		catch(Exception pl){
			System.out.println("UNABLE TO LOAD PROPERTIES");
		}				
	}
 
    public String callXMLReceiverWebservice(String XMLDoc){
    	String status="";
 
        try{
        	if(xmlReceiverServiceURL.equalsIgnoreCase("")){
        		xmlReceiverServiceURL="http://localhost:8090/pd-xmlloading-core/XMLReceiverServiceBean?wsdl";
        	}
    		System.out.println("RECEIVER SERVICE WEBSERVICE URL: "+xmlReceiverServiceURL);
        	URL url = new URL(xmlReceiverServiceURL);
        	//URL url = new URL("http://localhost:8080/pd-xmlloading-core/XMLReceiverServiceBean?wsdl");
        	QName qname = new QName(xmlReceiverServiceQName,xmlReceiverServiceName);
        	//QName qname = new QName("http://service.xmlloader.pandora.ccff.minfin.fgov.be/jaws","XMLReceiverServiceService");
        	System.out.println("Getting Qualified Name: "+xmlReceiverServiceQName);
        	ServiceFactory factory = ServiceFactory.newInstance();
        	System.out.println("Getting Service Factory: "+xmlReceiverServiceName);
 
        	Service remote = factory.createService(url, qname);
        	System.out.println("Obtaining reference to a proxy object");
        	XMLReceiverService xmlReceiverService = (XMLReceiverService)remote.getPort(XMLReceiverService.class);
        	System.out.println("Accessed local proxy: " + xmlReceiverService);
        	//status=xmlReceiverService.receiveXML("STORE40 XMLFile AS STRING IN PANDORA DATABASE BY XMLReceiverWebservice");
        	status=xmlReceiverService.receiveXML(XMLDoc);
 
        	//System.out.println("Accessed local proxy: " + xmlReceiverService);
        	System.out.println("Status FROM : receiveXML Service: " + status);
 
        }
        catch(Exception ex){
        	status="FAIL";
        	System.out.println("EXCEPTION          FOUND "+ex.getMessage());
        	ex.printStackTrace();
        }
        return status;
    }    
 
    public static String getProxy(){
    	String status="success";        
    	return status;
    }
    public String convertXMLFileToString(String fileName) 
    { 
      try{ 
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();                
        InputStream inputStream = new FileInputStream(new File(fileName));
        org.w3c.dom.Document doc = documentBuilderFactory.newDocumentBuilder().parse(inputStream); 
        StringWriter stw = new StringWriter(); 
        Transformer serializer = TransformerFactory.newInstance().newTransformer(); 
        serializer.setOutputProperty(OutputKeys.ENCODING,"ISO-8859-1");
        serializer.transform(new DOMSource(doc), new StreamResult(stw));
        System.out.println("Converted xml file to string: "+stw);
        return stw.toString();
      } 
      catch (Exception e) { 
        e.printStackTrace(); 
      }      
      return null; 
    }
    public static void main(String[] args) throws Exception {      
        System.out.println("Starting Main XMLReceiver process");
        XMLReceiverClient xmlreceiverClient = new XMLReceiverClient();
        XMLFileFilter xmlFilter = new XMLFileFilter(); 
        File directory = new File(xmlFilesDirName);
        File[] files = directory.listFiles(xmlFilter);            
        for (int index = 0; index < files.length; index++)  
        {           
        	String fileName=files[index].toString();
        	if(files[index].isFile() && (fileName.endsWith("xml") || fileName.endsWith("XML"))){
        		System.out.println("LOADING XML FILE: "+fileName);
                String XMLDoc = xmlreceiverClient.convertXMLFileToString(fileName);
                String status = xmlreceiverClient.callXMLReceiverWebservice(XMLDoc);
                System.out.println("LOADING STATUS OF XML FILE: "+status);
        	}
        	else{
        		continue;
        	}
        }  
        System.out.println("End Main XMLReceiver process");                
    }    
}
class XMLFileFilter implements FileFilter{
	public boolean accept (File file){
		return file.getName().endsWith("xml");  
	}
}
je démarre le client avec les parametres suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
-Djavax.net.ssl.keyStore="C:\JBoss\server\pandora\conf\certificates\client.keystore" -Djavax.net.ssl.trustStore="C:\JBoss\server\pandora\conf\certificates\client.truststore"
-Djavax.net.ssl.keyStorePassword="*********"
-Djavax.net.ssl.trustStorePassword="********"
-Djavax.net.ssl.keyStoreType="jks"
-Djavax.net.ssl.trustStoreType="jks"
j'obtiens cette Exception :
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
 
org.jboss.ws.metadata.wsdl.WSDLException: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
EXCEPTION          FOUND javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
	at org.jboss.ws.metadata.wsdl.WSDLDefinitionsFactory.getDocument(WSDLDefinitionsFactory.java:198)
	at org.jboss.ws.metadata.wsdl.WSDLDefinitionsFactory.parse(WSDLDefinitionsFactory.java:106)
	at org.jboss.ws.metadata.ServiceMetaData.getWsdlDefinitions(ServiceMetaData.java:273)
	at org.jboss.ws.deployment.JSR109ClientMetaDataBuilder.buildMetaData(JSR109ClientMetaDataBuilder.java:110)
	at org.jboss.ws.deployment.JSR109ClientMetaDataBuilder.buildMetaData(JSR109ClientMetaDataBuilder.java:82)
	at org.jboss.ws.jaxrpc.ServiceImpl.<init>(ServiceImpl.java:96)
	at org.jboss.ws.jaxrpc.ServiceFactoryImpl.createService(ServiceFactoryImpl.java:157)
	at org.jboss.ws.jaxrpc.ServiceFactoryImpl.createService(ServiceFactoryImpl.java:128)
	at be.fgov.minfin.ccff.pandora.xmlloader.service.xmlreceiverclient.XMLReceiverClient.callXMLReceiverWebservice(XMLReceiverClient.java:65)
	at be.fgov.minfin.ccff.pandora.xmlloader.service.xmlreceiverclient.XMLReceiverClient.main(XMLReceiverClient.java:118)
Caused by: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:801)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1089)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1116)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1100)
	at sun.net.<a href="http://www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:402" target="_blank">http://www.protocol.https.HttpsClien...lient.java:402</a>)
	at sun.net.<a href="http://www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166" target="_blank">http://www.protocol.https.AbstractDe...ction.java:166</a>)
	at sun.net.<a href="http://www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:949" target="_blank">http://www.protocol.http.HttpURLConn...ction.java:949</a>)
	at sun.net.<a href="http://www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234" target="_blank">http://www.protocol.https.HttpsURLCo...nImpl.java:234</a>)
	at java.net.URL.openStream(URL.java:1007)
	at org.jboss.ws.metadata.wsdl.WSDLDefinitionsFactory.getDocument(WSDLDefinitionsFactory.java:181)
	... 9 more
Caused by: java.io.EOFException: SSL peer shut down incorrectly
	at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:333)LOADING STATUS OF XML FILE: FAIL
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:782)
	... 18 more
Pouvez-vous m'aider sachant que le webservice sans ssl 2 ways fonctionne très bien ?

Merci d'avance