Я хочу предоставить сервис через API с двумя факторами аутентификации с использованием PHP / MySQL. Одним из факторов является простое имя пользователя и пароль. Что касается другого фактора, я пытаюсь использовать взаимный TLS, в котором сертификат клиента сопоставляется с именем пользователя. Я намереваюсь использовать самозаверяющие сертификаты из ЦС, который я установил на компьютере CentOS с Apache, и выдавать клиентские сертификаты клиентам через защищенный канал вместе с закрытыми ключами.
Я нашел несколько достойных статей о том, как настроить аутентификацию пользователей с использованием SSL-сертификатов. Лучшее, что я нашел до сих пор, это ниже
https://cweiske.de/tagebuch/ssl-client-certificates.htm
Но, кажется, есть дыра в этой и других статьях с точки зрения объяснения мне чего-то. Я предполагаю, что эта работа заключается в том, что, когда клиент делает запрос POST, наряду с именем пользователя и паролем, также включается сертификат с цифровой подписью, подписанной секретным ключом, выданным пользователю. Затем эта подпись может быть расшифрована открытым ключом, чтобы подтвердить, что владелец личного ключа отправил сообщение. Но эти статьи на самом деле не подтверждают, что это то, что происходит.
Вместо этого они говорят, что Apache подтверждает, что сертификат был подписан CA Cert. Они также объясняют, как использовать PHP для доступа к полям сертификата, таким как SSL_CLIENT_S_DN_Email и SSL_CLIENT_M_SERIAL, и используют их для подтверждения того, что сертификат принадлежит отправителю сообщения. Но мне не ясно, что они не просто используют информацию в публичном сертификате. Таким образом, любой, кто может получить доступ к общедоступному сертификату, может использовать его в качестве одного из факторов аутентификации для аутентификации в сервисе. Если это так, это означает, что на самом деле это не фактор аутентификации.
Я ошибаюсь, если думаю, что именно так и есть - сертификат, включенный в сообщение, включает подпись, подписанную закрытым ключом, выданным пользователю, и что Apache расшифровывает подпись с помощью открытого ключа, а не просто подтверждает сертификат выдан СА?