2016-10-07 10 views
1

В настоящее время я пытаюсь создать CMSSignedData, используя только данные сертификата и подписанные данные, которые генерируются из внешнего программного обеспечения (поэтому у меня нет доступа к закрытому ключу и генерация подписи прозрачна для меня). Мне нужно, чтобы кодированные данные добавляли его к содержимому подписи SMIME.Генерировать CMSSignedData без личного ключа в JAVA

Поиск в Интернете Я выясню решение с BouncyCastle, которое использует закрытый ключ и данные для подписки, чтобы получить CMSSignedData. Но это не касается моей проблемы, потому что у меня нет доступа к закрытому ключу, и подпись уже создана.

Есть ли способ создать объект CMS, используя только данные сертификата, открытый ключ и ранее сгенерированную подпись?

Любой подход или библиотека, которую я могу использовать или попробовать?

ответ

0

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

+0

Это очень хороший подход. Я начал делать то, что вы сказали об использовании классов Bouncy Castle в качестве шаблона, но я нашел это немного сложнее. Затем я нашел библиотеку под названием [j4sign] (http://j4sign.sourceforge.net/), которая реализует только то, что мне нужно (и она использует Bouncy Castle). – banshee20

+0

@ banshee20 Да, BC не совсем прост в использовании, код не очень хорошо документирован и трудно читается, если у вас мало опыта работы с ASN.1. С другой стороны, это всеобъемлющий, хорошо протестированный, и вы можете делать почти все с ним, если знаете, как это сделать. Во всяком случае, я рад, что вы нашли легкое решение для своей проблемы. – Omikron