2012-08-07 16 views
7

Possiedo un progetto Java connesso a un server CometD su un trasporto WebSocket protetto che utilizza un certificato autofirmato. Sto configurando il WebSocketClientFactory nel seguente modo:Utilizzo di un keystore personalizzato con WebSocketClientFactory di Jetty

wssFactory.getSslContextFactory().setKeyStorePath("/path/to/my/custom.jks"); 
wssFactory.getSslContextFactory().setKeyStorePassword("mypass"); 

E poi creare il mio BayeuxClient in questo modo:

BayeuxClient client = new BayeuxClient(
     "wss://myserver.com/cometd", 
     WebSocketTransport.create(clientOptions, wssFactory)); 

Infatti, quando questo viene caricato prima, le cose sembrano essere configurato correttamente:

[DEBUG] 2012-08-07 12:58:05,786 : starting [email protected] 
[DEBUG] 2012-08-07 12:58:05,786 : starting qtp2005556553{8<=0<=0/254,-1} 
[DEBUG] 2012-08-07 12:58:05,788 : STARTED qtp2005556553{8<=7<=8/254,0} 
[DEBUG] 2012-08-07 12:58:05,788 : starting org.eclipse[email protected]50c8c3b8 
[DEBUG] 2012-08-07 12:58:05,795 : STARTED org.eclipse[email protected]50c8c3b8 
[DEBUG] 2012-08-07 12:58:05,795 : Starting Thread[qtp2005556553-33 Selector0,5,main] on [email protected] 
[DEBUG] 2012-08-07 12:58:05,797 : starting [email protected](/Users/apetresc/Downloads/infrastructure.jks,null) 
[INFO ] 2012-08-07 12:58:05,981 : Enabled Protocols [SSLv2Hello, SSLv3, TLSv1] of [SSLv2Hello, SSLv3, TLSv1] 
[DEBUG] 2012-08-07 12:58:05,981 : Enabled Ciphers [SSL_RSA_WITH_RC4_128_MD5, SSL_RSA_WITH_RC4_128_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_256_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_SHA, 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_WITH_DES40_CBC_SHA, TLS_EMPTY_RENEGOTIATION_INFO_SCSV] of [SSL_RSA_WITH_RC4_128_MD5, SSL_RSA_WITH_RC4_128_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_256_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_SHA, 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_WITH_DES40_CBC_SHA, TLS_EMPTY_RENEGOTIATION_INFO_SCSV, SSL_RSA_WITH_NULL_MD5, SSL_RSA_WITH_NULL_SHA, SSL_DH_anon_WITH_RC4_128_MD5, TLS_DH_anon_WITH_AES_128_CBC_SHA, TLS_DH_anon_WITH_AES_256_CBC_SHA, SSL_DH_anon_WITH_3DES_EDE_CBC_SHA, SSL_DH_anon_WITH_DES_CBC_SHA, SSL_DH_anon_EXPORT_WITH_RC4_40_MD5, SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA, TLS_KRB5_WITH_RC4_128_SHA, TLS_KRB5_WITH_RC4_128_MD5, TLS_KRB5_WITH_3DES_EDE_CBC_SHA, TLS_KRB5_WITH_3DES_EDE_CBC_MD5, TLS_KRB5_WITH_DES_CBC_SHA, TLS_KRB5_WITH_DES_CBC_MD5, TLS_KRB5_EXPORT_WITH_RC4_40_SHA, TLS_KRB5_EXPORT_WITH_RC4_40_MD5, TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA, TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5] 
[DEBUG] 2012-08-07 12:58:05,981 : STARTED [email protected](/Users/apetresc/Downloads/infrastructure.jks,/Users/apetresc/Downloads/infrastructure.jks) 
[DEBUG] 2012-08-07 12:58:05,981 : STARTED [email protected] 

E, in effetti, realtà usando le BayeuxClient opere. Tuttavia, funzionerebbe anche se non avessi specificato un keystore - lo considererebbe semplicemente come un certificato non firmato. E, in effetti, che sembra essere ciò che sta accadendo, a giudicare dai log di errore continuo a ricevere ogni pochi secondi:

[DEBUG] 2012-08-07 13:20:37,348 : State update: CONNECTED -> CONNECTED 
[DEBUG] 2012-08-07 13:20:37,348 : Connecting, transport [email protected] 
[DEBUG] 2012-08-07 13:20:37,348 : [Session-1, SSL_NULL_WITH_NULL_NULL] [email protected] SSL NOT_HANDSHAKING i/o/u=0/0/0 ishut=false oshut=false {WebSocketClientConnection [email protected] state=START buffer= [email protected] closed=false buffer=-1} NOT_HANDSHAKING filled=0/0 flushed=0/0 
[DEBUG] 2012-08-07 13:20:37,348 : Sending messages [{id=50, connectionType=websocket, channel=/meta/connect, clientId=2u16ol79fcq7hqe1wu52pr0ws4aw}] 
[DEBUG] 2012-08-07 13:20:37,348 : Registering WebSocketExchange {id=50, connectionType=websocket, channel=/meta/connect, clientId=2u16ol79fcq7hqe1wu52pr0ws4aw} 
[DEBUG] 2012-08-07 13:20:37,348 : [Session-1, SSL_NULL_WITH_NULL_NULL] [email protected] SSL NOT_HANDSHAKING i/o/u=0/0/0 ishut=false oshut=false {WebSocketClientConnection [email protected] state=OPCODE buffer= [email protected] closed=false buffer=-1} NOT_HANDSHAKING filled=0/0 flushed=0/0 
[DEBUG] 2012-08-07 13:20:37,348 : Sending messages [{"id":"50","connectionType":"websocket","channel":"/meta/connect","clientId":"2u16ol79fcq7hqe1wu52pr0ws4aw"}] 
[DEBUG] 2012-08-07 13:20:37,348 : [Session-1, SSL_NULL_WITH_NULL_NULL] [email protected] SSL NOT_HANDSHAKING i/o/u=0/0/0 ishut=false oshut=false {WebSocketClientConnection [email protected] state=OPCODE buffer= [email protected] closed=false buffer=116} NOT_HANDSHAKING filled=0/0 flushed=0/0 
[DEBUG] 2012-08-07 13:20:37,349 : [Session-1, SSL_NULL_WITH_NULL_NULL] [email protected] SSL NOT_HANDSHAKING i/o/u=0/0/0 ishut=false oshut=false {WebSocketClientConnection [email protected] state=OPCODE buffer=null [email protected] closed=false buffer=116} NOT_HANDSHAKING filled=0/0 flushed=0/0 
[DEBUG] 2012-08-07 13:20:37,349 : [Session-1, SSL_NULL_WITH_NULL_NULL] wrap OK NOT_HANDSHAKING consumed=116 produced=137 
[DEBUG] 2012-08-07 13:20:37,349 : [Session-1, SSL_NULL_WITH_NULL_NULL] [email protected] SSL NOT_HANDSHAKING i/o/u=0/0/0 ishut=false oshut=false {WebSocketClientConnection [email protected] state=OPCODE buffer=null [email protected] closed=false buffer=0} NOT_HANDSHAKING filled=0/0 flushed=137/0 
[DEBUG] 2012-08-07 13:20:37,349 : [Session-1, SSL_NULL_WITH_NULL_NULL] [email protected] SSL NOT_HANDSHAKING i/o/u=0/0/0 ishut=false oshut=false {WebSocketClientConnection [email protected] state=OPCODE buffer=null [email protected] closed=false buffer=0} NOT_HANDSHAKING filled=0/0 flushed=0/0 
[DEBUG] 2012-08-07 13:20:37,349 : [Session-1, SSL_NULL_WITH_NULL_NULL] handle [email protected] SSL NOT_HANDSHAKING i/o/u=0/0/0 ishut=false oshut=false {WebSocketClientConnection [email protected] state=OPCODE buffer=null [email protected] closed=false buffer=-1} progress=false 

Per me questo implica che il CometD stretta di mano sta completando, ma la SSL stretta di mano non è. Non riesco a capire perché questo sia il caso, però; un approccio analogo sta funzionando per le mie chiamate HTTPS. È solo il WSS che mi sta facendo venire il mal di testa.

Potrebbe anche essere utile ricordare che è possibile riprodurlo in vari ambienti diversi, tra cui un'app per Android e all'interno di un contenitore di servlet Jetty.

Qualcuno ha utilizzato correttamente WSS con un certificato autofirmato? Ti va di fare un po 'di luce su quello che sto facendo male?

+0

A parte breve, qualcuno trova il codice di errore 'SSL_NULL_WITH_NULL_NULL' come incredibilmente disinvolto come faccio io?:) –

+0

'SSL_NULL_WITH_NULL_NULL' si riferisce quasi certamente alla suite di crittografia null, che non fornisce alcuna autenticazione o crittografia (e che non dovrebbe mai essere abilitata ...). – Bruno

+0

@Bruno: puoi approfondire questo? A giudicare dall'output di registrazione, la mia suite di crittografia è * qualsiasi * ma NULL (sembra che abbia decine di voci). –

risposta

5

Nel secondo blocco di codice non viene visualizzato alcun "errore". Questo è l'output normale per un SslContextFactory non configurato, che fornisce la suite di crittografia null e un verificatore del certificato che approva sempre. Vedere anche qui per ulteriori SslContextFactoryconfiguration.

Dai registri si lavora in entrambi i casi.

Per una risposta più generica alla domanda, quando si utilizzano i certificati autofirmati, è possibile configurare lo SslContextFactory con un archivio sicuro, in modo che la verifica del certificato possa utilizzarlo per verificare il certificato autofirmato.

Oltre a ciò, mi sembra che il codice sia stato impostato correttamente.

2

Non so molto di WebSocketClientFactory, ma per quanto ho capito, è per la configurazione lato client, dove si sta essenzialmente cercando di connettersi a un server configurato con un certificato autofirmato, una copia di cui è memorizzato nel tuo file custom.jks sul client.

Quello che serve per accettare un certificato autofirmato sul lato client non è quello di impostare il suo archivio di chiavi (che viene utilizzato per l'autenticazione del certificato client da questo lato), ma per impostare il suo truststore.

Provare a sostituire setKeyStore* con setTrustStore*.

Problemi correlati