Как сделать шифрованный канал между 2 приложениями?

Есть 2 приложения (node.js в моем случае), между которыми я хочу установить шифрованный канал и обмениваться сообщениями.

Это почти полностью решается TLS и клиентской аутентификацией. Например как-то так: https://gist.github.com/pcan/e384fcad2a83e3ce20f9a... .

Однако есть проблема:

Такой подход предполагает создание серверного сертификата, который привязан к доменному имени:
Specify server Common Name, like 'localhost' or 'server.localhost'. The client will verify this, so make sure you have a vaild DNS name for this.


А мне хотелось бы избежать привязки, так как условный сервер в данном случае не имеет и не может иметь ни доменного имени, ни статического IP.

Таким образом хочется получить схему, где есть 2 хоста у которых может меняться IP и нет доменного имени. И они должны иметь возможность подключиться друг к другу (инициатором-"клиентом" соединения может выступать любой) как-то так например:
connectTo('123.123.123.123:8000');

При этом есть возможность заранее обменяться ключами / сертификатами.

Возможно ли это с помощью TLS?

И насколько адекватно и безопасно использовать обычные сокеты и шифровать контент? (примерно так https://stackoverflow.com/questions/22738754/node-...
  • Вопрос задан
  • 826 просмотров
Решения вопроса 2
Да, это, разумеется, возможно.
Сертификат сервера будет проверять ваше клиентское приложение. При этом вы можете задать свою функцию для проверки сертифката через options.checkServerIdentity()
https://nodejs.org/api/tls.html#tls_tls_checkserve...

Обычно в таких случаях проверяется не имя и не цепочка доверия, а просто хэш сертификата сервера (fingerprint или fingerprint256 ) и годится совершенно любой самоподписанный сертификат, причем это гораздо безопасней и надежней чем доверие к корневым CA. Такой прием в приложениях обычно называют Certificate pinning.
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
В принципе - не за чем здесь TLS, если два серва - ваши.
Можно просто дать каждому серверу одинаковую "соль" и "ключ".
И с помощью любой криптостойкой функции сразу начать передавать данные между ними.
Время от времени - обновляйте пару соль-ключ.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы