带有 express 的 socket.io 中的 SSL:缺少 PFX 或证书 + 私钥。

Posted

技术标签:

【中文标题】带有 express 的 socket.io 中的 SSL:缺少 PFX 或证书 + 私钥。【英文标题】:SSL in socket.io with express: Missing PFX or certificate + private key. 【发布时间】:2016-01-24 20:59:35 【问题描述】:

我想通过 SSL 与 socket.io 连接。 我已阅读其他答案,但没有任何效果

这是我的代码:

var ssl_options = 
    key : fs.readFileSync(my_key_path),
    cert : fs.readFileSync(my_cert_path)
;

var protocol = "https";

preparedApp = require(protocol).createServer(ssl_options,app);

var io = require('socket.io')(preparedApp);

preparedApp.listen(8080, function());
io.on('connection', function(socket));

这是我的 ssl_options 的日志...

 key: <Buffer 41 ...>,
 cert: <Buffer 4a ...> 

此错误与标题 throw new Error('Missing PFX or certificate + private key.'); 中的错误有关。有谁知道可能会发生什么?这个答案的其他解决方案都没有解决我的问题。

【问题讨论】:

【参考方案1】:

为您的私钥使用 PEM (RSA) 格式。检查私钥是否为 base64 编码,包含在“-----BEGIN RSA PRIVATE KEY-----”和“-----END RSA PRIVATE KEY-----”之间

来自文档:

key:一个字符串或Buffer,包含PEM格式的服务器私钥 cert : 保存 PEM 编码证书的字符串 passphrase:私钥或 pfx 的密码字符串 [可选默认值:null]

pfx : 保存 PFX 或 PKCS12 编码的私钥、证书和 CA 证书的字符串或缓冲区

要将私钥转换为 RSA PEM:openssl rsa -in &lt;PATH TO KEY&gt; -out key.pem -outform PEM

要创建 PKCS #12 捆绑包,请使用 openssl pkcs12 -export -in cert.pem -inkey key.pem -certfile ca.pem -out host.pfx

-- 添加--

为了确保证书是 PEM 编码运行 openssl x509 -in &lt;PATH TO CERT&gt; -out cert.pem -outform PEM

【讨论】:

基本上,我使用您告诉我的命令将我的 .key 变成了 .pem。之后我将代码更改为var ssl_options = key : fs.readFileSync(my_pem_path), (is in .pem) cert : fs.readFileSync(my_cert_path) (is in .crt) ;,但仍然失败并出现相同的错误。有什么想法吗? 尝试将 crt 编码为 pem。请参阅我的答案。 将 cert.pem 文件以 -----BEGIN CERTIFICATE-----? 开头? 请参阅gist.github.com/mawi12345/836ef502529b8d6e6366 以获取工作示例。尝试用您的密钥替换此示例中的密钥文件。也许错误在您的代码中的其他地方。 用我的例子测试有什么进展吗?

以上是关于带有 express 的 socket.io 中的 SSL:缺少 PFX 或证书 + 私钥。的主要内容,如果未能解决你的问题,请参考以下文章

带有 socket.io 和 express 的 Websocket

无法从带有 Socket.IO 的 cookie 中获取 Express 会话 ID

带有快递的socket.io

Express 4.0 中的 Heroku socket.io 示例错误

ExpressJS - 带有路由分离的 Socket.IO

在 KrakenJS/Express 中加载 socket.io 作为模块