Как реализовать 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

+ пароль приватного ключа
  • Вопрос задан
  • 857 просмотров
Решения вопроса 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
Пригласить эксперта
Ваш ответ на вопрос

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

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