CloudFront(S3)客户端上的Socket.io不会将证书发送到Node.js服务器

时间:2019-11-03 09:36:41

标签: node.js socket.io certificate amazon-cloudfront

我们正在使用socket.io客户端和服务器的最简单的实现,以消除与导致此问题的原因有关的所有变量。 socket.io客户端使用自定义域在AWS CloudFront上的JavaScript中,而服务器在节点(nginx)上。我们正在获得安全的连接,除CloudFront拒绝通过证书外,其他所有操作均按预期进行。这是我们从socket.io获得的有关连接的信息:

accept: '*/*',
     origin: 'https://cdn.ourdomain.com',
     'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',
     'sec-fetch-site': 'same-site',
     'sec-fetch-mode': 'cors',
     referer: 'https://cdn.ourdomain.com/ourapp.iframe.html',
     'accept-encoding': 'gzip, deflate, br',
     'accept-language': 'en-US,en;q=0.9',
     cookie: '_ga=GA1.2.245674994.1569802743; __zlcmid=uXiZmTTN1V8j16; _gcl_au=1.1.312077107.1570950743; _gid=GA1.2.851127118.1572308315; __gads=ID=a55ec67b74740d6a:T=1572647855:S=ALNI_MYuzmlVp2hvDIbUS5LuYBD4kYKHlA; io=gkqtOKgx38ddpH6dAAAA; _gat=1' },
  time: 'Sat Nov 02 2019 07:41:25 GMT+0000 (UTC)',
  address: '::ffff:127.0.0.1',
  xdomain: true,
  secure: true,
  issued: 1572680485150,
  url: '/ourapp-secure-connection/socket.io/?EIO=3&transport=polling&t=Muh3xpR',
  query: { EIO: '3', transport: 'polling', t: 'Muh3xpR' } }
Client connected [id=LKTQbOl3_DdAJeH5AAAB, cert={}]

除cert = {}外,我们尝试过的所有操作均未返回任何内容。我已经在AWS文档中看到了一些有关CloudFront删除自定义证书请求的参考。有没有人找到解决方法?

1 个答案:

答案 0 :(得分:0)

“ CloudFront拒绝通过证书” 并不是对正在发生的事情的完全准确的描述。不能通过像CloudFront这样的HTTP反向代理“传递”客户端证书-在设计上是不可能的,因为这等效于中间人攻击。 (其他反向代理也是如此,例如HTTP模式下的HAProxy和Amazon Application Load Balancer。)

根据设计,您不能在中间断开TLS连接。看起来这是CloudFront所做的,但事实并非如此。相反,CloudFront正在解密来自服务器(或客户端)的有效负载,然后将其重新加密以传输到客户端(或服务器)...并且它之所以能这样做,是因为有两个单独的TLS会话,一个是从浏览器到CloudFront的另一个从CloudFront到服务器-CloudFront在内部将解密的有效负载管道捆绑在一起。