В чем разница между хранилищем ключей PKCS12 и хранилищем ключей PKCS11?

Мне интересны библиотеки Java-NSS, и я читаю Руководство Sun P11. Я запутался в следующем:

В чем разница между использованием хранилища ключей PKCS12 и хранилищем ключей PKCS11?

Хранилище ключей - это просто хранилище ключей, верно? Есть ли какие-то различия? Могут ли они использоваться взаимозаменяемо в любом аспекте?

Ответ 1

PKCS # 12 - это формат файла (часто называемый .p12 или .pfx), где вы можете хранить закрытый ключ и сертификаты. Он используется для преобразования/транспортировки ключей и сертификатов, в основном. Если вы экспортируете закрытый ключ + сертификат из своего браузера, скорее всего, он будет в этом формате.

PKCS # 11 - это интерфейс, обычно используемый для разговоров с аппаратными криптографическими токенами (часто это смарт-карты или USB-токены, которые эффективно представляют собой смарт-карты, встроенные в считыватель). Этот интерфейс имеет ряд операций по использованию ключей и сертификатов. Некоторые маркеры могут подписываться с использованием закрытого ключа, который они содержат, без того, что ключ может покинуть устройство. Точкой этого интерфейса является обработка того, что обрабатывает ключи и сертификаты как отдельный объект, без необходимости выполнять криптографические операции, предлагаемые PKCS # 11 (точнее, те, которые связаны с закрытым ключом).

Когда вы используете PKCS # 11 с NSS, вы эффективно используете NSS в качестве черного ящика, обернутого за уровень PKCS # 11 (он фактически является поставщиком программного обеспечения для того, что должен был быть аппаратным маркетом PKCS # 11). Существует небольшая разница в том, как Java использует NSS через PKCS # 11 в том смысле, что для него не требуется разделяемая библиотека PKCS # 11 (по сравнению с другими библиотеками PKCS # 11), поэтому, как правило, это не PKCS # 11, хотя это очень похоже.

В Java вы можете получить экземпляр RSAPrivateKey из хранилища PKCS # 11, использовать его для подписи и расшифровки, не имея возможности получить что-либо из своего модуля. Поставщик безопасности, обрабатывающий его, будет выполнять подписку/расшифровку через библиотеку (и, следовательно, через токен, если эта библиотека поддерживается аппаратным токеном).

Возвращаясь к KeyStore в Java, это API, который позволяет вам загружать и использовать ключи и сертификаты из файлов (вы получаете различные форматы файлов, такие как JKS, PKCS # 12, PEM, в зависимости от поставщика безопасности ) или из других базовых API (например, PKCS # 11, более или менее объединенных с NSS в поставщике Sun или KeychainStore, если вы находитесь в OSX и хотите использовать KeyChain в качестве хранилища ключей).

Ответ 2

Из Различные типы хранилищ ключей в Java - обзор, различия между PKCS12 и PKCS11 можно описать следующим образом

PKCS12, это стандартный тип хранилища ключей, который может использоваться в Java и Другие языки. Вы можете найти эту реализацию хранилища ключей в sun.security.pkcs12.PKCS12KeyStore. Обычно он имеет расширение p12 или pfx. Вы можете хранить секретные ключи, секретные ключи и сертификаты на этот тип. В отличие от JKS, закрытые ключи в хранилище ключей PKCS12 могут быть извлеченный в Java. Этот тип портативный и может работать с другие библиотеки, написанные на других языках, таких как C, С++ или С#.

В настоящее время тип хранилища ключей по умолчанию в Java - JKS, т.е. хранилище ключей формат будет JKS, если вы не укажете тип -storetype при создании keystore с keytool. Однако тип хранилища по умолчанию будет изменен на PKCS12 в Java 9, поскольку его улучшенная совместимость по сравнению с JKS. Вы можете проверить тип хранилища по умолчанию на $JRE/lib/security/java.security файл:

PKCS11, это тип хранилища ключей. Он обеспечивает интерфейс для библиотека Java для подключения к аппаратным хранилищам ключей, таким как SafeNet Luna, nCipher или смарт-карты. Вы можете найти это реализация на sun.security.pkcs11.P11KeyStore. Когда вы загружаете keystore, вам не нужно создавать конкретного поставщика с конкретными конфигурации. Это хранилище ключей может хранить секретные ключи, секретные ключи и сертификаты. При загрузке хранилища ключей записи будут извлечены из хранилища ключей, а затем преобразуется в записи программного обеспечения.