Saya mencoba menjalankan socket.io dengan sertifikat SSL saya, namun itu tidak akan terhubung.
Saya mendasarkan kode saya pada contoh obrolan:
var https = require('https');
var fs = require('fs');
/**
* Bootstrap app.
*/
var sys = require('sys')
require.paths.unshift(__dirname + '/../../lib/');
/**
* Module dependencies.
*/
var express = require('express')
, stylus = require('stylus')
, nib = require('nib')
, sio = require('socket.io');
/**
* App.
*/
var privateKey = fs.readFileSync('../key').toString();
var certificate = fs.readFileSync('../crt').toString();
var ca = fs.readFileSync('../intermediate.crt').toString();
var app = express.createServer({key:privateKey,cert:certificate,ca:ca });
/**
* App configuration.
*/
...
/**
* App routes.
*/
app.get('/', function (req, res) {
res.render('index', { layout: false });
});
/**
* App listen.
*/
app.listen(443, function () {
var addr = app.address();
console.log(' app listening on http://' + addr.address + ':' + addr.port);
});
/**
* Socket.IO server (single process only)
*/
var io = sio.listen(app,{key:privateKey,cert:certificate,ca:ca});
...
Jika saya menghapus kode SSL itu berjalan dengan baik, namun dengan itu saya mendapatkan permintaan untuk http://domain.com/socket.io/1/?t=1309967919512
Perhatikan itu tidak mencoba https, yang menyebabkannya gagal.
Saya menguji pada chrome, karena itu adalah browser target untuk aplikasi ini.
Saya minta maaf jika ini adalah pertanyaan sederhana, saya seorang pemula node / socket.io.
Terima kasih!
Jawaban:
Gunakan URL aman untuk koneksi awal Anda, yaitu sebagai ganti "http: //" use "https: //". Jika transport WebSocket dipilih, maka Socket.IO harus secara otomatis menggunakan "wss: //" (SSL) untuk koneksi WebSocket juga.
Perbarui :
Anda juga dapat mencoba membuat koneksi menggunakan opsi 'aman':
sumber
{secure: true}
seharusnya tidak diperlukan jika Anda menentukan 'https' di url. Berikut adalah kutipan dari sumber klien socket.iosecure: 'https' == uri.protocol
(versi 0.9.16), ini menetapkan opsi aman untuk true jika https terdeteksi di url.{secure: true}
tidak diperlukan untuk berfungsi dengan benar.Beginilah cara saya mengaturnya dengan express:
Saya berharap ini akan menghemat waktu seseorang.
Pembaruan: bagi yang menggunakan memungkinkan enkripsi gunakan ini
sumber
var server = https.createServer({ key: fs.readFileSync('/etc/letsencrypt/live/domain.name/privkey.pem'), cert: fs.readFileSync('/etc/letsencrypt/live/domain.name/cert.pem'), ca: fs.readFileSync('/etc/letsencrypt/live/domain.name/chain.pem'), requestCert: false, rejectUnauthorized: false },app); server.listen(3000);
Pada catatan yang sama, jika server Anda mendukung keduanya
http
danhttps
Anda dapat terhubung menggunakan:untuk secara otomatis mendeteksi skema browser dan terhubung menggunakan http / https sesuai. ketika di https, transpor akan diamankan secara default, seperti menghubungkan menggunakan
akan menggunakan soket web yang aman -
wss://
({secure: true}
berlebihan).untuk informasi lebih lanjut tentang cara melayani http dan https dengan mudah menggunakan server simpul yang sama, periksa jawaban ini .
sumber
Jika file sertifikat server Anda tidak tepercaya, (misalnya, Anda dapat membuat sendiri keystore dengan perintah keytool di java), Anda harus menambahkan opsi tambahan rejectUnauthorized
sumber
periksa konfigurasi ini ..
sumber
Sisi server:
Sisi klien:
sumber
Tergantung pada kebutuhan Anda, Anda dapat mengizinkan koneksi aman dan tidak aman dan masih hanya menggunakan satu contoh Socket.io.
Anda cukup menginstalasi dua server, satu untuk HTTP dan satu untuk HTTPS, kemudian melampirkan server-server itu ke instance Socket.io.
Sisi server :
Sisi klien :
Jika server NodeJS Anda berbeda dari server Web Anda, Anda mungkin perlu mengatur beberapa header CORS. Jadi di sisi server, ganti:
Dengan:
Dan tentu saja menyesuaikan nilai header sesuai dengan kebutuhan Anda.
sumber
Untuk aplikasi perusahaan, harus dicatat bahwa Anda tidak boleh menangani https dalam kode Anda. Itu harus otomatis ditingkatkan melalui IIS atau nginx. Aplikasi seharusnya tidak tahu tentang protokol apa yang digunakan.
sumber
Ini adalah file konfigurasi nginx saya dan kode iosocket. Server (express) mendengarkan pada port 9191. Ia bekerja dengan baik: file konfigurasi nginx:
Server:
Klien (bereaksi):
sumber