Java WebServiceClient mittels HTTPS

stefangraf

Grünschnabel
Hallo zusammen,
ich habe in Java einen WebserviceClient geschrieben, welcher via HTTP seine SOAP-Anfragen übermittelt. Das funktioniert wunderbar. Nun hat sich meine Aufgabestellung insofern geändert, dass ich die Übertragung der Daten nun mittls HTTPS erdedigen muss.

Meine erste Idee war, dass ich die HttpURLConnection in eine HttpsURLConnection abändere. Dies hat jedoch zu Fehlern geführt. Kann mir jemand sagen inwiefern ich meinen Code noch anpassen muss, sodass es funktioniert?

Bin um jeden Tip, Hinweis, Link, ... dankbar.

Gruss
Stefan

Code:
public class WebserviceClient {
	private String[] getRolesByPID(String pid, String app){
		String soap_body =
		    " <roles_by_pid xmlns=\"" + WEBSERVICE_NAMESPACE + "\">\n" +
		    "  <pid>" + pid + "</pid>\n" +
		    "  <application>" + app + "</application>\n" +
		    " </roles_by_pid>\n";
		    
		String[] roles = doSOAP_request(soap_body, WEBSERVICE_METHOD_ROLES);
		return roles;
	}


	
	/**
	 * 
	 * @param SOAP_body
	 * @param webserviceMethod
	 * @return
	 */
	private String[] doSOAP_request(String SOAP_body, String webserviceMethod){
		try {
/WebServices/ok/usermanager/UserManamgement.asmx"
			URL url= new URL(SERVER + ":" + PORT + WEBSERVICE_PATH);
			
			//setup HTTP Connecten to the service
			HttpURLConnection connection = (HttpURLConnection)url.openConnection();
			// HttpsURLConnection connection = (HttpsURLConnection)url.openConnection();
			connection.setRequestMethod("POST");
			connection.setDoOutput(true);
			connection.setDoInput(true);
			
			//create SOAP Request
			connection.setRequestProperty("Content-type", "text/xml; charset=utf-8");
			connection.setRequestProperty("SOAPAction", WEBSERVICE_NAMESPACE + webserviceMethod);
	
			// SOAP request
			String msg =
				"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
				"<soap:Envelope " +
				" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
				" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\n" +
				" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" +
				" <soap:Body>\n" +
				SOAP_body +
				" </soap:Body>\n" +
				"</soap:Envelope>";
			
			// send SOAP-Request
			byte[] bytes = msg.getBytes();
			connection.setRequestProperty("Content-length", String.valueOf(bytes.length));
      
			if (PRINT_REQUEST) {
				System.out.println("\nSOAP Aufruf:");
				System.out.println("Content-type:"+connection.getRequestProperty("Content-type"));
				System.out.println("Content-length:"+connection.getRequestProperty("Content-length"));
				System.out.println("SOAPAction:"+connection.getRequestProperty("SOAPAction"));
				System.out.println(msg);	
			}
			
			OutputStream out = connection.getOutputStream();
			out.write(bytes);
			out.close();
			
			// read SOAP-response
			BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
			

			// handle the SOAP response
			StringBuffer in_buffer = new StringBuffer();
			String temp;
			while ((temp = in.readLine()) != null){
				in_buffer.append(temp);
			}
			String[] arr = unpack_SOAP_message(in_buffer.toString(), webserviceMethod);
//			System.out.println(in_buffer.toString());
			in.close();
			return arr;
		} 
		catch (Exception e) {
			System.out.println("FEHLER:" + e.getMessage());
			return new String[0];
		}
	}
 
Hallo Stefan,

ich hatte die gleiche Problematik bei einem Soap-Client mit Axis 1.x.

Dabei habe ich zum einen die URL von HTTP in HTTPS geändert und zum zeiten mußte ich noch den SSL-Schlüssel in die Java-Runtime importieren. Dazu gibt es im Java-Ordner im bin-Verzeichnis ein Programm Keytool mit dem man den Schlüssel importieren kann. Ich habe erst den Schlüssel erst über den IE exportiert und gespeichert und dann importiert.

Hinzufügen eines Zertifikats...

z.B.
c:\Programme\Java\jre1.5.0_08\bin>keytool -import -trustcacerts -keystore c:\programme\java\jre1.5.0_10\lib\security\cacerts -alias deinAlias -file deinCert.cer

Passwort: changeit

Liste der Zertifikate anzeigen
z.B.
c:\Programme\Java\jre1.5.0_08\bin>keytool -list -keystore c:\programme\java\jre1.5.0_10\lib\security\cacerts


ich weis nicht ob das der beste Weg ist, aber hat bei mir funktioniert. Ein Problem ist dabei, dass nach einem Runtime-Update der Schlüssel neu eingelesen werden muß. Ich habe keine Ahnung ob sich da was automatisieren lässt.

Grüße

Andreas
 
Zuletzt bearbeitet:
hallo andreas

das habe ich gemacht. das scheint jedoch nicht das problem zu sein.
Ich habe folgende Fehlermeldung:
Code:
HTTPS hostname wrong:  should be <my.domain.net>

die url die ich verwende sieht wie folgt aus:
HTTPS:
======
Code:
https://my.domain.net:443/BB_WebServices_40/UserManamgement.asmx

ich vergleich zum "nonsecuren" aufruf wo ich folgende url verwende (dies funktioniert):
HTTP:
======
Code:
http://my.domain.net:82/WebServices/ok/usermanager/UserManamgement.asmx

der aufruf mittels browser auf die beiden url's lifert das gewünshte resultat. somit kann es nicht an der url (HTTPS) liegen, sondern muss ein problem des java codes sein.

danke und gruss
stefan
 
Zurück