ファイルに署名する必要があり、今まで私は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バンドル証明書です。