2011-10-26 36 views
6

Tôi đã xóa bỏ stackoverflow và nhóm google express, nhưng tôi vẫn sắp tới.Tôi làm cách nào để định cấu hình expressj để xử lý cả http và https?

Từ những gì tôi thu thập, tôi có thể làm một trong hai điều:

1) tạo ra một thể hiện của một máy chủ http và một máy chủ https và đặt hai để nghe hai cổng khác nhau. Trong các tuyến đường, chuyển hướng yêu cầu http đến cổng 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) làm những gì TJ Hollowaychuk nói: 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); 

Khi tôi làm 1, có nói chung là không có vấn đề. Tuy nhiên, nó cảm thấy clunky để quản lý hai máy chủ và tôi thực sự cảm thấy như có nên là một cách tốt hơn.

Khi tôi làm 2, tôi có được điều này:

(nút SSL) lỗi: 1408A0C1: thói quen SSL: SSL3_GET_CLIENT_HELLO: không chia sẻ mật mã

Tất nhiên, tôi chỉ có thể mặc định tùy chọn 1, nhưng tôi thực sự, thực sự muốn biết tại sao tôi nhận được rằng "không có lỗi mật mã được chia sẻ" khi tôi làm tùy chọn 2. Và tùy chọn 2 sẽ là tuyến đường ưa thích của tôi.

+0

tôi đã kết thúc sử dụng Nginx để xử lý SSL. @Benjie Chứng chỉ là RSA. Tôi sẽ đưa ra đề nghị của bạn một thử trong tương lai gần. Cảm ơn. – ant

+0

Bạn có thể chỉ cho bạn cách cấu hình nginx để xử lý ssl cho nút không? Cảm ơn – Mamsaac

+0

Thing là bạn không làm những gì mà TJ đã nói - gần như, nhưng không chính xác. Các tùy chọn https cần phải đi đến máy chủ https, không phải đến máy chủ express.createServer. Sau đó, nó hoạt động. Tuy nhiên nhận được nó sau đó để làm việc với một máy chủ websocket là một vấn đề hoàn toàn :) – youurayy

Trả lời

-1

Chứng chỉ của bạn có phải là chứng chỉ RSA thay vì chứng chỉ DSA không? Có vẻ như các thuật toán mã hóa mà trình duyệt của bạn hỗ trợ không được máy chủ nodejs hỗ trợ - bạn cần phải cập nhật OpenSSL và biên dịch lại NodeJS?

9

Sau @ypocat 's bình luận bạn có thể bật https trong ứng dụng express.js của bạn như vậy

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); 

Lưu ý rằng bạn sẽ nhận được server.ca-bó, server.key và server.crt từ một chứng chỉ thẩm quyền.

Cũng như có thể bạn sẽ chạy nút mà không cần sudo bạn cần phải chắc chắn cổng 80 (http) và 443 (https) được mở

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

và để chuyển tiếp các yêu cầu trên 8080-80 và 8081-443 lượt

# 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 

Hope this helps

Các vấn đề liên quan