В чем разница между хранилищем ключей PKCS12 и хранилищем ключей PKCS11?
Меня интересуют библиотеки Java-NSS, и я читаю Руководство по Sun P11. Я запутался в следующем:
В чем разница между использованием хранилища ключей PKCS12 и хранилища ключей PKCS11?
Хранилище ключей - это просто хранилище ключей, верно? Есть ли различия? Могут ли они использоваться взаимозаменяемо в любом аспекте?
2 ответа
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 в качестве хранилища ключей).
Из различных типов хранилища ключей в Java - Обзор, различия между PKCS12 и PKCS11 могут быть описаны следующим образом
PKCS12, это стандартный тип хранилища ключей, который можно использовать в Java и других языках. Эту реализацию хранилища ключей можно найти по адресу sun.security.pkcs12.PKCS12KeyStore. Обычно он имеет расширение p12 или pfx. Вы можете хранить закрытые ключи, секретные ключи и сертификаты на этот тип. В отличие от JKS, закрытые ключи в хранилище ключей PKCS12 могут быть извлечены в Java. Этот тип является переносимым и может работать с другими библиотеками, написанными на других языках, таких как C, C++ или C#.
В настоящее время тип хранилища ключей по умолчанию в Java - JKS, то есть формат хранилища ключей будет JKS, если вы не укажете -storetype при создании хранилища ключей с помощью keytool. Однако тип хранилища ключей по умолчанию будет изменен на PKCS12 в Java 9, потому что его улучшенная совместимость по сравнению с JKS. Вы можете проверить тип хранилища ключей по умолчанию в файле $JRE/lib/security/java.security:
PKCS11, это тип аппаратного хранилища ключей. Он предоставляет интерфейс для библиотеки Java для подключения к аппаратным устройствам хранилища ключей, таким как SafeNet's Luna, nCipher или Smart card. Вы можете найти эту реализацию в sun.security.pkcs11.P11KeyStore. Когда вы загружаете хранилище ключей, вам не нужно создавать конкретного поставщика с определенной конфигурацией. Это хранилище ключей может хранить закрытые ключи, секретные ключи и сертификаты. При загрузке хранилища ключей записи будут извлечены из хранилища ключей и затем преобразованы в записи программного обеспечения.