2013-03-12 3 views
6

Я запускаю сервер https, используя сертификат, созданный с использованием самоподписанного сертификата ЦС.Socket.io + SSL + самоподписанный сертификат CA дает ошибку при подключении

Теперь я хочу подключить клиент Socket.io к серверу Socket.io, который подключен к серверу https. К сожалению, я получаю сообщение об ошибке, говоря мне:

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) 

В основном, эта ошибка говорит мне о том, что сертификат не может быть проверен успешно. Это связано с тем, что соответствующий сертификат CA самоподписан. При использовании запроса https я могу указать CAs, которым я доверяю.

Как я могу подключить Socket.io в этом случае?

PS: Я запускаю Node.js 0.10.0 и Socket.io 0.9.13.

ответ

-5

Не использовать самостоятельно подписанные сертификаты. Просто не делайте этого, некоторые браузеры не дают вам возможности принимать их при использовании WebSockets. И вы выглядите как дешевый d * ck для того, чтобы не покупать соответствующий сертификат.

От They see me pollin, they hatin (p. 23). Презентация Arnout Kazemier (3rdEden), основного члена команды Socket.IO.

+0

Хорошо, это отвечает на вопрос о том, почему это не поддерживается. Спасибо, что указали это! (Хотя я думаю, что его взгляд здесь немного узкий) –

+7

так как это решает проблемы разработки/постановки? Я должен купить сертификат для всех моих промежуточных серверов, Vagrant VM и производственные серверы? –

+8

Node.js 0.10 настроен на автоматическое отклонение SSL-сертификатов, которые самоподписаны. Вы можете «отменить» это для разработки, добавив следующую переменную ENV: «NODE_TLS_REJECT_UNAUTHORIZED = 0' Кроме того, да, у меня есть узкий когда речь заходит о SSL;) Но, как вы могли убедиться, самозаверяющие сертификаты вызывают много проблем, n быть предотвращено с надлежащим сертификатом. Что касается разработки/постановки, купите подстановочный знак ssl cert или отредактируйте свой '/ etc/hosts'? ;) – 3rdEden

0

Проверка here о том, как использовать самоподписанные сертификаты для Certificate Signing Request. Вы должны указать следующее, чтобы разрешить подключения с использованием самоподписанных сертификатов:

  1. ключ: строка или буфер, содержащий закрытый ключ клиента в формате PEM.
  2. cert: строка или буфер, содержащий ключ сертификата клиента в формате PEM.
  3. ca: массив строк или буферов доверенных сертификатов. Если это опущено, будут использоваться несколько известных «корневых» ЦС, таких как VeriSign. Они используются для авторизации соединений.

Чтобы создать самостоятельно подписанный сертификат с CSR, сделайте следующее:

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

В клиенте сокет должен быть использован в качестве

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

Это именно то, что я сделал, но это не работает. Я всегда получаю ошибку * UNABLE_TO_VERIFY_LEAF_SIGNATURE * (я пытаюсь подключиться с помощью socket.io-client из Node.js, а не из браузера). Мне понадобилась возможность рассказать о Socket.io программно, какие сертификаты CA прекрасны. Как кажется, такая возможность отсутствует. SockJS ведет себя одинаково, и эта возможность также отсутствует :-( –

+0

Этот ответ не отвечает на вопрос о том, как получить корректный самоподписанный сертификат для правильной работы в NodeJS. –

2

Для socket.io 1.0 (не уверен около 0.9) есть сведения о том, как заставить клиент узла подключаться к недействительному сертификату здесь: https://stackoverflow.com/a/24235426. (Спасибо за комментарий @ 3rdEden выше.) Я считаю, что самоподписанные SSL-сертификаты могут быть удобны для серверов разработки.

1

спустя четыре года, но и для любого нахождения этот пост, как я, если вам нужно, чтобы заставить сокет клиента, чтобы не отвергать самоподписанное сервер серт вам нужно rejectUnauthorized: false как в const socket = require('socket.io-client')('https://192.168.0.31', { transports: ['websocket'], rejectUnauthorized: false }) от https://github.com/socketio/engine.io-client#methods

также есть теперь хороший источник для бесплатных сертификатов, поэтому теперь вам даже не нужно быть «дешевым d * ck» https://letsencrypt.org/

+0

Just обнаружил, что rejectUnauthorized сам ... Работает с любым websocket, а не только сокет. Wii также решает проблемы с сертификатами других пользователей (если вам действительно не нужна высокая защита при подключении ssl) – Yitzchak

Смежные вопросы