2012-11-20 8 views
5

Sto usando Amazon RDS MySQL e di collegamento con SSL certificato (il certificato di default disponibili a http://s3.amazonaws.com/rds-downloads/mysql-ssl-ca-cert.pem), sto facendo le seguenti operazioni:Accesso RDS con SSL - non supportato record di versione sconosciuta-0.0

  1. scaricato il mysql-ssl-ca-cert.pem
  2. modificato il file di cui sopra per JKS formato
  3. e la connessione da un'applicazione web attraverso Spring - Hibernate modello (org.springframework.beans.factory.config.PropertyPlaceholderConfigurer) e anche l'uso c3p0, siamo impostazione ulteriore parametro URL come jdbc:URL/DB?autoReconnect=true&useUniCode=true&characterEncoding=UTF-8&useSSL=true&verifyServerCertificate=false&requireSSL=true

Ma io sto affrontando il problema sotto ...

javax.net.ssl.SSLException: Unsupported record version Unknown-0.0 

Come posso risolvere questo problema?

risposta

4

Fondamentalmente significa che il parser SSL è stato perso. Il livello socket ha passato alcuni byte che non si adattano al protocollo SSL.

Quando si trasmette utilizzando un socket SSL, chiama una routine di formattazione e crittografia per creare il pacchetto crittografato. Quindi chiama il livello dei socket semplici per trasferire il pacchetto crittografato sul server. Il livello di socket del server riceve il pacchetto e quindi chiama il pacchetto SSL per decodificare il pacchetto. Se il pacchetto non si adatta al formato SSL, si ottiene l'eccezione di versione non supportata.

Tutti i byte che arrivano al livello socket vengono inviati al pacchetto SSL. Quindi il modo più semplice per ottenere quell'errore è usare il livello dei socket semplici per trasmettere un messaggio di testo in chiaro dopo aver stabilito la connessione SSL.

Nel mio caso particolare, mi sono imbattuto in questo messaggio di errore perché stavo trasmettendo byte extra. Vediamo se riesco a spiegare chiaramente il mio errore.

Avevo un buffer che era (ad esempio) 100 byte. Ho inserito il buffer con il mio messaggio da 50 byte e ho chiamato la procedura di crittografia SSL. Il pacchetto risultante era lungo 75 byte. Ho chiamato send() per trasmettere il buffer. Questo è stato un invio di prese semplici; ha fatto quello che gli ho detto di fare, che trasmetteva l'intero buffer da 100 byte.

Al server, sono stati ricevuti gli interi 100 byte. Il pacchetto SSL ha provato a decodificare il pacchetto. Ha trovato un messaggio SSL perfettamente buono impacchettato nei primi 75 byte che sono stati ricevuti. Fin qui tutto bene. Poi ha cercato di capire cosa significassero i restanti 25 byte. Asserì che era un SECONDO messaggio SSL e provò a decrittarlo. Fu allora che soffocò e buttò fuori quella brutta eccezione.

Spero che ti dia qualche indizio su cosa cercare nel tuo codice.

1

Ho trovato questo errore se ho presentato un certificato client non supportato. Blanking out "-Djavax.net.ssl.keyStore" e connessione senza alcun certificato client funzionante.

Vedi anche http://feed.askmaclean.com/archives/secure-java-connections-by-default.html:

Il supporto per le varie versioni TLS varia a seconda della versione di JRE utilizzato. Assicurati di conoscere le funzionalità del JDK che stai utilizzando prima di limitare specifiche versioni TLS. Quando ho eseguito il test in precedenza, Eclipse utilizzava JRE 1.6.0_45 invece di JRE 1.8.0_65 che mi aspettavo e si connetteva usando i cifrari TLSv1.0.Quando MySQL Server è stato configurato in modo da consentire solo TLSv1.1 e TLSv1.2, ho ricevuto la seguente eccezione:

Causato da: javax.net.ssl.SSLException: non supportata record di versione Unknown-0.0 a com.sun.net .ssl.internal.ssl.InputRecord.readV3Record (InputRecord.java:504)

L'utilizzo di JRE anziani dovrebbe essere valutata prima di disattivare TLSv1.0 - per fortuna, PERFORMANCE_SCHEMA rende facile rilevare JRE client senza dover ispezionare ogni applicazione server.