Клиент Socket.io на CloudFront (S3) не отправляет сертификат на сервер Node.js - PullRequest
0 голосов
/ 03 ноября 2019

Мы используем простейшую возможную реализацию клиента и сервера socket.io для устранения любых переменных, связанных с причиной этой проблемы. Клиент socket.io находится в JavaScript на AWS CloudFront с использованием собственного домена, а сервер находится на узле (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 голосов
/ 03 ноября 2019

«CloudFront отказывается передавать сертификат» не совсем точное описание того, что происходит. Клиентские сертификаты не могут быть «пропущены» через обратный прокси-сервер HTTP, такой как CloudFront, - по замыслу это невозможно, потому что это будет эквивалентно атаке «человек посередине». (Это также относится и к другим обратным прокси-серверам, таким как HAProxy в режиме HTTP и Amazon Application Load Balancer.)

Невозможно разделить TLS-соединение в середине по замыслу. Может показаться, что это то, что делает CloudFront, но это не так. Вместо этого CloudFront дешифрует полезную нагрузку с сервера (или клиента) и повторно шифрует ее для передачи клиенту (или серверу) ... и он может сделать это только потому, что существует два отдельных сеанса TLS, один от браузера до CloudFrontа другой - от CloudFront до сервера - CloudFront связывает между собой дешифрованные каналы полезной нагрузки внутри.

...