Проверить сертификат клиента - PullRequest
0 голосов
/ 16 января 2019

В моем проекте мне нужно проверить и проверить сертификат клиента для каждого запроса пользователя, а затем дать им доступ к вызову моих API. Мои пользователи - машины (другие API или библиотеки). Они добавляют сертификат (ы) к своему запросу и отправляют его в мой размещенный API. Я реализую собственный обработчик аутентификации и успешно извлекаю клиентских сертификатов . Прямо сейчас я сравниваю сертификат клиента со списком действительных сертификатов в моем appsetting.json (отпечаток, эмитент и серийный номер). Если все эти три свойства совпадают с сертификацией клиента, я возвращаю return Task.FromResult(AuthenticateResult.Success(ticket));, в противном случае я возвращаю return Task.FromResult(AuthenticateResult.Fail("certificate is not valid"));

все работает нормально, но мне не нравится, как я проверял сертификат клиента . Я хотел бы знать, существует ли элегантный способ проверки сертификата клиента, а не мое решение в ASP.NET CORE .

1 Ответ

0 голосов
/ 16 января 2019

Эмитент и серийный номер контролируются злоумышленником, поэтому они не подходят для проверки.

Отпечаток пальца - это SHA1 нескольких свойств сертификата , включая эмитента, серийный номер, открытый ключ. Это, вероятно, пока нормально, и не может быть изменено .NET, потому что это функция Windows, но отпечатки пальцев предназначены для справки, а не безопасности.

Лучшим подходом было бы сравнить подпись сертификата и хеш-код и установить минимальное качество для хеш-кода SHA256 или выше. cert.SignatureAlgorithm.Value; выдаст вам алгоритм в виде OID, затем вы можете создать для него новый System.Security.Cryptography.Oid и использовать свойство FriendlyName для получения алгоритма в тексте, но фактическая подпись не поддерживается, Вы должны восстановить третьим лицам, как BouncyCastle. Так что, вероятно, это не так, потому что кажется глупым принимать за это зависимость.

Действительно, это сводится к тому, как вы регистрируете клиентские сертификаты. Я хотел бы попросить сертификаты (или где-нибудь выполнить процедуру регистрации, например, скажем, nuget имеет для подписи сертификатов), поместить их в класс X509Certificate2, затем создать хэш SHA256 свойства RawData и добавить его в свой список разрешений. Затем сделайте то же самое для входящих клиентских сертификатов и сравните SHA256 необработанных данных из входящего сертификата с разрешенным списком. Конечно, теперь вы должны справиться с истечением срока действия сертификата ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...