Java 如何使用privatekey encryption PBEWIHMACSHA512ANDAES_128创建PKCS12密钥库

Java 如何使用privatekey encryption PBEWIHMACSHA512ANDAES_128创建PKCS12密钥库,java,encryption,keystore,pkcs#12,p12,Java,Encryption,Keystore,Pkcs#12,P12,我需要在Scala/Java中构建一个PKCS-12文件,我希望使用基于AES的私钥加密(例如PBewithhmacsha512andaes128) 我使用此代码(取自) 现在,当使用 openssl pkcs12 -info -in filename.p12 -noout 我得到: MAC:sha1迭代100000 PKCS7数据隐藏密钥包: PBES2 PKCS7加密数据: PBEWISHA1和40BITRC2 CBC,迭代50000证书包' 为什么我得到的是“PKCS7加密数据”而不

我需要在Scala/Java中构建一个PKCS-12文件,我希望使用基于AES的私钥加密(例如PBewithhmacsha512andaes128)

我使用此代码(取自)

现在,当使用

 openssl pkcs12 -info -in filename.p12  -noout
我得到:

MAC:sha1迭代100000 PKCS7数据隐藏密钥包: PBES2 PKCS7加密数据: PBEWISHA1和40BITRC2 CBC,迭代50000证书包'

为什么我得到的是“PKCS7加密数据”而不是PKCS12? 我从报纸上了解到

“PBES2”

提供程序不支持请求的算法的消息。是否有PKCS12提供程序可以这样做

为什么我得到的是“PKCS7加密数据”而不是PKCS12

是一组规范,即每个较高级别的规范重复使用较低级别的规范

在PKCS#12的情况下,我们至少会遇到:

  • PKCS#12(密钥库格式)
  • PKCS#7(签名/加密邮件)
  • PKCS#5(PBKDF2)
  • PKCS#9(信息摘要)
  • PKCS#8(密钥对格式)
因此,在输出中看到与PKCS#7相关的消息是正常的

我从“
PBES2
”中了解到,提供商不支持请求的算法

是的,这是Java中的一个bug。内置JCE提供程序在输出流中错误地对PBES2标记编码两次:

偶尔

下面是它产生的结果(我将HMAC SHA256与AES256一起使用):

$openssl asn1parse-notify der-strparse 97344:d=6 hl=2 l=9 prim:OBJECT:PBES2为什么标记Java?Java密钥存储(JKS)和PKCS12是两种不同的密钥存储文件格式。如果您使用的是PKCS12,那么它与Java无关。我标记了Java,因为我试图用Java实现PKCS12文件格式的创建。正如您从代码中看到的,我没有使用默认的密钥存储类型(JKS)。这段代码是写在JSP还是什么东西里面的?它是使用Java库的Scala。
 openssl pkcs12 -info -in filename.p12  -noout
public void derEncode (OutputStream out) throws IOException {
    DerOutputStream bytes = new DerOutputStream();
    DerOutputStream tmp = new DerOutputStream();

    bytes.putOID(algid);                               // <<< Writes 1.2.840.113549.1.5.13
protected byte[] engineGetEncoded() throws IOException {
    DerOutputStream out = new DerOutputStream();
    DerOutputStream pBES2Algorithms = new DerOutputStream();
    pBES2Algorithms.putOID(pkcs5PBES2_OID);            // <<< Writes 1.2.840.113549.1.5.13 again
Security.addProvider(new BouncyCastleProvider());
File file = new File("test.p12");
char[] password = "test".toCharArray();

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048);
KeyPair keypair = keyGen.genKeyPair();
X500Name issuer = new X500Name("CN=test");
X500Name subject = new X500Name("CN=test");
BigInteger serial = new BigInteger("1");
Date notBefore = new Date();
Date notAfter = new Date(System.currentTimeMillis() + 365 * 24 * 3600000L);
JcaX509v3CertificateBuilder certBuilder = new JcaX509v3CertificateBuilder(issuer, serial, notBefore, notAfter, subject, keypair.getPublic());
ContentSigner signer = new JcaContentSignerBuilder("SHA256WithRSA").build(keypair.getPrivate());
certBuilder.addExtension(new ASN1ObjectIdentifier("2.5.29.19"), true, new BasicConstraints(true));
X509Certificate cert1 = new JcaX509CertificateConverter().getCertificate(certBuilder.build(signer));

OutputEncryptor pkenc = new JcePKCSPBEOutputEncryptorBuilder(NISTObjectIdentifiers.id_aes256_CBC)
    .setPRF(PBKDF2Config.PRF_SHA256).setIterationCount(100000).setProvider("BC").build(password);

JcaX509ExtensionUtils extUtils = new JcaX509ExtensionUtils();
PKCS12SafeBagBuilder certBagBuilder = new JcaPKCS12SafeBagBuilder(cert1);

certBagBuilder.addBagAttribute(PKCS12SafeBag.friendlyNameAttribute, new DERBMPString("test"));
SubjectKeyIdentifier pubKeyId = extUtils.createSubjectKeyIdentifier(cert1.getPublicKey());
certBagBuilder.addBagAttribute(PKCS12SafeBag.localKeyIdAttribute, pubKeyId);

PKCS12SafeBagBuilder keyBagBuilder = new JcaPKCS12SafeBagBuilder(keypair.getPrivate(), pkenc);

keyBagBuilder.addBagAttribute(PKCS12SafeBag.friendlyNameAttribute, new DERBMPString("test"));
keyBagBuilder.addBagAttribute(PKCS12SafeBag.localKeyIdAttribute, pubKeyId);

PKCS12PfxPduBuilder builder = new PKCS12PfxPduBuilder();

builder.addData(keyBagBuilder.build());

OutputEncryptor crtenc = new JcePKCSPBEOutputEncryptorBuilder(PKCSObjectIdentifiers.pbeWithSHAAnd128BitRC2_CBC)
    .setIterationCount(50000).setProvider("BC").build(password);

builder.addEncryptedData(crtenc, new PKCS12SafeBag[]{certBagBuilder.build()});

PKCS12PfxPdu pfx = builder.build(new JcePKCS12MacCalculatorBuilder(NISTObjectIdentifiers.id_sha256), password);

try (FileOutputStream out = new FileOutputStream(file)) {
    out.write(pfx.getEncoded(ASN1Encoding.DL));
}