gpt4 book ai didi

java - 使用 S/MIME 对文件进行签名和加密

转载 作者:行者123 更新时间:2023-11-29 05:09:16 26 4
gpt4 key购买 nike

我目前正在尝试使用 OpenSSL 和 S/MIME 使用 Java 和 BouncyCaSTLe 调整我们用来签署加密/解密 xml 文件的一些脚本。

签名和加密文件的命令:

openssl smime -sign -signer Pub1.crt -inkey Priv.key -in foo.xml | openssl smime -encrypt -out foo.xml.smime Pub2.crt Pub1.crt

这会生成一个签名和加密的 smime 文件,其中包含我们的 xml 文件。目前,这发生在使用 OpenSSL 库的 linux 下的一组 shell 脚本中。将来我们希望将此过程集成到我们的 Java 应用程序中。

我发现这应该可以使用 BouncyCaSTLe 库(参见 this post )。那里的答案提供了两个 Java 类,展示了如何使用 BouncyCaSTLe 和 S/MIME 对电子邮件进行签名和加密。将此与我们的 OpenSSL 命令进行比较,我们的方法似乎不需要签署加密电子邮件所需的许多东西。

我们生成的文件中的一些更多元信息:

签名文件

MIME-Version: 1.0
Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg="sha-256"; boundary="----709621D94E0377688356FAAE5A2C1321"

加密文件

MIME-Version: 1.0
Content-Disposition: attachment; filename="smime.p7m"
Content-Type: application/x-pkcs7-mime; smime-type=enveloped-data; name="smime.p7m"
Content-Transfer-Encoding: base64

甚至可以像我们使用 OpenSSL 那样对一个简单的文件进行签名和加密吗?我目前对签名和解密/加密的了解不是很高,所以请原谅我没有提供代码示例。我想我正在寻找的是对我需要做的事情有更多的投入,也许是已经做过这件事的人的一些专业知识。我希望这是问这个问题的正确地方。如果不对,请指正。

最佳答案

我和你有类似的问题,但我设法解决了。我必须警告你,我对签名和加密的了解也不是那么多。但是这段代码似乎对我有用。

在我的例子中,我使用了来自 globalsign 的 personalsign pro 3 证书,之前我只是从 java 中调用 openssl。但是我想清理我的代码并决定改用充气城堡。

 public static boolean signAllFiles(List<File> files) {
Boolean signingSucceeded = true;
KeyStore ks = null;
char[] password = null;

Security.addProvider(new BouncyCastleProvider());
try {
ks = KeyStore.getInstance("PKCS12");
password = "yourpass".toCharArray();
ks.load(new FileInputStream("full/path/to/your/original/certificate.pfx"), password);
} catch (Exception e) {
signingSucceeded = false;
}

// Get privatekey and certificate
X509Certificate cert = null;
PrivateKey privatekey = null;

try {
Enumeration<String> en = ks.aliases();
String ALIAS = "";
Vector<Object> vectaliases = new Vector<Object>();

while (en.hasMoreElements())
vectaliases.add(en.nextElement());
String[] aliases = (String[])(vectaliases.toArray(new String[0]));
for (int i = 0; i < aliases.length; i++)
if (ks.isKeyEntry(aliases[i]))
{
ALIAS = aliases[i];
break;
}
privatekey = (PrivateKey)ks.getKey(ALIAS, password);
cert = (X509Certificate)ks.getCertificate(ALIAS);
// publickey = ks.getCertificate(ALIAS).getPublicKey();
} catch (Exception e) {
signingSucceeded = false;
}

for (File source : files) {
String fileName = "the/path/andNameOfYourOutputFile";

try {
// Reading files which need to be signed
File fileToSign = source;
byte[] buffer = new byte[(int)fileToSign.length()];
DataInputStream in = new DataInputStream(new FileInputStream(fileToSign));
in.readFully(buffer);
in.close();

// Generate signature
ArrayList<X509Certificate> certList = new ArrayList<X509Certificate>();
certList.add(cert);
Store<?> certs = new JcaCertStore(certList);
CMSSignedDataGenerator signGen = new CMSSignedDataGenerator();

ContentSigner sha1signer = new JcaContentSignerBuilder("SHA1withRSA").setProvider("BC").build(
privatekey);
signGen.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(
new JcaDigestCalculatorProviderBuilder().build()).build(sha1signer, cert));
signGen.addCertificates(certs);
CMSTypedData content = new CMSProcessableByteArray(buffer);
CMSSignedData signedData = signGen.generate(content, false);
byte[] signeddata = signedData.getEncoded();

// Write signature to Fi File
FileOutputStream envfos = new FileOutputStream(fileName);
byte[] outputString = Base64.encode(signeddata);
int fullLines = (int)Math.floor(outputString.length / 64);
for (int i = 0; i < fullLines; i++) {
envfos.write(outputString, i * 64, 64);
envfos.write("\r\n".getBytes());
}

envfos.write(outputString, fullLines * 64, outputString.length % 64);
envfos.close();
} catch (Exception e) {
signingSucceeded = false;
}
}
return signingSucceeded;
}

这只是对文件进行签名的代码,希望对您有所帮助。

关于java - 使用 S/MIME 对文件进行签名和加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29257451/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com