如何创建Node.js SSL服务器?

7

Nodejs版本:0.8.6
我使用以下命令使用OpenSSL创建了一个SSL CSR文件: openssl req -nodes -newkey rsa:2048 -keyout myserver.key -out myserver.csr

  • CSR内容已发送给我的SSL提供商,证书已返回。

现在我想创建一个SSL安全服务器:

var fs = require("fs");
var https = require('https');
var credentials = {
            key: fs.readFileSync(options.base_project_folder + 'privatekey.pem'),
            cert: fs.readFileSync(options.base_project_folder + 'certificate.pem')
};
var server = https.createServer(credentials, app);
server.listen(port, address, function() {
    var addr = this.address();
    console.log('listening on %s:%d', addr.address, addr.port);
});

服务器正在运行,但我收到了“SSL连接错误”

尝试检查问题我做了: openssl s_client -connect my_dns:443 // 当然,my_dns指向我的nodejs服务器

结果: CONNECTED(00000003) 139813382997664:错误:140790E5:SSL例程:SSL23_WRITE:ssl握手失败:s23_lib.c:177:
没有可用的对等证书
未发送客户端证书CA名称
SSL握手已读取0个字节并写入226个字节
新(无),密码是(无)
不支持安全重新协商
压缩:无
扩展:无

有人能帮我吗?我在SSL黑暗中迷失了 :(


您发布的服务器代码不完整。要么您还没有发布其余部分(如果是这样,请一并发布),要么您缺少创建Node中实际HTTPS服务器所需的关键部分。 - robertklep
我修改了代码,希望这能帮助找到我的问题。 - IdanHen
而且 port 等于 443,对吗? - robertklep
是的,我监听端口443。 - IdanHen
3个回答

8
尝试像这样添加CA:
var credentials = {
  key: fs.readFileSync(options.base_project_folder + 'privatekey.pem'),
  cert: fs.readFileSync(options.base_project_folder + 'certificate.pem'),
  ca: fs.readFileSync(/path/to/CA/cert)
};

文档说,options参数类似于tls.createServer


1
什么是CA文件? 它的内容是什么?我试图找到它的答案:( - IdanHen
1
发现了问题,我的文件出了问题,我还需要 CA :) - IdanHen
1
我在另一个答案的评论中发现的http://www.benjiegillam.com/2012/06/node-dot-js-ssl-certificate-chain/有一个重要的观点。在较新版本的Node中,“ca”属性将不会接受捆绑文件;如果您有多个中间证书,必须将它们单独加载到数组中,并将“ca”属性设置为该数组。 - lawrence

1

+1 我同意问题很可能是缺少 CA 证书。 - talentedmrjones

0

如何通过Cloudflare实现这个功能?

使用明显的SSL凭据创建您的websocket.js文件。

var https = require('https');
var credentials = {
            key: fs.readFileSync('/location/to/privatekey.pem'),
            cert: fs.readFileSync(/location/to/certificate.pem')
};
var server = https.createServer(credentials, app);

1) 注册Cloudflare账户

2) 将您的域名DNS服务器指向Cloudflare NS服务器

3) 生成一个源证书并将私钥和证书保存到您的服务器privatekey.pem和certificate.pem文件中

4) 确保您在websocket中使用SSL端口,并且您的路由器防火墙允许此端口。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接