2010-09-23 9 views
6

Uso la connessione SSL per connettere il web client al server. Funziona senza problemi per molto tempo. Ma da ieri dà il seguente errore qualcuno può dirmi il motivo.Eccezione SSL HandShake

javax.net.ssl.SSLException: Connection has been shutdown: javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.checkEOF(SSLSocketImpl.java:1172) 
     at com.sun.net.ssl.internal.ssl.AppInputStream.read(AppInputStream.java:65) 
     at net.schubart.fixme.internal.MessageInput.readExactly(MessageInput.java:166) 
     at net.schubart.fixme.internal.MessageInput.readMessage(MessageInput.java:78) 
     at cc.aot.itsWeb.ClientWriterThread.run(ClientWriterThread.java:241) 
     at java.lang.Thread.run(Thread.java:619) 
clientWriter.ready 
Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown 
     at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174) 
     at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1586) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:865) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1029) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:621) 
     at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:59) 
     at java.io.OutputStream.write(OutputStream.java:58) 
     at net.schubart.fixme.internal.Message.write(Message.java:267) 
     at net.schubart.fixme.internal.MessageOutput.writeMessage(MessageOutput.java:53) 
+0

Avete registri del server? Si tratta di "SSL unidirezionale" (senza certificato utente) o si autentica il client? Puoi collegare questo server usando il browser web? Il certificato del server è valido? –

risposta

2

Verificare che il certificato sia valido, è possibile farlo con il browser.

2

Il certificato presentato dal server non è attendibile. Ciò potrebbe essere dovuto al fatto che il certificato è scaduto o che il gestore di fiducia non è in grado di stabilire una catena di attendibilità su nessuno dei certificati nel proprio archivio di fiducia.

0

È possibile controllare il certificato tramite il browser.

In Internet Explorer

Right Click >> Properties >> Certificates 

Una volta in Certificati finestra è possibile visualizzare l'intero albero certificato pure.

Se si dispone di un certificato non valido, è possibile cercare una soluzione utilizzando il comando keytool.

Keytool Commands

2

Se davvero davvero bisogno di, è possibile accettare tutti i certificati. Ma tieni presente che questo è davvero brutto.

Hava un'occhiata a this.

0

Penso che sia necessario aggiungere il keystore in jre1.6 cacert. Quindi distribuisci di nuovo il tuo server. Tra l'altro puoi usare per aggiungere il programma keystorePORTECLE. E 'molto utile.

5

Ho trascorso più di 12 ore su questo problema. Dopo aver creato un certificato autofirmato, è necessario esportarlo nel file cacert. Nel mio caso si trovava in /usr/lib/java/jre/lib/security/cacert. È possibile esportare il certificato utilizzando il keytool (probabilmente avere accesso root):

$ sudo keytool -exportcert -alias keyStoreAlias -keystore \ 
     keyStoreKeys.keys -file /usr/local/java/jre/lib/security/cacerts 
2

vorrei prima verificare se il CERT in questione è scaduto. Si sono imbattuti in questo molte volte quando si lavora con i fornitori. Possono aggiornare i loro certificati senza farcelo sapere.

4

Il problema che si verifica è con i certificati. Ecco un elenco di cose che potrebbe essere necessario conoscere prima di lavorare con un programma SSL sicuro. Ci deve essere un truststore, un keystore e i certificati devono essere aggiunti. Per aggiungere la chiave al file cacerts, come al punto 6, il computer potrebbe chiederti una password che non conosci.E 'mostt "changeit" probabile

1) Per creare un nuovo archivio di chiavi e certificato auto-firmato con corrispondenti chiavi pubbliche/private:

keytool -genkeypair -alias "username" -keyalg RSA -validity 7 -keystore keystore 

2) per esaminare le chiavi:

keytool -list -v -keystore keystore 

3) esportazione ed esaminare il certificato auto-firmato:

keytool -export -alias "username" -keystore keystore -rfc -file "username".cer 

4) Importare il certificato in un nuovo truststore:

keytool -import -alias "username" -file "username".cer -keystore truststore 

5) Esaminare il truststore:

keytool -list -v -keystore truststore 

6) Aggiungi al keystore (questo è quello che cercate):

sudo keytool -import -file "username".cer -alias "username" -keystore "path-to-keystore" 

Su alcuni sistemi questo si trova in

/usr/lib/jvm/<java version folder>/jre/lib/security/cacerts 

e su altri sistemi è qualcosa di simile

/etc/ssl/certs/java/cacerts 

Partenza questo progetto su Git-Hub se avete bisogno di maggiori chiarimenti: https://github.com/rabbitfighter81/JSSLInfoCollectionServer E qui è uno script di shell che aiuta con le chiavi. https://github.com/rabbitfighter81/SSLKeytool

0

Questo 'certificate_unknown' è un messaggio di errore molto fuorviante. Questo è lo stesso messaggio di errore generato quando un certificato è scaduto, anche se si trova nel truststore. Suggerisco di controllare la data di scadenza del certificato prima di perdere tempo su qualcos'altro.

Problemi correlati