В чем разница между хранилищем ключей PKCS12 и хранилищем ключей PKCS11? - PullRequest
33 голосов
/ 28 мая 2011

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

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

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

Ответы [ 2 ]

47 голосов
/ 28 мая 2011

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 в качестве хранилища ключей).

3 голосов
/ 12 октября 2016

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

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

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

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

...