Реплицируйте команду OpenSSL, чтобы подписать файл в Java

Мне нужно подписать файл, и до сих пор я использовалopenssl comman, который работает нормально (файл подписан и проверен).

openssl smime -sign -in unsigned.mobileconfig -out signed.mobileconfig -signer myCrtFile.crt -inkey myKeyFile.key -certfile bundleCertificate.crt -outform der -nodetach

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

Я не квалифицирован с сертификатами и еще меньше сBouncyCastle, Это то, с чем я пришел.

Соответствующие файлы из команды openssl для кода ниже:

myCrtFile.crt -> signerCertHolder
myKeyFile.key -> privateKeyInfo
bundleCertificate.crt -> certificateHolder
public byte[] sign(String message) throws IOException, CMSException, OperatorCreationException, CertificateEncodingException, MessagingException, CertificateException {
    Security.addProvider(new BouncyCastleProvider());

    PrivateKeyInfo privateKeyInfo = loadInKey();
    X509CertificateHolder signerCertHolder = loadSigner();
    X509CertificateHolder certificateCertHolder = loadCertfile();

    PrivateKey inKey = new JcaPEMKeyConverter().getPrivateKey(privateKeyInfo);

    JcaX509CertificateConverter certificateConverter = new JcaX509CertificateConverter();
    X509Certificate signer = certificateConverter.getCertificate(signerCertHolder);
    X509Certificate certificate = certificateConverter.getCertificate(certificateCertHolder);

    List<X509Certificate> certificateList = new ArrayList();
    certificateList.add(signer);
    certificateList.add(certificate);

    Store<?> certs = new JcaCertStore(certificateList);
    ContentSigner sha1signer = new JcaContentSignerBuilder("SHA1withRSA").setProvider("BC").build(inKey);
    JcaSignerInfoGeneratorBuilder jcaSignerInfoGeneratorBuilder = new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().build());

    CMSSignedDataGenerator signGen = new CMSSignedDataGenerator();
    signGen.addSignerInfoGenerator(jcaSignerInfoGeneratorBuilder.build(sha1signer, certificate));
    signGen.addCertificates(certs);

    CMSTypedData content = new CMSProcessableByteArray(message.getBytes());
    CMSSignedData signedData = signGen.generate(content, false);
    byte[] signeddata = signedData.getEncoded();

    return signeddata;
} 

Тогда я сохраняюbyte[] в файл. Когда я открываю файл (это файл MDM mobileConfig), он говорит: «Файл подписан, но не может быть проверен». Я чувствую, что близок к решению, но я не знаю, что я делаю не так.

Может ли кто-нибудь помочь мне выяснить, что мне не хватает, чтобы проверить файл?

PS; Сертификаты взяты из SSL-сертификата (GoDaddy) иbundleCertificate.crt является сертификатом GoDaddy

Ответы на вопрос(1)

Ваш ответ на вопрос