首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >算法HmacPBESHA256不可用

算法HmacPBESHA256不可用
EN

Stack Overflow用户
提问于 2016-10-01 02:22:22
回答 3查看 11.2K关注 0票数 11

因此,我编写了一些代码来获取PEM,通过bouncycastle将其添加到PKCS密钥库,然后使用java crypto将PKCS密钥库的值导入JKS密钥库。

我发誓昨天我成功地通过了单元测试,执行了这些步骤,但是今天早上我开始这样做

代码语言:javascript
运行
复制
Caused by: java.security.NoSuchAlgorithmException: Algorithm HmacPBESHA256 not available
    at javax.crypto.Mac.getInstance(Mac.java:181) ~[na:1.8.0_60]
    at sun.security.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:2039) ~[na:1.8.0_65]

现在,总有可能是我的内心发生了变化,但我搞不清楚是什么。看起来不管我的供应商是什么

曾经是自那以后,用于该算法的方法就消失了。

下面是我的java.security文件片段:

代码语言:javascript
运行
复制
security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=sun.security.ec.SunEC
security.provider.4=com.sun.net.ssl.internal.ssl.Provider
security.provider.5=com.sun.crypto.provider.SunJCE
security.provider.6=sun.security.jgss.SunProvider
security.provider.7=com.sun.security.sasl.Provider
security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.9=sun.security.smartcardio.SunPCSC
security.provider.10=apple.security.AppleProvider

代码中没有太多东西。首先,我通过bouncycastle创建一个PKCS密钥库,添加一个pem并作为PKCS12保存到磁盘。然后通过java crypto导入,保存回JKS。

代码语言:javascript
运行
复制
public KeystoreBuilder createJksFromPem(String pemPrivate, String pemPublic, String alias) throws Exception
    {
        Preconditions.checkState(StringUtils.isNotEmpty(pemPrivate), "pemPrivate must not be empty");
        Preconditions.checkState(StringUtils.isNotEmpty(pemPublic), "pemPublic must not be empty");
        Preconditions.checkState(StringUtils.isNotEmpty(alias), "alias must not be empty");

        String pkcsFilename = filename + ".pkcs";
        convertPemToPkcs(pemPrivate, pemPublic, pkcsFilename);

        importPkcsIntoJks(pkcsFilename);

        return this;
    }

    private void importPkcsIntoJks(String pkcsFilename) throws Exception
    {
        KeyStore pkcs = KeyStore.getInstance("PKCS12");
        File pkcsFile = new File(pkcsFilename);
        try (FileInputStream fis = new FileInputStream(pkcsFile))
        {
            pkcs.load(fis, password.toCharArray());
        }
        pkcsFile.delete();

        KeyStore jks = KeyStore.getInstance("JKS");
        jks.load(null);

        Enumeration aliases = pkcs.aliases();
        while (aliases.hasMoreElements())
        {
            String alias = aliases.nextElement();
            if (!pkcs.isKeyEntry(alias))
            {
                continue;
            }
            Key key = pkcs.getKey(alias, password.toCharArray());
            Certificate[] chain = pkcs.getCertificateChain(alias);

            jks.setKeyEntry(alias, key, password.toCharArray(), chain);
        }

        persist(jks);
    }

    private void convertPemToPkcs(String pemPrivate, String pemPublic, String pkcsFilename) throws IOException, NoSuchAlgorithmException, OperatorCreationException, PKCSException, FileNotFoundException
    {
        Security.addProvider(new BouncyCastleProvider());

        X509CertificateHolder cert = (X509CertificateHolder) readObject(pemPublic);
        PEMKeyPair keyPair = (PEMKeyPair) readObject(pemPrivate);

        JcaX509ExtensionUtils extUtils = new JcaX509ExtensionUtils();
        PKCS12SafeBagBuilder pkcs12BagBuilder = new PKCS12SafeBagBuilder(cert);
        pkcs12BagBuilder.addBagAttribute(PKCSObjectIdentifiers.pkcs_9_at_friendlyName, new DERBMPString("Kafka SSL Certificate"));
        pkcs12BagBuilder.addBagAttribute(PKCSObjectIdentifiers.pkcs_9_at_localKeyId, extUtils.createSubjectKeyIdentifier(keyPair.getPublicKeyInfo()));

        PKCS12PfxPduBuilder builder = new PKCS12PfxPduBuilder();

        builder.addData(pkcs12BagBuilder.build());

        builder.addEncryptedData(new JcePKCSPBEOutputEncryptorBuilder(PKCSObjectIdentifiers.pbeWithSHAAnd128BitRC2_CBC).setProvider("BC").build(password.toCharArray()), pkcs12BagBuilder.build());

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

        try (FileOutputStream fos = new FileOutputStream(new File(pkcsFilename)))
        {
            fos.write(pfx.getEncoded(ASN1Encoding.DL));
        }
    }

然后它就爆炸了

代码语言:javascript
运行
复制
pkcs.load(fis, password.toCharArray());

如您所见,BouncyCastleProvider是显式添加的。有什么建议吗?更新:谢谢dave_汤普森_085的建议。不敢相信我没有看到那个重载的方法,但解决方案是在get Keystore.getInstance("PKCS12","BC")调用中指定提供者。

EN

Stack Overflow用户

发布于 2021-02-23 00:15:15

The HmacPBESHA256听起来像是解密文件后验证完整性的算法。您可以解密您的Keystore并再次加密,这可能不使用HmacPBESHA256。

在我的例子中,我使用Windows工具(即"Microsoft Strong Cryptographic Provider")生成密钥。默认情况下,pfx使用HmacPBESHA256,这是Java 11不支持的。

解决方案是创建一个新的密钥库,但使用.openssl。为此,我运行:

代码语言:javascript
运行
复制
openssl pkcs12 -in "your_keystore.pfx" -nodes | openssl pkcs12 -export -out "new_keystore.pfx"

这是有效的jarsign/apksign,通过提供new_keystore.pfx

作为密钥库。

票数 3
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39797759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档