Генерация 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) в качестве шаблона.

Другие вопросы по тегам