Как я могу настроить expressjs для обработки как http, так и https? - PullRequest
6 голосов
/ 26 октября 2011

Я искал stackoverflow и экспресс-группу Google, но у меня все еще не хватает.

Из того, что я понял, я могу сделать одну из двух вещей:

1)создайте экземпляр http-сервера и https-сервера и настройте их на прослушивание двух разных портов.В маршрутах перенаправьте запрос http на порт https.

//app
var app = express.createServer();
var app_secure = express.createServer({key: key, cert: cert});

app.listen(8080);
app_secure.listen(8443);

//routes
app.get("unsecure/path", function(req, res) {
  ...
}

app.get("secure/path", function(req, res) {
  res.redirect("https://domain" + req.path);
}

app_secure.get("secure/path", function(req, res) {
  res.send("secure page");
}

2) делайте то, что говорит TJ Hollowaychuk: https://gist.github.com/1051583

var http = require("http");
var https = require("https");
var app = express.createServer({key: key, cert: cert});

http.createServer(app.handle.bind(app)).listen(8080);
https.createServer(app.handle.bind(app)).listen(8443);

Когда я делаю 1, обычно естьНет проблем.Тем не менее, мне неудобно управлять двумя серверами, и я действительно считаю, что должен быть лучший способ.

Когда я делаю 2, я получаю следующее:

(узел SSL) ошибка: 1408A0C1:Подпрограммы SSL: SSL3_GET_CLIENT_HELLO: нет общего шифра

Конечно, я могу просто использовать вариант 1 по умолчанию, но я действительно очень хочу знать, почему я получаю «ошибку общего шифра», когда делаю вариант 2И вариант 2 будет моим предпочтительным маршрутом.

Ответы [ 2 ]

9 голосов
/ 14 июня 2012

Следуя комментарию @ypocat, вы можете включить https в своем приложении express.js следующим образом:

 var http = require('http');
 var https = require('https');
 var express = require('express');
 var fs = require('fs');

 var app = express.createServer();

 // cutomize your app as ususal
 app.configure( function () { ... });
 app.configure('production', function () { ... });
 // ....

 // attach express handler function to TWO servers, one for http and one for https
 http.createServer(app.handle.bind(app)).listen(8080);
 https.createServer({
   ca: fs.readFileSync('./server.ca-bundle'),
   key: fs.readFileSync('./server.key'),
   cert: fs.readFileSync('./server.crt')
 }, app.handle.bind(app)).listen(8081);

Обратите внимание, что вы должны получить server.ca-bundle, server.key и server.crt из центра сертификации.

Также, поскольку вы, вероятно, будете запускать узел без sudo, вам нужно убедиться, что порт 80 (http) и 443 (https) открыты

# in Ubuntu
sudo ufw status
sudo ufw allow 80
sudo ufw allow 443

и перенаправлять запросы на 8080 на 80 и с 8081 на 443 соответственно

# in Ubuntu
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8081

Надеюсь, это поможет

0 голосов
/ 26 октября 2011

Является ли ваш сертификат сертификатом RSA, а не сертификатом DSA? Похоже, что шифры, которые поддерживает ваш браузер, не поддерживаются вашим сервером nodejs - вам нужно обновить OpenSSL и перекомпилировать NodeJS?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...