在节点服务器上安装SSL证书

时间:2013-03-10 17:03:11

标签: node.js ssl socket.io

我创建了一个自签名证书,并将其安装在apache以及node.js(端口3000)上。在localhost上,https://localhosthttps://localhost:3000都可以正常运行。

因此,我购买了GoDaddy Standard SSL证书并将其安装在服务器上(http://gatherify.com)。现在https://gatherify.com运行良好,但节点上的ssl不起作用。 当我访问https://gatherify.com:3000时,我得到“连接被中断”。

我执行了curl:

root@host [~]# curl -v -s -k https://gatherify.com:3000
* About to connect() to gatherify.com port 3000 (#0)
*   Trying 108.160.156.123... connected
* Connected to gatherify.com (108.160.156.123) port 3000 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* warning: ignoring value of ssl.verifyhost
* NSS error -5938
* Closing connection #0
* SSL connect error

有任何解决此问题的建议吗?

更新 的 * 服务器端: *

var io = require('socket.io'), 
    connect = require('connect'), 
    fs = require('fs'),

var privateKey = fs.readFileSync('cert/server.key').toString();
var certificate = fs.readFileSync('cert/server.crt').toString();

var options = { 
    key: privateKey,
    cert: certificate
};

var app = connect(options).use(connect.static('../htdocs/node/'));
app.listen(3000);
var server = io.listen(app);

server.sockets.on('connection', function(socket) { 
console.log("Connected");
});

客户端:

<html> <head>

<script type = "text/javascript" src = "https://gatherify.com:3000/socket.io/socket.io.js"></script>

<script type = "text/javascript">

var socket = io.connect('https://gatherify.com:3000', {secure:true}); 

</script>

</head><body></body></html>

2 个答案:

答案 0 :(得分:3)

如果要在端口3000上运行带有(后面)HTTPS的node.js应用程序,则需要在端口443上设置代理服务以将HTTPS请求代理到端口3000。

你没有提到你现在在端口443上运行的服务器(是Apache吗?)但你可能想要

  1. 将该服务移至新端口(例如4000),然后在处理HTTPS的端口443上运行node http proxy
  2. 然后为您在端口3000上运行的node.js应用设置子域(例如blah.gatherify.com)。
  3. 然后,使用node http proxy,您将代理所有对“gatherify.com”发送到端口4000的请求,以及对“blah.gatherify.com”发送到端口3000的所有请求。
  4. 如果设置正确,用户可以访问“https://gatherify.com”或“https://blah.gatherify.com”(不使用:端口号),并且所有内容都使用SSL保护。 ;)

答案 1 :(得分:2)

安装证书客户端(在Node.js中)

如果您需要node.js客户端能够识别您自行分配或廉价购买的SSL证书,则可以使用ssl-root-cas available on npm

'use strict';

var https = require('https')
  , cas
  ;

// This will add the well-known CAs
// to `https.globalAgent.options.ca`
require('ssl-root-cas').inject();

cas = https.globalAgent.options.ca;

cas.push(fs.readFileSync(path.join(__dirname, 'ssl', '01-cheap-ssl-intermediary-a.pem')));
cas.push(fs.readFileSync(path.join(__dirname, 'ssl', '02-cheap-ssl-intermediary-b.pem')));
cas.push(fs.readFileSync(path.join(__dirname, 'ssl', '03-cheap-ssl-site.pem')));

这将使您的证书可用于核心https模块以及依赖它的模块,例如requestsocket.io-client,而不会删除正常的ssl证书(这是默认值)行为有些奇怪的原因)。