2012-10-04 114 views
2

我手頭有問題。我的同事,誰不知道Java的使用OpenSSL的命令簽署一份文件,如下所示:用Bouncy Castle在Java中複製'openssl smime'?

openssl smime -binary -sign -certfile WWDR.pem -signer passcertificate.pem \ 
    -inkey passkey.pem -in manifest.json -out signature -outform DER \ 
    -passin pass:12345 

正如你可以看到這裏有三個文件都送給了OpenSSL的命令生成簽名。

現在我們想要使用Java複製相同的功能,因爲我們假設要簽名的內容將是動態的並且是服務器端的本質。我讀過BouncyCastle是要走的路。但我不知道如何去使用這個庫。我對密碼技術也不是很熟悉。我無法理解如何使用上述所有三個文件在manifest.json中籤署內容。

如果有人可以請指導我正確的代碼或給我一個開始,我會非常感謝你的努力。

+0

這有點過於寬泛的一個問題拉吉。如果你無法在互聯網上找到它,任何人都不可能拿出一個完整的例子。 –

回答

0

因此,如果有人想知道我是如何解決上面我在這裏的問題是我做過什麼:

我用Java的運行對象!

String openSSLCommand = openssl smime -binary 
-sign -certfile WWDR.pem -signer passcertificate.pem 
-inkey passkey.pem -in manifest.json -out signature -outform DER 
-passin pass:12345 

Process process = Runtime.getRuntime().exec(openSSLCommand); 

謝謝大家

2

首先,不要爲努力去理解BouncyCastle而感到難過。這是一個非常有用的API,但記錄不完整。最好的選擇是搜索周圍的例子,這些例子將教你如何使用API​​。

由於我沒有用BouncyCastle的用於SMIME之前(我主要是用它的PGP和/或JCE)爲「bouncycastle smime example」一個簡短的追捕已經給我買了到this page具體而言,this example

希望這是一個好的開始,從中進一步的谷歌將幫助理解使用的API類。我懷疑這個例子會讓你有80%的選擇。


但如果是你輸入文件的目的的任何困惑:

-certfile WWDR.pem - 這是一個額外的證書在郵件中註明。簽名消息的收件人在驗證簽名時會考慮此證書。

​​- 這是直接對應於您的簽名密鑰的證書。

-inkey passkey.pem - 這是你的簽名密鑰

2

我也不得不復制在java中了OpenSSL命令,這是我如何完成它。無需使用運行時。

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

這是我的文件映射:

myCrtFile.crt -> signerCertHolder 
myKeyFile.key -> privateKeyInfo 
bundleCertificate.crt -> certificateHolder 
相關問題