2013-03-12 15 views
6

Sto eseguendo un server https utilizzando un certificato che è stato creato utilizzando un certificato CA autofirmato.Il certificato Socket.io + SSL + autofirmato della CA fornisce un errore durante la connessione

Ora voglio connettere il client Socket.io al server Socket.io che è collegato al server https. Purtroppo, ottengo un errore, dicendomi:

Error: UNABLE_TO_VERIFY_LEAF_SIGNATURE 
    at SecurePair.<anonymous> (tls.js:1271:32) 
    at SecurePair.EventEmitter.emit (events.js:92:17) 
    at SecurePair.maybeInitFinished (tls.js:883:10) 
    at CleartextStream.read [as _read] (tls.js:421:15) 
    at CleartextStream.Readable.read (_stream_readable.js:293:10) 
    at EncryptedStream.write [as _write] (tls.js:330:25) 
    at doWrite (_stream_writable.js:211:10) 
    at writeOrBuffer (_stream_writable.js:201:5) 
    at EncryptedStream.Writable.write (_stream_writable.js:172:11) 
    at write (_stream_readable.js:547:24) 
    at flow (_stream_readable.js:556:7) 

In sostanza, questo errore mi dice che il certificato non è stato possibile verificare con successo. Ciò è dovuto al fatto che il certificato CA corrispondente è autofirmato. Quando si utilizza una richiesta https, posso specificare le CA di cui mi fido.

Come posso fare in modo che Socket.io si connetta in questo caso?

PS: Sto eseguendo Node.js 0.10.0 e Socket.io 0.9.13.

risposta

-5

Non utilizzare auto certi fi cati firmati. Semplicemente no, alcuni browser non ti danno modo di accettarli quando usi WebSockets. E sembri un d * ck a buon mercato per non comprare un certificato adeguato.

Da They see me pollin, they hatin (p. 23). Una presentazione di Arnout Kazemier (3rdEden), membro del team principale di Socket.IO.

+0

Ok, questo risponde alla domanda del perché Non è supportato, grazie per averlo indicato (anche se penso che la sua vista sia un po 'stretta) –

+7

, quindi, come risolve i casi di sviluppo/sceneggiatura? Devo comprare un certificato per tutti i miei server di staging, Vagrant VMs e server di produzione? –

+8

Node.js 0.10 è stato configurato per rifiutare automaticamente i certificati SSL autofirmati. È possibile "annullare" questo per lo sviluppo aggiungendo la seguente variabile ENV: 'NODE_TLS_REJECT_UNAUTHORIZED = 0' Inoltre, sì, ho uno stretto vista quando si tratta di SSL;) Ma come potreste aver provato, i certificati autofirmati causano un sacco di problemi che ca essere prevenuto con un certificato adeguato Per quanto riguarda lo sviluppo/la messa in scena, acquista un ssl cert jolly o modifica il tuo/etc/hosts'? ;) – 3rdEden

0

Controllare here su come utilizzare i certificati autofirmati per Certificate Signing Request. È necessario specificare quanto segue per consentire le connessioni utilizzando i certificati autofirmati:

  1. chiave: una stringa o un buffer contenente la chiave privata del client in formato PEM.
  2. cert: una stringa o un buffer contenente la chiave del certificato del client in formato PEM.
  3. ca: una matrice di stringhe o buffer di certificati attendibili. Se questo viene omesso, verranno utilizzate diverse CA "root" ben note, come VeriSign. Questi sono usati per autorizzare le connessioni.

Per creare un certificato auto-firmato con il CSR, fare questo:

openssl x509 -req -in ryans-csr.pem -signkey ryans-key.pem -out ryans-cert.pem 

Nel client la presa deve essere usato come

var socket = io.connect('https://localhost', {secure: true}); 
+0

Questo è esattamente quello che ho fatto, ma non funziona. Ricevo sempre un errore * UNABLE_TO_VERIFY_LEAF_SIGNATURE * (Sto provando a connettermi usando socket.io-client da Node.js, non dal browser). Quello di cui avevo bisogno era una possibilità di dirlo a Socket.io a livello di codice quali certificati CA vanno bene. A quanto pare, manca una tale possibilità. SockJS si comporta allo stesso modo, e manca anche questa possibilità :-( –

+0

Questa risposta non risponde alla domanda su come ottenere un valido certificato autofirmato per funzionare correttamente in NodeJS. –

2

Per socket.io 1.0 (non sono sicuro di 0.9), ci sono dettagli su come ottenere il client del nodo per connettersi a un certificato non valido qui: https://stackoverflow.com/a/24235426. (Grazie al commento di @ 3rdEden sopra.) Trovo che i certificati SSL autofirmati possano essere utili per i server di sviluppo.

1

quattro anni più tardi, ma per qualsiasi risultato questo post come me se avete bisogno di forzare socket client di non respingere un server auto-firmato cert è necessario rejectUnauthorized: false come in const socket = require('socket.io-client')('https://192.168.0.31', { transports: ['websocket'], rejectUnauthorized: false }) da https://github.com/socketio/engine.io-client#methods

anche ora c'è una buona fonte per certificati gratuiti quindi ora non devi nemmeno essere "a buon mercato d * ck" https://letsencrypt.org/

+0

Just trovato che respinto da me stesso autorizzato ... Funziona con qualsiasi websocket, non solo socket.io. Anche Wii risolve i problemi con altri certificati (se non hai davvero bisogno di una protezione elevata con la tua connessione SSL) – Yitzchak

Problemi correlati