Создайте пару ключей в HSM с помощью Java ⇐ JAVA
Создайте пару ключей в HSM с помощью Java
Мой вопрос на самом деле состоит из двух частей, поэтому, пожалуйста, изложите его.
Для справки: некоторые инструменты, которые я использую: 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 (подпись выполняется с помощью обозревателя хранилища ключей)
Опять же, я что-то упустил в своем коде
Мой вопрос на самом деле состоит из двух частей, поэтому, пожалуйста, изложите его.
Для справки: некоторые инструменты, которые я использую: 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 (подпись выполняется с помощью обозревателя хранилища ключей)
Опять же, я что-то упустил в своем коде
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как создать дочернюю пару ключей из главной пары ключей с помощью модуля Pycryptodome?
Anonymous » » в форуме Python - 0 Ответы
- 24 Просмотры
-
Последнее сообщение Anonymous
-