Подтвердить что ты не робот

Какие части клиентского сертификата использовать при уникальной идентификации пользователей?

Я разрабатываю систему, в которой пользователи смогут регистрироваться и после этого аутентифицироваться с помощью сертификатов клиентов в дополнение к аутентификации имени пользователя и пароля.

Сертификаты клиентов должны быть действительными сертификатами, выпущенными настроенным списком органов сертификации, и будут проверяться (проверены) при их представлении.

На этапе регистрации мне нужно сохранить часть (-ы) сертификата клиента в репозитории пользователя (DB, LDAP, что угодно), чтобы я мог сопоставить пользователя, который аутентифицируется с сертификатом клиента внутреннему "пользователю".

Один довольно очевидный выбор - использовать отпечаток сертификата; Но самого отпечатка пальца недостаточно, так как могут возникнуть столкновения (хотя они и не являются вероятными), поэтому нам нужно сохранить дополнительную информацию из сертификата. Этот вопрос SO также является информативным в этом отношении.

RFC 2459 определяет (4.1.2.2), что серийный номер сертификата должен быть уникальным в пределах данного ЦС.

Со всем этим в совокупности я собираюсь хранить серийный номер сертификата и сертификат для каждого зарегистрированного пользователя. Учитывая, что сертификаты клиентов будут проверены и действительны, это должно однозначно идентифицировать каждый сертификат клиента. Таким образом, даже если сертификат клиента будет обновлен, он все равно будет действительным (серийный номер останется таким же, как и эмитент).

Я что-то пропустил?

4b9b3361

Ответ 1

У вас есть несколько решений:

  • Сохранение отпечатка пальца. Да, вы правы, столкновение теоретически возможно, но вероятность действительно очень низкая, и вы можете считать, что этого не происходит: у 2 пользователей в вашей системе не будет случайно один и тот же отпечаток сертификата. Однако алгоритмы хеширования становятся все слабее с течением времени, и злоумышленник может попытаться создать сертификат, отпечаток которого соответствует зарегистрированному. Эта атака называется второй атакой preimage и довольно трудно сделать, поскольку злоумышленник не пытается подделать некоторые случайные данные, соответствующие отпечатку пальца, но настоящий сертификат X.509, который может пройти начальную фазу проверки (например, взломать PKI). Довольно сложно:) Но если вы действительно хотите избежать столкновения, вы можете сохранить 2 отпечатка пальца с помощью двух различных алгоритмов (например, SHA-1 и SHA-256).

  • Сохранение сертификата и серийного номера. Да, он может использоваться как уникальный идентификатор сертификата. Как вы уже писали, стандарт (RFC 5280 устарел RFC 2459) указывает [The serial number] MUST be unique for each certificate issued by a given CA. Однако это также означает, что при возобновлении сертификата серийный номер изменяется с тех пор, как новый сертификат выданный ЦС.

Последнее замечание: вы хотите обработать продление сертификата, и это хорошая идея, многие редакторы программного обеспечения забывают, что сертификаты должны быть обновлены. Но вы должны знать, что почти все может измениться в сертификате: имя подзаголовка (люди могут изменить свое имя, женщины выходят замуж...), имя эмитента (компания поставщика сертификатов может меняться...), ключевой алгоритм, размер ключа, расширения... В вашей системе процесс обновления сертификата, вероятно, будет довольно близок к первоначальной регистрации сертификата пользователя.

Ответ 2

Лучший способ однозначно идентифицировать пользователя - по адресу электронной почты. В процессе регистрации действительный адрес электронной почты должен быть обязательным. Затем вы связываете серийный номер сертификата и эмитента или, возможно, хэш самого сертификата с адресом электронной почты и идентификатором пользователя. Затем, когда срок действия сертификата истекает, или пользователь меняет сертификат, он/она будет "обновлять ссылку на сертификат", где он вводит адрес электронной почты, и он получает ссылку на загрузку нового сертификата. Затем вы можете заменить старый серийный/эмитент новым.

Ответ 3

Я решил объединить имя эмитента, разделитель | и DN.

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