Socket.IO:跨域请求被阻止:“同源策略”不允许读取远程资源

时间:2019-02-18 19:32:03

标签: ssl firefox socket.io cors

我在FF中遇到一个奇怪的问题,Chrome无法复制该问题:使用SSL连接时,与其他来源的websocket连接无法正常工作。

我的Rails应用程序正在https://wax.lvh.me:3000上运行,socket.io节点JS应用程序正在https://wax.lvh.me:3001上运行。当我尝试从FF中的Rails应用程序连接到套接字时,在浏览器的开发控制台中看到以下警告:

enter image description here

当我打开“网络”选项卡时,我看到以下响应标题-请注意,响应中没有访问控制标题:

enter image description here 我试图从其他SO答案中使用以下食谱:

将原点设置为this answer'*:*'

io = require('socket.io').listen(server)
io.set('origins', '*:*');

设置this answer中的函数的原点

io.origins (origin, callback) =>
  if origin.match(/lvh\.me/)
    return callback(null, true)

  callback('Origin not allowed', false)

但是到目前为止,没有任何东西可以帮助我解决此问题

请注意,访问控制标头已在Chrome中正确设置:

enter image description here

我使用以下浏览器和工具版本:

  • Firefox-63.0.3(64位)
  • Google Chrome浏览器-73.0.3683.39版(正式内部版本)测试版(64位)
  • Socket.io-2.2.0

您对如何在socket.io中为FF正确设置CORS有任何想法吗?

1 个答案:

答案 0 :(得分:0)

在我们的socket.io应用中使用CORS配置一切正常

问题出在SSL证书上:我们的配置缺少HTTPS服务器初始化中的ca(中间证书)选项。我们使用以下代码解决了该问题:

require('https').createServer({
  ca: fs.readFileSync(process.env.SSL_CA),         // this config was missing
  cert: fs.readFileSync(process.env.SSL_CERT),
  key: fs.readFileSync(process.env.SSL_KEY)
})

nodeJS create Secure Context documentation说:

  

ca string | string[] | Buffer | Buffer[]。 (可选)覆盖受信任的CA证书。默认设置是信任Mozilla策划的知名CA。使用此选项明确指定CA时,Mozilla的CA将被完全替换。该值可以是字符串或缓冲区,也可以是字符串和/或缓冲区数组。任何字符串或缓冲区都可以包含多个串联在一起的PEMCA。对等方的证书必须可链接到服务器信任的CA,以便对连接进行身份验证。当使用不可链接到知名CA的证书时,必须将证书的CA显式指定为受信任的证书,否则连接将无法通过身份验证。如果对等方使用与默认CA之一不匹配或不链接的证书,请使用ca选项提供对等方证书可以与之匹配或链接的CA证书。对于自签名证书,该证书是其自己的CA,必须提供。对于PEM编码的证书,支持的类型为“ TRUSTED CERTIFICATE”,“ X509 CERTIFICATE”和“ CERTIFICATE”。