Проверить сертификат клиента

C ++ 11 bind решение:

std::for_each(this->begin(), this->end(),
      std::bind(&C::transformation, this, std::placeholders::_1));

C ++ 11 lambda решение:

std::for_each(this->begin(), this->end(),
      [this] (T& i) { transformation(i); });

C ++ 14 общее решение лямбда :

std::for_each(this->begin(), this->end(),
      [this] (auto&& i) { transformation(std::forward<decltype(i)>(i)); });

C ++ 98 решение bind1st + mem_fun :

std::for_each(this->begin(), this->end(),
      std::bind1st(std::mem_fun(&C::transformation), this));
< hr>

Примечание: вызовы this->begin() и this->end() квалифицируются с помощью this-> только потому, что в коде OP они являются функциями-членами шаблонного базового класса. Таким образом, эти имена примитивно просматриваются в глобальном пространстве имен. Любое другое событие this является обязательным.

2
задан Mahdi 16 January 2019 в 14:25
поделиться

1 ответ

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

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

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

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

0
ответ дан blowdart 16 January 2019 в 14:25
поделиться
Другие вопросы по тегам:

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