Генерация CMSSignedData без закрытого ключа в JAVA
В настоящее время я пытаюсь создать CMSSignedData
используя только данные сертификата и подписанные данные, которые генерируются из внешнего программного обеспечения (поэтому у меня нет доступа к закрытому ключу, и генерация подписи прозрачна для меня). Что мне нужно, это закодированные данные, чтобы добавить его в SMIME
содержание подписи.
При поиске в сети я нахожу решение с BouncyCastle
который использует закрытый ключ и данные для подписи, чтобы получить CMSSignedData
, Но это не решает мою проблему, потому что у меня нет доступа к закрытому ключу и подпись уже сгенерирована.
Есть ли способ создать объект CMS, используя только данные сертификата, открытый ключ и ранее созданную подпись?
Любой подход или библиотека, которую я могу использовать или попробовать?
1 ответ
CMS (синтаксис криптографических сообщений) указан в RFC 5652. Тип SignedData представляет собой структуру ASN.1, которая в основном состоит из подписанных данных (encapContentInfo), сертификата подписи (и цепочки) и самой подписи (части signerInfos):
SignedData ::= SEQUENCE {
version CMSVersion,
digestAlgorithms DigestAlgorithmIdentifiers,
encapContentInfo EncapsulatedContentInfo,
certificates [0] IMPLICIT CertificateSet OPTIONAL,
crls [1] IMPLICIT RevocationInfoChoices OPTIONAL,
signerInfos SignerInfos }
SignerInfo ::= SEQUENCE {
version CMSVersion,
sid SignerIdentifier,
digestAlgorithm DigestAlgorithmIdentifier,
signedAttrs [0] IMPLICIT SignedAttributes OPTIONAL,
signatureAlgorithm SignatureAlgorithmIdentifier,
signature SignatureValue,
unsignedAttrs [1] IMPLICIT UnsignedAttributes OPTIONAL }
Итак, теперь вам нужно создать структуру ASN.1 из имеющихся у вас данных. Если вы еще не знаете алгоритмы, которые использовались для подписи, вы, безусловно, можете получить эту информацию у оператора программного обеспечения для внешней подписи.
Bouncy Castle обычно является хорошим выбором для кодирования ASN.1, и, кроме того, вы можете использовать исходный код Bouncy Castle, который обычно создает CMSSignedData
объект ( CMSSignedDataGenerator) в качестве шаблона.