【发布时间】:2016-08-12 03:09:44
【问题描述】:
我有一个使用 非-自签名证书的 node.js https 服务器。我相信他们来自godaddy,但不确定。我的雇主只向我提供了密钥和证书文件。
服务器:
var fs = require('fs')
, server = require('https').createServer({
key: fs.readFileSync( __dirname + "/key.pem" ),
cert: fs.readFileSync(__dirname + "/cert.pem" )
})
, WebSocketServer = require('ws').Server
, webSocketServer = new WebSocketServer({
server: server,
})
, port = 8080;
server.listen(port, function(){ console.log('Listening on ' + server.address().port) });
客户:
var webSocket = new WebSocket('wss://my.website.com:8080');
此代码在桌面 chrome、safari 和 firefox 上按预期工作。客户端能够连接到安全的 websocket。但是,在 iOS 9.3.1 Safari 上尝试会出现以下错误:
The operation couldn't be completed.(OSStatus error -9807.)
OSStatus 告诉我这是由无效的证书链引起的。不幸的是,这就是我对 SSL 的了解开始消退的地方。在进行了一些额外的谷歌搜索后,我尝试了https.createServer() 接受的以下选项的多种组合:
secureProtocol: "SSLv3_method",
rejectUnauthorized: false,
ciphers: 'ECDHE-RSA-AES256-SHA:AES256-SHA:RC4-SHA:RC4:HIGH:!MD5:!aNULL:!EDH:!AESGCM',
honorCipherOrder: true,
requestCert: false
到目前为止,它们都没有奏效。我还看到了ca 选项(证书颁发机构),但我不仅不知道在哪里可以找到这个文件,网上的所有示例都表明这仅用于自签名证书?
非常感谢任何帮助,谢谢!
【问题讨论】:
-
iOS 9 仅接受使用 SHA-256 哈希签名的证书。因此,问题很可能出在您的雇主给您的证书文件上。要求他们使用 SHA-256 而不是 SHA-1 生成新证书并提供新证书。
-
检查了 chrome 中的证书:
*.website.com在Go Daddy Secure Certificate Authority - G2下,在Go Daddy Root Certificate Authority - G2下。所有这三个都列出了SHA-256 with RSA Encryption在Issuer Name > Signature Algorithm下和RSA Encryption在Public Key Info > Algorithm下。我还应该提到,这个相同的证书用于一个完全独立的 rails 服务器,该服务器为客户端代码提供服务,然后尝试连接到 websocket。页面加载正常,但与 websocket 的连接失败。 -
好的 - 除了查看这个类似的问题和答案之外,我没有任何其他建议,看看那里的建议是否有帮助:stackoverflow.com/questions/4014055/… 从另一个线程 - 确保你正在使用与证书签署的完全相同的主机和域进行连接(即确保证书是为 my.website.com 签署的,而不仅仅是 website.com)
标签: ios node.js ssl websocket safari