Закрепление сертификата - только открытый ключ?

Я хотел бы прикрепить открытый ключ корневого центра сертификации (verisign - http://www.verisign.com/repository/roots/root-certificates/PCA-3G5.pem) в мое приложение для iOS. Лучше закрепить открытый ключ или subjectPublicKeyInfo? Может кто-нибудь объяснить мне, какой метод лучше и почему?

3 ответа

Я бы сказал, что лучше прикрепить открытый ключ субъекта, чем открытый ключ корневого центра сертификации. Вот мое понимание различных компромиссов закрепления корневого ключа CA:

Хорошее Пока вы держите тот же CA, вы сможете обновлять свой сертификат снова и снова, и он всегда будет работать.

Плохо Я верю, что вы будете немного более уязвимы для атаки MITM, прикрепляющей ключ корневого CA вместо открытого ключа субъекта, поскольку вы будете считать действительным любой сертификат, подписанный этим CA, а не только те, которые действительно соответствуют вашей теме.

Как насчет закрепления открытого ключа субъекта? По сути, вы должны быть немного безопаснее, чем закрепление открытого ключа ЦС, и ваше приложение должно продолжать работать даже после истечения срока действия сертификата и его продления до тех пор, пока вы сохраняете тот же открытый ключ.

Я только что опубликовал вопрос и решение о том, как закрепить открытый ключ, надеюсь, это поможет вам: Как закрепить открытый ключ сертификата на iOS

Я хотел бы закрепить открытый ключ корневого центра сертификации...

Просто избавление от велосипеда, но, вероятно, более безопасно закрепить сертификат или открытый ключ сервера или службы, а не корневой или промежуточный сертификат. Это особенно верно, если вы используете общедоступный ЦС, такой как DigiCert или Verisign (в отличие от частного, корпоративного ЦС).

В случае общедоступного ЦС он может неправильно выдать второй сертификат, и клиенты не смогут разграничить "реальный" сертификат (выданный вам) и "поддельный" сертификат (выданный неправильно). Это случалось в реальной жизни несколько раз, поэтому вы должны ожидать, что это случится снова.

Лучше закрепить открытый ключ или subjectPublicKeyInfo? Может кто-нибудь объяснить мне, какой метод лучше и почему?

Открытый ключ лучше закрепить (по крайней мере, в случае закрепления сертификата сервера).

Некоторые организации, такие как Google, обновляют свои серверные сертификаты каждые 30 дней или около того. Однако они повторно сертифицируют один и тот же открытый ключ. См. Например, Android 4.2 и Pinning. Это означает, что вы будете наблюдать "непрерывность ключа", а не "непрерывность сертификата".

Повторная сертификация того же открытого ключа - вот почему CertPatrol терпит неудачу в некоторых случаях в пользовательском интерфейсе. Нам действительно нужен патруль с открытым ключом в таких случаях, как сервисы Google.

Лучше закрепить SPKI (Subject Public Key Info), потому что он содержит как фактический открытый ключ, так и алгоритм ключа (RSA, ECDSA и т. Д.). Более подробно это описано в этой статье от гуру TLS Google по адресу https://www.imperialviolet.org/2011/05/04/pinning.html:

SPKI включает в себя тип открытого ключа и некоторые параметры, а также сам открытый ключ. Это важно, потому что простое хеширование открытого ключа оставляет открытой для неверной интерпретации. Рассмотрим открытый ключ Диффи-Хеллмана: если кто-то хэширует только открытый ключ, а не полный SPKI, то злоумышленник может использовать тот же открытый ключ, но заставить клиента интерпретировать его в другой группе. Также можно заставить интерпретировать ключ RSA как ключ DSA и т. Д.

Одна из проблем, связанных с закреплением SPKI в приложении для iOS, заключается в том, что платформа безопасности на iOS не предоставляет API-интерфейсы для анализа сертификата и извлечения битов SPKI ( https://nabla-c0d3.github.io/blog/2015/08/11/security-framework-wish-list/).

Хорошая новость заключается в том, что библиотека с открытым исходным кодом доступна именно для этого: https://github.com/datatheorem/TrustKit.

Другие вопросы по тегам