PDA

View Full Version : JAVA - connessione https


cat78
02-03-2003, 17:24
Mi sono fatto un programmino in java che mi permette di richiedere una pagina web specificando alcuni parametri: in pratica, dato l'url completo al documento da richiamare (es. http://forum.hwupgrade.it/index.php) e una stringa con i parametri da passare con metodo POST, clikkando su un JButton mi viene fornito il testo della pagina in una JTextArea.

Il programma funziona bene se uso il protocollo http, ma mi lancia invece una eccezione se uso il protocollo https.
L'eccezione e' "javax.net.ssl.SSLHandshakeException: Could not find trusted certificate".

Premettendo che il server a cui faccio la richiesta funziona correttamente, come faccio a risolvere il problema? Non me ne intendo molto di https.

Vi posto la parte interessata di codice:

.....
try
{
URL myUrl=new URL(urlField.getText());
htmlArea.setText("");
URLConnection myConnection=myUrl.openConnection();

myConnection.setDoOutput(true);
myConnection.setDoInput(true);
myConnection.setUseCaches(false);

String request=postArea.getText();

DataOutputStream outStream=new DataOutputStream(myConnection.getOutputStream());
outStream.writeBytes(request);
outStream.flush();
outStream.close();

DataInputStream inStream=new DataInputStream(myConnection.getInputStream());

String inputLine;
while ((inputLine = inStream.readLine()) != null)
htmlArea.append(inputLine+"\n");
inStream.close();
}
catch(MalformedURLException exception)
{
htmlArea.setText("URL non valida!!!\n"+exception);
}
catch(IOException exception)
{
htmlArea.append("Eccezzione di input/output !!!\n"+exception);
}
.....



:muro:

kingv
03-03-2003, 09:43
puoi fare in due modi:
1) se non hai grosse pretese di sicurezza puoi disabilitare il controllo sul certificato creandoti un trust manager ad hoc che valida tutti i certificati.
2) ti scarichi il certificato dal server e lo "installi" nel tuo truststore con i tool del jdk (consulta la documentazione per sapere come fare, poi al limite chiedi ;) )

Ciao

cat78
03-03-2003, 19:45
la prima soluzione dovrebbe andare bene :) , come si fa a disabilitare il controllo del certificato? Hai qualche esempio di codice o eventualmente un link a un documento che spiega come fare?

kingv
04-03-2003, 09:55
Ecco un esempio di codice (non mio, preso da internet :o )


// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
}
};

// Install the all-trusting trust manager
try {
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
}

// Now you can access an https URL without having the certificate in the truststore
try {
URL url = new URL("https://hostname/index.html");
} catch (MalformedURLException e) {
}

kingv
04-03-2003, 09:57
Dovrebbe adattarsi bene al tuo caso ;)

cat78
04-03-2003, 19:20
Originally posted by "kingv"

Dovrebbe adattarsi bene al tuo caso ;)

Si' hai ragione :) si adatta che e' una meraviglia, non mi da' piu' quella eccezione.

Adesso pero' mi da altre due eccezioni (in modo alternato):

java.net.ConnectException: Connection timed out: connect

oppure

java.net.NoRouteToHostException: No route to host: connect

ora cerco di studiare un po' il problema e vedo se riesco a risolvermelo da solo. (per il primo forse devo solo trovare il modo di settare un timeout piu' altro, per il secondo bho..)

cmq dov'e' che hai trovato il codice che mi hai postato? magari trovo qualche altro esempio che mi risolve i problemi :D


bye

kingv
05-03-2003, 10:16
Originally posted by "cat78"



Si' hai ragione :) si adatta che e' una meraviglia, non mi da' piu' quella eccezione.

Adesso pero' mi da altre due eccezioni (in modo alternato):

java.net.ConnectException: Connection timed out: connect

oppure

java.net.NoRouteToHostException: No route to host: connect




no route to host -> no ha modo di raggiungere l'host a cui ti stai cercando di connettere! e' un problema di configurazione, non di codice.
prova a pingare la macchine a cui ti connetti o a far telnet sulla 443, non dovresti riuscirci.

cat78
05-03-2003, 22:16
Cavolo! stasera funziona :confused: , non mi da' piu' eccezioni.
ma quando avevo provato ieri sera ero sicuro che il server funzionava.. bho? forse avevo provato a usare il mio prog. proprio in un attimo che il server non era raggiungibile :confused:

vabbe', l'importante che finalmente funziona tutto :D

grazie per l'aiuto kingv, a buon rendere ;)


bye