2016-04-13 8 views
0

ファイルに署名する必要があり、今まで私はopensslというコマンドラインを使用しています(ファイルに署名して検証済みです)。Javaでファイルに署名するOpenSSLコマンドを複製します。

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

ファイルに署名できました。疑わしいように、私は最終的な解決策に近づいていました。ここに完全なコードがあります。

public byte[] signMobileConfig(byte[] mobileconfig) 
     throws CertificateEncodingException, PEMException, FileNotFoundException, IOException, CertificateException, OperatorCreationException, CMSException { 
    Security.addProvider(new BouncyCastleProvider()); 

    X509CertificateHolder caCertificate = loadCertfile(); 

    JcaX509CertificateConverter certificateConverter = new JcaX509CertificateConverter(); 
    X509Certificate serverCertificate = certificateConverter.getCertificate(loadSigner()); 

    PrivateKeyInfo privateKeyInfo = loadInKey(); 
    PrivateKey inKey = new JcaPEMKeyConverter().getPrivateKey(privateKeyInfo); 
    ContentSigner sha1Signer = new JcaContentSignerBuilder("SHA1withRSA").setProvider("BC").build(inKey); 

    CMSSignedDataGenerator generator = new CMSSignedDataGenerator(); 
    JcaDigestCalculatorProviderBuilder digestProviderBuilder = new JcaDigestCalculatorProviderBuilder().setProvider("BC"); 
    JcaSignerInfoGeneratorBuilder generatotBuilder = new JcaSignerInfoGeneratorBuilder(digestProviderBuilder.build()); 

    generator.addSignerInfoGenerator(generatotBuilder.build(sha1Signer, serverCertificate)); 
    generator.addCertificate(new X509CertificateHolder(serverCertificate.getEncoded())); 
    generator.addCertificate(new X509CertificateHolder(caCertificate.getEncoded())); 

    CMSProcessableByteArray bytes = new CMSProcessableByteArray(mobileconfig); 
    CMSSignedData signedData = generator.generate(bytes, true); 

    return signedData.getEncoded(); 
} 

そして、ここでは、私は、ファイルをロードする方法は次のとおりです。

public X509CertificateHolder loadSigner() throws FileNotFoundException, IOException { 
    InputStream inputStream = externalResourcesFacade.getResourceAsStream("path/to/.crt"); 
    PEMParser parser = new PEMParser(new InputStreamReader(inputStream)); 
    return (X509CertificateHolder) parser.readObject(); 
} 

public PrivateKeyInfo loadInKey() throws FileNotFoundException, IOException { 
    InputStream inputStream = externalResourcesFacade.getResourceAsStream("path/to/.key"); 
    PEMParser parser = new PEMParser(new InputStreamReader(inputStream)); 
    return (PrivateKeyInfo) parser.readObject(); 
} 

public X509CertificateHolder loadCertfile() throws FileNotFoundException, IOException { 
    InputStream inputStream = externalResourcesFacade.getResourceAsStream("path/to/.crt"); 
    PEMParser parser = new PEMParser(new InputStreamReader(inputStream)); 
    return (X509CertificateHolder) parser.readObject(); 
} 
関連する問題