4

我创建了一个自签名证书并将其安装在 apache 和 node.js(端口 3000)上。在本地主机上都https://localhost运行https://localhost:3000良好。

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

我执行了卷曲:

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>
4

2 回答 2

3

如果你想在 3000 端口上运行一个 node.js 应用程序(在 HTTPS 之后),那么你需要在 443 端口上设置一个代理服务来将 HTTPS 请求代理到 3000 端口。

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

  1. 将该服务移动到一个新端口(例如 4000),然后在端口 443 上运行一个节点 http 代理来处理 HTTPS。
  2. 然后为您在端口 3000 上运行的 node.js 应用程序设置一个子域(例如 blah.gatherify.com)。
  3. 然后,使用node http proxy,您将对“gatherify.com”发出的所有请求代理到端口 4000,并将对“blah.gatherify.com”发出的所有请求代理到端口 3000。

一切设置正确后,用户可以访问“ https://gatherify.com ”或“ https://blah.gatherify.com ”(不使用 :port 号),所有这些都将使用 SSL 进行保护。;)

于 2014-02-08T04:35:05.107 回答
2

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

如果你需要一个 node.js 客户端来识别你自己分配或廉价购买的 SSL 证书,你可以使用ssl-root-cas,它可以在 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模块以及依赖它的模块,例如request并且socket.io-client不删除正常的 ssl 证书(出于某种奇怪的原因,这是默认行为)。

于 2014-04-25T21:45:47.933 回答