Replicar el comando OpenSSL para firmar un archivo en Java

Necesito firmar un archivo y hasta ahora he usado elopenssl comman que funciona bien (el archivo está firmado y verificado).

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

Pero ahora necesito hacer esto en tiempo de ejecución, así que necesito firmar el archivo mediante programación. Estoy usandoBouncyCastle pero estoy abierto para cambiar a otra biblioteca.

No soy experto con certificados y menos aún conBouncyCastle. Esto es con lo que vine.

Los archivos correspondientes del comando openssl al código a continuación son:

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;
} 

Entonces guardo elbyte[] a un archivo Cuando abro el archivo (es un archivo MDM mobileConfig) dice "El archivo está firmado pero no se pudo verificar". Siento que estoy cerca de la solución, pero no sé qué estoy haciendo mal.

¿Alguien puede ayudarme a descubrir qué me falta para verificar el archivo?

PD; Los certs son de un certificado SSL (GoDaddy) y elbundleCertificate.crt es el certificado del paquete GoDaddy.

Respuestas a la pregunta(1)

Su respuesta a la pregunta