Надежный замок создал проверку подписи PKCS7 / CMS OpenSSL - PullRequest
0 голосов
/ 13 декабря 2018

Мы использовали следующий фрагмент кода для подписи и создания файлов PKCS7.,

public static String signAttached(X509Certificate obCert,PrivateKey obPvtKey,String signData, boolean attached){
    byte[] envelopedData = null;

    try{
        Security.addProvider(new BouncyCastleProvider());

        //Signed Attributes for TimeStamping
        final ASN1EncodableVector signedAttributes = new ASN1EncodableVector();
        final Attribute signingAttribute = new Attribute(CMSAttributes.signingTime, new DERSet(new DERUTCTime(new Date()))); 
        signedAttributes.add(signingAttribute);
        // Create the signing table
        final AttributeTable signedAttributesTable = new AttributeTable(signedAttributes);
        // Create the table table generator that will added to the Signer builder
        final DefaultSignedAttributeTableGenerator signedAttributeGenerator = new DefaultSignedAttributeTableGenerator(signedAttributesTable);


        //Build CMS
        X509Certificate cert = (X509Certificate) obCert;
        List certList = new ArrayList();
        CMSTypedData msg = new CMSProcessableByteArray(signData.getBytes(java.nio.charset.StandardCharsets.UTF_8));
        certList.add(cert);
        Store certs = new JcaCertStore(certList);
        CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
        ContentSigner sha1Signer = new JcaContentSignerBuilder("SHA1withRSA").setProvider("SunMSCAPI").build(obPvtKey);
        gen.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().setProvider("BC").build()).build(sha1Signer, cert));
        gen.addCertificates(certs);

        //true means Attached; false means detached content 
        CMSSignedData sigData = gen.generate(msg, attached);     

        envelopedData = sigData.getEncoded();
    }catch(Exception e){
        e.printStackTrace();
    }
    return new String(Base64.encode(envelopedData));
}

Конечный конверт в кодировке Base64 сохранился в файле.Позже, когда я попытался проверить подпись с помощью следующей команды;

$ openssl cms -verify -noverify -inform PEM -in new.p7s
Verification successful
madan prabhu nic tamilnadu state unit

Для подписи;это работает отлично.То же самое для отдельной подписи;это не работает.

$openssl cms -verify -noverify -inform PEM -in newd.p7s -content newd.txt
madan prabhu nic tamilnadu state unit
Verification failure
140109147780928:error:2E09A09E:CMS routines:CMS_SignerInfo_verify_content:verification failure:crypto/cms/cms_sd.c:821:
140109147780928:error:2E09D06D:CMS routines:CMS_verify:content verify error:crypto/cms/cms_smime.c:393:

Содержимое файла newd.txt точно такие же данные.

Пожалуйста, подскажите, как успешно разрешить проверку Openssl;так как мы находимся в разработке кроссплатформенного решения.

Примечание. Проверка обеих подписей (прикрепленных и отсоединенных) прекрасно работает при проверке Java-кода BC с использованием JcaSimpleSignerInfoVerifierBuilder.

...