Socket.io + SSL + самозаверяющий сертификат CA выдает ошибку при подключении
Я использую сервер https, используя сертификат, который был создан с использованием самозаверяющего сертификата 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 я могу указать CA, которым доверяю.
Как я могу подключить Socket.io в этом случае?
PS: я использую Node.js 0.10.0 и Socket.io 0.9.13.
4 ответа
Не используйте самозаверяющие сертификаты. Только не делайте этого, некоторые браузеры не позволяют принимать их при использовании WebSockets. И ты выглядишь как дешевый д * ск за то, что не купишь соответствующий сертификат
Из Они видят меня, Опыляют, они Хатин (с. 23). Презентация Арно Каземье (3rdEden), члена основной команды Socket.IO.
Четыре года спустя, но если вы захотите найти этот пост, как я, вам нужно заставить клиентский сокет не отвергать сертификат самозаверяющего сервера, который вам нужен rejectUnauthorized: false
как в
const socket = require('socket.io-client')('https://192.168.0.31', { transports: ['websocket'], rejectUnauthorized: false })
с https://github.com/socketio/engine.io-client
Кроме того, теперь есть хороший источник бесплатных сертификатов, так что теперь вам даже не нужно быть "дешевым д * кк" https://letsencrypt.org/
Для socket.io 1.0 (не уверен, что около 0.9), есть подробности о том, как заставить клиент узла подключиться к неверному сертификату здесь: /questions/1745538/nastrojte-svyaz-mezhdu-serverom-i-serverom-po-protokolu-ssl-s-pomoschyu-socketio-v-fajle-nodejs/1745550#1745550. (Благодаря комментарию @3rdEden выше.) Я считаю, что самозаверяющие SSL-сертификаты могут быть удобны для серверов разработки.
Проверьте здесь о том, как использовать самозаверяющие сертификаты для Certificate Signing Request
, Чтобы разрешить подключения с использованием самозаверяющих сертификатов, необходимо указать следующее:
- ключ: строка или буфер, содержащий закрытый ключ клиента в формате PEM.
- cert: строка или буфер, содержащий ключ сертификата клиента в формате PEM.
- 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});