Создайте пару ключей в HSM с помощью JavaJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Создайте пару ключей в HSM с помощью Java

Сообщение Anonymous »


Мой вопрос на самом деле состоит из двух частей, поэтому, пожалуйста, изложите его.

Для справки: некоторые инструменты, которые я использую: softhsm2, Keystore Explorer, pkcs11-tool

Используемая библиотека JAVA: ipkcs11wrapper

ЧАСТЬ 1. Генерация пары ключей:

Как упоминалось выше, я использую библиотеку ipkcs11wrapper для создания и использования пары ключей для подписи/проверки данных в HSM. Используя коды из тестовой папки библиотеки, я придумал следующий код для создания пары ключей с меткой:

// Идентифицируем строку метки и байт идентификатора [], инициализируем модуль и получаем токен длинный mechCode = CKM_RSA_PKCS_KEY_PAIR_GEN; Шаблон KeyPairTemplate = новый KeyPairTemplate(CKK_RSA).token(true).id(id); template.publicKey().modulusBits(2048); template.privateKey().sensitivity(true).private_(true); шаблон.labels(метка); шаблон.publicKey() .verify(signatureMechanismInfo.hasFlagBit(CKF_VERIFY)) .verifyRecover(signatureMechanismInfo.hasFlagBit(CKF_VERIFY_RECOVER)) .encrypt(signatureMechanismInfo.hasFlagBit(CKF_ENCRYPT)) .derive(signatureMechanismInfo.hasFlagBit(CKF_DERIVE)) .wrap(signatureMechanismInfo.hasFlagBit(CKF_WRAP)); шаблон.privateKey() .sign(signatureMechanismInfo.hasFlagBit(CKF_SIGN)) .signRecover(signatureMechanismInfo.hasFlagBit(CKF_SIGN_RECOVER)) .decrypt(signatureMechanismInfo.hasFlagBit(CKF_DECRYPT)) .derive(signatureMechanismInfo.hasFlagBit(CKF_DERIVE)) .unwrap(signatureMechanismInfo.hasFlagBit(CKF_UNWRAP)); PKCS11KeyPair сгенерированныйKeyPair = token.generateKeyPair(механизм, шаблон); Когда я запускаю приведенный выше код, генерируется пара ключей, но: я могу просмотреть эту пару ключей в pkcs11-tool, но она не отображается в проводнике хранилища ключей!. инструмент pkcs11 показывает мне мой ключ как личный и открытый ключ:

Объект открытого ключа; RSA 2048 бит метка: ТестКей ID: 546573744b6579 Использование: шифровать, проверять, обертывать. Доступ: местный Объект закрытого ключа; ЮАР метка: ТестКей ID: 546573744b6579 Использование: расшифровать, подписать, развернуть. Доступ: конфиденциальный, всегда конфиденциальный, никогда не извлекаемый, локальный Поэтому я попытался создать пару ключей с помощью обозревателя хранилища ключей, чтобы проверить разницу, и получилось вот что. Когда пара ключей создается в проводнике ключей в запросе pkcs11-tool, я получаю закрытый ключ и объект сертификата

Объект закрытого ключа; ЮАР этикетка: ID: 6b65792066726f6d206b7365 Использование: расшифровать, подписать, развернуть. Доступ: никогда не извлекаемый, локальный Объект сертификата; тип = сертификат X.509 этикетка: ключ от kse субъект: DN: C=LB, ST=ST, L=L, O=O, OU=OU, CN=Key From KSE ID: 6b65792066726f6d206b7365 Кроме того, когда я попытался импортировать пару ключей из файла p12, я получил тот же результат, что и в обозревателе хранилища ключей (закрытый ключ и сертификат)

Моя пара ключей сгенерирована неправильно? или я что-то упускаю?

Часть 2 генерирует запрос на подпись сертификата (CSR): Из сгенерированной пары ключей я хотел создать сертификат и запрос на подпись. Итак, я сделал следующие шаги:

Во-первых, я получил ключи от HSM следующим образом:

// Использование сгенерированной пары ключей, полученной выше длинный сгенерированныйPublicKey = сгенерированныйKeyPair.getPublicKey(); длинный сгенерированныйPrivateKey = сгенерированныйKeyPair.getPrivateKey(); AttributeVector attrValues ​​= token.getAttrValues(generatedPublicKey, CKA_MODULUS, CKA_PUBLIC_EXPONENT); AttributeVector attrValues1 = token.getAttrValues(generatedPrivateKey, CKA_MODULUS, CKA_PUBLIC_EXPONENT); RSAPublicKeySpec rsaPublicKeySpec = новый RSAPublicKeySpec(attrValues.modulus(), attrValues.publicExComponent()); RSAPrivateKeySpec rsaPrivateKeySpec = новый RSAPrivateKeySpec(attrValues1.modulus(), attrValues1.publicExComponent()); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); RSAPublicKey javaRsaPublicKey = (RSAPublicKey) keyFactory.generatePublic(rsaPublicKeySpec); RSAPrivateKey javaRsaPrivateKey = (RSAPrivateKey) keyFactory.generatePrivate(rsaPrivateKeySpec); Используя приведенный выше закрытый/открытый ключ и надувной замок, я сделал следующее:

X500Name subject = new X500Name(BCStyle.CN + "=" + label + ", " + BCStyle.O + "=OU"); PKCS10CertificationRequestBuilder p10Builder = новый JcaPKCS10CertificationRequestBuilder (субъект, javaRsaPublicKey); JcaContentSignerBuilder csBuilder = новый JcaContentSignerBuilder («SHA256WithRSAEncryption»); Подписывающее лицо ContentSigner = csBuilder.build(javaRsaPrivateKey); PKCS10CertificationRequest csr = p10Builder.build (подписавший); Строка csrPEM = новая строка (Base64.getEncoder().encode(csr.getEncoded())); //Записываем PEM в файл .csr, добавляя заголовок/нижний колонтитул BEGIN/END CERTIFICATE REQUEST Файл CSR создан, но если я попытаюсь подписать этот файл pkcs10 с помощью сертификата подписи, возникнет ошибка, связанная с неудачей проверки CSR pkcs#10 (подпись выполняется с помощью обозревателя хранилища ключей)

Опять же, я что-то упустил в своем коде
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»