Java ssl/https client utilizza un certificato autofirmato

Sto tentando di scrivere un Java client https utilizzando jdk versione 1.6.0_32. Ho un auto-firmato il certificato pubblico che ho importato in un nuovo deposito sicuro. Il problema è che continuo a ricevere “Exception in thread “main” javax.net.ssl.SSLHandshakeException: host Remoto ha chiuso la connessione durante una stretta di mano” SSL output di debug è come segue:

C:\Users\csheets\eclispe_workspace\sdpweb\InstallSSLCert>java TestCert
keyStore is :
keyStore type is : jks
keyStore provider is :
init keystore
init keymanager of type SunX509
trustStore is: c:\users\csheets\4startrust.ts
trustStore type is : jks
trustStore provider is :
init truststore
adding as trusted cert:
Subject: CN=4starserver.servehttp.com
Issuer:  CN=4STAR
Algorithm: RSA; Serial number: 0x200000001
Valid from Mon May 14 11:25:15 MDT 2012 until Tue May 14 11:25:15 MDT 2013

trigger seeding of SecureRandom
done seeding SecureRandom
Allow unsafe renegotiation: true
Allow legacy hello messages: true
Is initial handshake: true
Is secure renegotiation: false
%% No cached client session
*** ClientHello, TLSv1
RandomCookie:  GMT: 1320442869 bytes = { 175, 184, 30, 195, 10, 55, 219, 232, 23
, 237, 63, 239, 83, 49, 125, 80, 10, 174, 112, 210, 61, 53, 232, 66, 179, 22, 16
1, 80 }
Session ID:  {}
Cipher Suites: [SSL_RSA_WITH_RC4_128_MD5, SSL_RSA_WITH_RC4_128_SHA, TLS_RSA_WITH
_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC
_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_
DSS_WITH_3DES_EDE_CBC_SHA, SSL_RSA_WITH_DES_CBC_SHA, SSL_DHE_RSA_WITH_DES_CBC_SH
A, SSL_DHE_DSS_WITH_DES_CBC_SHA, SSL_RSA_EXPORT_WITH_RC4_40_MD5, SSL_RSA_EXPORT_
WITH_DES40_CBC_SHA, SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_DHE_DSS_EXPORT_WI
TH_DES40_CBC_SHA, TLS_EMPTY_RENEGOTIATION_INFO_SCSV]
Compression Methods:  { 0 }
***
main, WRITE: TLSv1 Handshake, length = 75
main, WRITE: SSLv2 client hello message, length = 101
main, READ: SSLv3 Handshake, length = 527
*** ServerHello, SSLv3
RandomCookie:  GMT: 1320442987 bytes = { 158, 143, 79, 29, 193, 160, 122, 201, 8
1, 67, 17, 26, 159, 243, 54, 202, 255, 156, 125, 121, 132, 174, 17, 202, 222, 65
, 252, 77 }
Session ID:  {131, 30, 0, 0, 6, 235, 145, 226, 5, 214, 118, 217, 18, 123, 46, 20
4, 51, 182, 211, 225, 48, 172, 95, 70, 144, 4, 178, 150, 166, 75, 166, 29}
Cipher Suite: SSL_RSA_WITH_RC4_128_SHA
Compression Method: 0
Extension renegotiation_info, renegotiated_connection: <empty>
***
%% Created:  [Session-1, SSL_RSA_WITH_RC4_128_SHA]
** SSL_RSA_WITH_RC4_128_SHA
*** Certificate chain
chain [0] = [
[
  Version: V3
  Subject: CN=4starserver.servehttp.com
  Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5

  Key:  Sun RSA public key, 1024 bits
  modulus: 129409122589634486230897608496688768265641316152022572826296995250983
  80968933262586507340653723460037384941316405007365056646964455523390263136350462
  59738068084572819329229707448458528878467480278641098016863640927986379246142644
  62745346179244207665720440347282685862962453661441013596685879879277368109494267

public exponent: 65537
Validity: [From: Mon May 14 11:25:15 MDT 2012,
           To: Tue May 14 11:25:15 MDT 2013]
Issuer: CN=4STAR
SerialNumber: [    02000000 01]

]
Algorithm: [SHA1withRSA]
Signature:
0000: 00 8E A1 F4 58 22 F2 C2   A9 1D C6 CB 5A 23 F5 A5  ....X"......Z#..
0010: 02 3A C9 FF 83 96 1A 13   3A 0F 59 D5 1E 1F 56 85  .:......:.Y...V.
0020: AB 4A 46 8D F3 43 E8 BA   B3 F9 B7 8C FB 76 AD D5  .JF..C.......v..
0030: 9F 15 47 DC 30 72 F9 BA   B1 FF DA 2C 25 89 FF 30  ..G.0r.....,%..0
0040: C4 4F BA D6 0C B9 30 10   B0 4B 74 EF 8A F4 5D F1  .O....0..Kt...].
0050: AC 2C 47 D9 C2 F5 A0 AF   CE 8B 76 53 36 A3 BE 11  .,G.......vS6...
0060: 7E BA 1F 4A 67 C1 69 EF   C3 E6 32 E2 0D 09 93 66  ...Jg.i...2....f
0070: 92 21 66 88 95 CA BD C8   FF CF 79 9D 7E F3 DC E0  .!f.......y.....

]
***
Found trusted certificate:
[
[
  Version: V3
  Subject: CN=4starserver.servehttp.com
  Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5

  Key:  Sun RSA public key, 1024 bits
  modulus: 129409122589634486230897608496688768265641316152022572826296995250983
80968933262586507340653723460037384941316405007365056646964455523390263136350462
59738068084572819329229707448458528878467480278641098016863640927986379246142644
62745346179244207665720440347282685862962453661441013596685879879277368109494267

 public exponent: 65537
 Validity: [From: Mon May 14 11:25:15 MDT 2012,
           To: Tue May 14 11:25:15 MDT 2013]
 Issuer: CN=4STAR
 SerialNumber: [    02000000 01]

 ]
Algorithm: [SHA1withRSA]
Signature:
0000: 00 8E A1 F4 58 22 F2 C2   A9 1D C6 CB 5A 23 F5 A5  ....X"......Z#..
0010: 02 3A C9 FF 83 96 1A 13   3A 0F 59 D5 1E 1F 56 85  .:......:.Y...V.
0020: AB 4A 46 8D F3 43 E8 BA   B3 F9 B7 8C FB 76 AD D5  .JF..C.......v..
0030: 9F 15 47 DC 30 72 F9 BA   B1 FF DA 2C 25 89 FF 30  ..G.0r.....,%..0
0040: C4 4F BA D6 0C B9 30 10   B0 4B 74 EF 8A F4 5D F1  .O....0..Kt...].
0050: AC 2C 47 D9 C2 F5 A0 AF   CE 8B 76 53 36 A3 BE 11  .,G.......vS6...
0060: 7E BA 1F 4A 67 C1 69 EF   C3 E6 32 E2 0D 09 93 66  ...Jg.i...2....f
0070: 92 21 66 88 95 CA BD C8   FF CF 79 9D 7E F3 DC E0  .!f.......y.....

]
*** ServerHelloDone
*** ClientKeyExchange, RSA PreMasterSecret, SSLv3
main, WRITE: SSLv3 Handshake, length = 132
SESSION KEYGEN:
PreMaster Secret:
0000: 03 00 07 86 97 89 23 A4   73 85 54 59 A4 76 DD 85  ......#.s.TY.v..
0010: 12 1A 28 1B 71 CC 7A B2   EE 0F 65 60 26 30 6C B4  ..(.q.z...e`&0l.
0020: B4 92 2D 15 50 51 E5 10   77 96 8E B0 4F 30 57 73  ..-.PQ..w...O0Ws
CONNECTION KEYGEN:
Client Nonce:
0000: 4F B4 5C F5 AF B8 1E C3   0A 37 DB E8 17 ED 3F EF  O.\......7....?.
0010: 53 31 7D 50 0A AE 70 D2   3D 35 E8 42 B3 16 A1 50  S1.P..p.=5.B...P
Server Nonce:
0000: 4F B4 5C 6B 9E 8F 4F 1D   C1 A0 7A C9 51 43 11 1A  O.\k..O...z.QC..
0010: 9F F3 36 CA FF 9C 7D 79   84 AE 11 CA DE 41 FC 4D  ..6....y.....A.M
Master Secret:
0000: 60 59 16 75 E0 5E 4B 64   D6 6B 56 18 9B F2 C8 7A  `Y.u.^Kd.kV....z
0010: F8 DF 65 C6 C0 12 92 62   15 A1 4E 5F 53 D3 02 EF  ..e....b..N_S...
0020: 9B EF ED FD 1E 01 61 6F   AC 39 E0 5B AD 87 BF 25  ......ao.9.[...%
Client MAC write Secret:
0000: C1 36 79 97 E6 71 22 D0   27 D0 41 88 F9 F5 8D C2  .6y..q".'.A.....
0010: EA A3 97 FB                                        ....
Server MAC write Secret:
0000: C4 00 15 49 31 29 B2 F3   06 90 59 F0 5A 4D 3D 45  ...I1)....Y.ZM=E
0010: 32 B2 B6 83                                        2...
Client write key:
0000: E6 46 87 A2 16 52 04 11   73 15 E8 23 9F E6 02 A3  .F...R..s..#....
Server write key:
0000: 04 63 1D 64 E7 25 FC E4   53 FC 43 04 33 3C ED 6E  .c.d.%..S.C.3<.n
... no IV used for this cipher
main, WRITE: SSLv3 Change Cipher Spec, length = 1
*** Finished
verify_data:  { 61, 221, 238, 253, 97, 36, 152, 79, 254, 95, 226, 136, 55, 16, 2
07, 66, 58, 197, 233, 254, 125, 99, 11, 0, 138, 51, 139, 62, 175, 123, 52, 167,
131, 216, 245, 97 }
***
main, WRITE: SSLv3 Handshake, length = 60
main, received EOFException: error
main, handling exception: javax.net.ssl.SSLHandshakeException: Remote host close
d connection during handshake
main, SEND SSLv3 ALERT:  fatal, description = handshake_failure
main, WRITE: SSLv3 Alert, length = 22
main, called closeSocket()
Exception in thread "main" javax.net.ssl.SSLHandshakeException: Remote host clos
ed connection during handshake
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)

    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Un
known Source)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Sou
rce)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Sou
rce)
    at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect
(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown So
urce)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unkn
own Source)
    at TestCert.main(TestCert.java:92)
Caused by: java.io.EOFException: SSL peer shut down incorrectly
    at com.sun.net.ssl.internal.ssl.InputRecord.read(Unknown Source)
    ... 9 more

Non sono sicuro di come interpretare tutte queste informazioni, ma sembra come il mio certificato è stato trovato e di fiducia – cosa significa il ClientKeyExchange media – potrebbe essere che il server è in attesa di autenticazione del client o è solo il certificato di informazioni scambiate. Tutto il keystore Java, trustore e certificati auto-firmati sembra creare un sacco di complessità e confusione, almeno per me.

Mio client di test codice è il seguente:

import java.io.*;
import java.net.URL;
import java.net.URLConnection;

import javax.net.ssl.*;
import javax.net.ssl.X509TrustManager;
import java.security.cert.X509Certificate;
import java.security.*;

public class TestCert {
public static void main(String[] args) throws Exception {
    System.setProperty("javax.net.debug", "ssl");
    System.setProperty("sun.security.ssl.allowUnsafeRenegotiation", "true");
    System.setProperty("javax.net.ssl.trustStore", "c:\\users\\csheets\\4startrust.ts");
    System.setProperty("javax.net.ssl.trustStorePassword", "mypassword");


    SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();

    URL url = new URL("https://4starserver.servehttp.com:777/?username=0&password=0&command=WEBAUTH&TRAN=2&MERCHANT=9999999999119911&FNAME=TONY&LNAME=PISCOPO&CC=4111111111111111&EXP=0613&AMOUNT=99.98");
    HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();
    conn.setSSLSocketFactory(sslsocketfactory);

    InputStream inputstream = conn.getInputStream();
    InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
    BufferedReader bufferedreader = new BufferedReader(inputstreamreader);

    String string = null;
    while ((string = bufferedreader.readLine()) != null) {
        System.out.println("Received " + string);
    }
}
}

Ho provato altre cose, come creare il mio TrustManager e TrustManager, come pure, ma che non sembrava funzionare. Qualsiasi aiuto sarebbe molto apprezzato.

AGGIORNAMENTO:
La porta del server è stato cambiato a 443 così potuto testare con Qualys SSL test di Laboratorio e ho ottenuto i seguenti risultati:

Common Error Messages

Connect timed out - server did not respond to our connection request
No route to host - unable to reach the server
Unable to connect to server - failed to connect to the server
Unrecognized SSL message, plaintext connection? - the server responded with plain-text HTTP on HTTPS port
Received fatal alert: handshake_failure - this is either a faulty SSL server or some other server listening on port 443; if the SSL version of the web site works in your browser, please report this issue to us
Known Issues

Could not generate DH keypair - due to a known problem with the underlying SSL library (Sun's JSSE implementation) we are unable to assess the sites that offer only DHE handshakes stronger than 1024 bits.

La cosa strana è che mi sembra di ottenere una risposta dal server, se ho appena messo l’URL https://server.com/ nel browser, ma sul server, evidentemente, sembra che ci sono diverse richieste /connessioni. Sembra che ci sia qualcosa che non va sul lato server?

OriginaleL’autore csheets | 2012-05-17

3 risposte

  1. 4

    È certificato è attendibile (utilizzando il custom fiducia store), questo non è un trust manager problema. Non è necessario per consentire pericoloso rinegoziazione (né per specificare l’impostazione predefinita SSLSocketFactory).

    Sembra che ci sia un problema con il TLS installazione, in quanto funziona con System.setProperty("https.protocols", "SSLv3");. Si ottiene anche una stretta di mano, un problema, se si forza -tls1 con openssl s_client.

    Se sei in controllo del server, vorrei suggerire di provare a metterla sulla porta 443 e test tramite il Qualys SSL laboratori di prova (che è più dettagliate e le catture più problemi rispetto a molti altri test disponibili).

    Pertanto l’impostazione di https.protocolli di proprietà “SSLv3” funziona! Vorrei capire che un po ‘ di più – cosa che effettivamente fare e come è diverso da fare: SSLContext sslContext = SSLContext.getInstance(“SSLv3″; ” io sono ok, basta impostare le proprietà di sistema, a meno che sia un problema per qualche motivo. Grazie anche per l’heads-up il Qualys SSL laboratori di prova – non ero a conoscenza di questo.
    SSLContext.getInstance(...)restituisce un’istanza che implementa almeno la richiesta secure socket protocollo. Restituiti istanza può attuare protocolli di troppo.. In contrasto, https.protocols imposta il protocolli attivati in modo esplicito sul socket utilizzato da HttpsURLConnection: che è ciò che è utilizzato per specificare che di SSLv3/TLSv1.x utilizzare.
    Mi piacerebbe generalmente suggerisco di provare a spostare le versioni (in termini di SSLv3, TLSv1.0, TLSv1.1, …), se possibile. Idealmente oggi, SSLv3 dovrebbe scomparire e dobbiamo cercare di utilizzare TLS 1.1 almeno (per affrontare la BESTIA vulnerabilità tra le altre cose). Alcuni server non supporta TLS 1.0 oggi (quello che si sta tentando di utilizzare è uno di loro).
    Grazie mille per l’info molto apprezzato.
    Ho aggiornato la domanda con i risultati ottenuti con l’Inter SSL di prova – sembra che ci sia qualcosa che non va sul lato server? Comunque, penso che per ora sono soddisfatto con l’impostazione del SSLv3 in modo esplicito il socket tramite https.protocolli di proprietà di sistema. Grazie per l’aiuto di tutti.

    OriginaleL’autore Bruno

  2. 1

    Per chiunque con un problema simile: anche io ho avuto un problema con l’utilizzo di Java e SSL in cui il server ha avuto un certificato auto-firmato. Ho provato ad utilizzare
    Sistema.setProperty(“https.protocolli”, “SSLv3”);
    come accennato in una risposta. Non ha funzionato per me. Ma qualcosa di simile ha fatto il lavoro:
    Sistema.setProperty(“https.protocolli”, “TLSv1”);

    OriginaleL’autore user2367418

  3. -3

    Provare implementa X509TrustManager classe in classe e dopo questo:

        private static void trustAllHttpsCertificates() throws Exception {
           // Create a trust manager that does not validate certificate chains:
           javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1];
           javax.net.ssl.TrustManager tm = new YourMainClass();
           trustAllCerts[0] = tm; 
           javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext.getInstance("SSL");
           sc.init(null, trustAllCerts, null);
           javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        }

    e di eseguire l’override di questo,

        @Override
        public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
           return;
        }
    
        @Override
        public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
           return;
        }
    
        @Override
        public X509Certificate[] getAcceptedIssuers() {
           return null;
        }

    Spero di aiutarvi. 🙂

    Non disattivare la verifica dei certificati, si apre la porta agli attacchi MITM. Inoltre, la fiducia store è dato in questa domanda (che è il modo giusto per farlo), e il certificato è visibilmente di fiducia.
    In realtà ho provato questo approccio per scopi di test per solo vedere se ho potuto ottenere qualcosa/nulla al lavoro ha avuto alcun effetto su di me per qualche motivo – wsa ancora ricevendo lo stesso errore. L’impostazione della proprietà di Sistema “https.protocolli” a “SSLv3” sembra ma non sono sicuro perché, ma andando per ora 🙂 Grazie per l’aiuto.
    Ciao @csheets il TestCert classe per me è un ritorno Exception in thread "main" javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake. Penso che è un problema del server. Faccio il test con implementa X509TrustManager. Avete bisogno di tornare o ricevuto qualcosa? Per esempio XML o un file?.
    D’accordo – credo sia problema di server come qualcosa di non giusto sembra basata su qualche altro test, vedere l’Aggiornamento in questione per i risultati dei test da Qualys SSL di prova. Ma penso di avere la mia risposta per ora – impostazione https.protocolli di proprietà di sistema di SSLv3 esplicitamente, sembra funzionare bene senza errori su client o server.

    OriginaleL’autore hekomobile

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *