Резюме: мы обслуживаем DApp Ethereum с веб-сервера через HTTPS. DApp подключается к узлу Ethereum через JSON RPC с использованием web3.js, который использует HTTP (не HTTPS). Как поступить с этим по-хорошему?
Хорошей практикой является предоставление веб-контента через HTTPS, поэтому наше приложение обслуживается, например, с https://myhost/ . Браузеры применяют практику HTTPS до такой степени, что, когда сайт/приложение обслуживается через HTTPS, браузер требует, чтобы любые дальнейшие подключения, сделанные приложением (включая XMLHTTPRequests, выполняемые web3.js), также загружались через HTTPS.
Следовательно, когда приложение обслуживается через HTTPS, браузер блокирует вызовы к узлу Ethereum (которые всегда являются HTTP) из-за ошибки «смешанного содержимого». Протестировано на последних версиях Chrome/Windows, но я думаю, что другие браузеры дадут тот же результат. В принципе, хорошо, что браузер это делает.
Насколько мне известно, текущие реализации Ethereum не имеют функций для обслуживания конечной точки JSON RPC через HTTPS. Следовательно, это можно обойти, обернув соединение JSON RPC в HTTPS, например, создав небольшую службу Node.js.
Что я хочу знать, так это то, как другие справляются с этой ситуацией, и, возможно, есть более простое решение, чем предложенный обходной путь, который я пропустил?
Пример сообщения об ошибке «Смешанное содержимое»:
Mixed Content: The page at 'https://myhost/user/login' was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint 'http://blockchain:8101/'. This request has been blocked; the content must be served over HTTPS.
HttpProvider.send @ httpprovider.js:77
finishedWithRewrite @ hooked-web3-provider.js:72
rewritePayloads @ hooked-web3-provider.js:107
next @ hooked-web3-provider.js:117
rewritePayloads @ hooked-web3-provider.js:122
send @ hooked-web3-provider.js:75
RequestManager.send @ requestmanager.js:73
Method.send @ method.js:168
SolidityFunction.call @ function.js:112
SolidityFunction.execute @ function.js:212
(anonymous function) @ VM6322:2
InjectedScript._evaluateOn @ VM6122:875
InjectedScript._evaluateAndWrap @ VM6122:808
InjectedScript.evaluate @ VM6122:664
Для web3.js это представляет собой ошибку подключения:
Uncaught Error: CONNECTION ERROR: Couldn't connect to node http://blockchain:8101, is it running?
at Object.module.exports.InvalidConnection (https://myhost/vendors/web3/dist/web3.js:3051:16)
at HookedWeb3Provider.HttpProvider.send (https://myhost/vendors/web3/dist/web3.js:4119:22)
at finishedWithRewrite (https://myhost/js/lib/hooked-web3-provider.js:72:91)
at HookedWeb3Provider.rewritePayloads (https://myhost/js/lib/hooked-web3-provider.js:107:18)
at next (https://myhost/js/lib/hooked-web3-provider.js:117:25)
at HookedWeb3Provider.rewritePayloads (https://myhost/js/lib/hooked-web3-provider.js:122:18)
at HookedWeb3Provider.send (https://myhost/js/lib/hooked-web3-provider.js:75:21)
at RequestManager.send (https://myhost/vendors/web3/dist/web3.js:5757:32)
at Method.send (https://myhost/vendors/web3/dist/web3.js:4898:59)
at SolidityFunction.call (https://myhost/vendors/web3/dist/web3.js:3915:31)
Обратите внимание, что я использую HookedWeb3Provider
, но поскольку способ подключения web3.js к узлу идентичен, я не ожидаю, что это будет иметь какое-либо значение.
В настоящее время используется web3.js 0.13.0.
Ответ - нет. Теперь я знаю, что вы, вероятно, не хотите это слышать, но HTTP JSON RPC никогда не предназначался для использования таким образом, чтобы он был доступен извне. RPC был создан для того, чтобы вы могли разрабатывать на своем собственном локальном узле, используя свой собственный браузер.
Я предлагаю вам настроить прокси-сервер, который будет передавать все запросы локально работающему узлу Эфириума, вместо того, чтобы позволить всем напрямую взаимодействовать с самим узлом Эфириума. Это даст вам контролируемый доступ и HTTPS.
Масштабируемая, отказоустойчивая и безопасная среда для узлов Go-Ethereum: защита Go Ethereum (узлов Geth) в производственной среде с поддержкой JSON RPC с использованием HTTPS и NGINX
Пример конфигурации NGINX:
http { upstream nathanawgethnodes { сервер 127.0.0.1:8545 вес=3; сервер 127.0.0.2:8545; сервер 127.0.0.3:8545;
сервер 127.0.0.4:8545; }
сервер { слушать 443 ssl; имя_сервера www.nathanaw-go-eth.com; keepalive_timeout 70;
ssl_certificate www.example.com.crt;
ssl_certificate_key www.example.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
} }
происхождение
Арон Ван Аммерс