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

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

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

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


person Cratylus    schedule 27.05.2011    source источник
comment
Бруно уже довольно хорошо объяснил, так что я просто сделаю несколько комментариев. С PKCS#12 вы извлекаете ключи, а затем просто обрабатываете их с помощью поставщика Sun (или одного из других поставщиков только для Java). С PKCS#11 (это совершенно другой стандарт, PKCS просто означает стандарты криптографии с открытым ключом) ключ останется внутри токена PKCS#11, поэтому он будет обрабатываться собственной библиотекой PKCS#11 (или базовым токеном). Таким образом, KeyStore — это не просто хранилище ключей. Однако ключи/сертификаты в хранилище ключей могут использоваться взаимозаменяемо (если код Java достаточно совместим).   -  person Maarten Bodewes    schedule 28.05.2011
comment
@owlstead: мне не ясно следующее: может ли хранилище ключей PKCS11 использоваться в качестве хранилища ключей диспетчера ключей (в контексте ssl в jsse) для самоаутентификации другой стороны, так же, как хранилище ключей PKCS12 может быть настроено в a keyManager?Или это не возможно?   -  person Cratylus    schedule 28.05.2011
comment
да, вы можете использовать хранилища ключей PKCS11, как и любые другие, в том числе через KeyManager и SSLContext.   -  person Bruno    schedule 28.05.2011


Ответы (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 в качестве KeyStore).

person Bruno    schedule 27.05.2011
comment
@ Бруно: 1) Вы упоминаете смарт-карты. А как насчет cert8.db? Это контейнер PKCS11 для NSS? 2) Мне не ясно, что касается использования RSAPrivateKey. Можно ли настроить хранилище ключей в контексте ssl (для использования в качестве частного хранилища ключей и подписи), а хранилище ключей должно быть cert8.db (т.е. типа pkcs11)? Или это невозможно? - person Cratylus; 28.05.2011
comment
Если вы хотите использовать cert8.db, вы можете использовать конфигурацию PKCS11 KeyStore для использования NSS и указания на этот файл (строго говоря, это не PKCS#11, но он настолько близок, что объединен с ним в Java). Вы также можете настроить PKCS11 KeyStore по-другому, чтобы использовать общую библиотеку PKCS#11. KeyStore в целом представляет собой более высокий уровень абстракции, охватывающий все, что может хранить ключи/сертификаты или через что вы можете их использовать. Вы действительно можете использовать такое хранилище ключей для SSL, при условии, что ключи имеют правильный тип (в зависимости от наборов шифров): RSA довольно распространен. - person Bruno; 28.05.2011
comment
KeyStore как класс не обязательно является осязаемым, скорее это объект, который можно использовать для взаимодействия с файлами (JKS, P12), токенами (PKCS#11) или другими библиотеками (KeychainStore, NSS). Просто оказалось, что требования к NSS настолько похожи на требования потребителя PKCS#11, что их объединили. При необходимости каждый из этих базовых объектов можно настроить, например, чтобы он указывал на файл cert8.db или использовал определенный слот смарт-карты. Более простые файлы, такие как файлы PKCS#12, не нуждаются в подобной настройке. - person Bruno; 28.05.2011
comment
@Bruno: примеры Java для NSS относятся к cert8.db. Итак, это простой файл, доступ к которому осуществляется, как если бы это был аппаратный токен? Я правильно понял? - person Cratylus; 28.05.2011
comment
@ user384706, да, более или менее. Когда вы получаете доступ к аппаратному токену через PKCS11, вы получаете KeyStore для доступа к библиотеке PKCS#11 (например, libpkcs11.so), которая затем взаимодействует с токеном (например, slot=1); однако то, что библиотека PKCS # 11 управляет реальным оборудованием, не является проблемой Java. Когда вы используете NSS, хранилище ключей PKCS11 взаимодействует с libnss, которая настроена на использование cert8.db (или любого другого по вашему выбору). Вам необходимо настроить эти KeyStore с дополнительной информацией, а не только с путем к файлу (например, через pkcs11.cfg), потому что вы эффективно настраиваете базовую библиотеку, для которой требуется больше параметров. - person Bruno; 28.05.2011
comment
Вас также может заинтересовать эта статья: java.sun.com/developer/technicalArticles/ J2SE/безопасность - person Bruno; 28.05.2011
comment
@Bruno: я прочитал статью. Я хочу прояснить, что понял концепцию. Java предоставляет возможность использовать токены, а также сертифицированные реализации программного обеспечения. NSS — это сертифицированная реализация, созданная для использования через PKCS11. Это правильно? - person Cratylus; 29.05.2011
comment
(Сертификат здесь не важен.) Дело скорее в том, что NSS является внешним по отношению к Java (это библиотека от Mozilla) и имеет сходство с реальными библиотеками PKCS#11. Следовательно, Sun реализовала интерфейсы как для чистого PKCS#11, так и для NSS в хранилище типа PKCS11. Разница заключается в конфигурации: с чистым PKCS#11 вы используете library = .../libpkcs11.so; с NSS вы указываете nssLibraryDirectory = .... NSS не был создан для использования через PKCS11, но тип хранилища Java PKCS11 был расширен для поддержки NSS, а также реальных библиотек PKCS#11. - person Bruno; 29.05.2011

Из Различные типы хранилища ключей в 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 к аппаратным хранилищам ключей, таким как Luna от SafeNet, nCipher или смарт-карты. Вы можете найти эту реализацию в sun.security.pkcs11.P11KeyStore. Когда вы загружаете хранилище ключей, вам не нужно создавать конкретного поставщика с определенной конфигурацией. Это хранилище ключей может хранить закрытые ключи, секретные ключи и сертификаты. При загрузке хранилища ключей записи будут извлечены из хранилища ключей, а затем преобразованы в записи программного обеспечения.

person PixelsTech    schedule 12.10.2016