Как реализовать Mutual TLS?

Требуется выполнять запросы к платежной системе защищённые с помощью двухстороннего TLS.
К сожалению документация партнёра ограничена двумя предложениями:
Сертификат, приватный ключ и пароль приватного ключа партнер использует для запросов к API.
Безопасность соединения между партнером и платежной системой обеспечивается с помощью
механизма двустороннего TLS (Mutual TLS, TLS v1.2).


Сам никогда не сталкивался с таким способом аутентификации. Гугл приводит на документации о том, как настроить серверы на прием клиентских сертификатов в лучшем случае, а в большинстве на рассказы о том что это такое.
Да и в целом не оч. ясно что гуглить.

Как это реализовать в общем случае на PHP ?

Сейчас я устанавливаю такие опции для curl:
$options[CURLOPT_SSL_VERIFYHOST] = true;
                $options[CURLOPT_SSL_VERIFYPEER] = true;
                $options[CURLOPT_CAINFO] = $this->certdir->getPath().'/public.cer';
$options[CURLOPT_CAPATH] = $this->certdir->getPath().'/public.cer';

Но очевидно просто пути к сертификату не достаточно. В инструкции указано что я как-то должен задействовать еще и приватный ключ и его пароль.

Вообще говоря у меня есть следующий набор файлов:
certfile.pfx
kbs_ca.crt
kbs_root_ca.crt
private.key
public.cer

+ пароль приватного ключа
  • Вопрос задан
  • 608 просмотров
Решения вопроса 2
shurshur
@shurshur
Сисадмин, просто сисадмин...
Сначала немного теории.

CA - Certificate Authority - доверенный удостоверящий центр, который подписывает сертификаты.
У каждой стороны есть секретный ключ, который она никому не показывает, и публичный ключ, он же сертификат. Чтобы подтвердить, что сертификат принадлежит обеим сторонам, эти сертификаты должны иметь подпись доверенного лица, в данном случае CA.

Обычно мы привыкли, что в SSL только серверная сторона доказывает свою подлинность. Идея mTLS в том, что обе стороны должны предоставить свой публичный сертификат, подписанный CA. Тогда если сервер доверяет CA, он будет доверять и клиентскому сертификату.

Но публичный ключ не имеет смысла без приватного. А в куске кода в вопросе он вообще не встречается.

Итак, что нам нужно для установления сессии?

1. Сертификат CA - kbs_ca.crt (скорее всего, можно склеить оба CA - промежуточный и корневой - в один файл);
2. Приватный ключ клиента, который он будет использовать для шифрования - private.key;
3. Соответствующий приватному публичный ключ-сертификат, который клиент будет сообщать серверу - public.cer.

Я ввёл в гугл "php curl mtls" и в первой же ссылке есть пример кода: https://smallstep.com/hello-mtls/doc/client/php

В примере, конечно, нет пароля от ключа, но справка подсказывает, что это опция CURLOPT_SSLKEYPASSWD.
Ответ написан
dimonchik2013
@dimonchik2013
non progredi est regredi
тут что не так?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽