gpt4 book ai didi

java - 处理 PKCS12 keystore 时的 keytool 与 FIPS

转载 作者:行者123 更新时间:2023-11-30 07:46:50 29 4
gpt4 key购买 nike

背景:什么有效

我们有时不得不使用读取 PKCS#12 keystore 的 Java 软件。对于这个特定的项目,我们必须根据需要创建公共(public)/私有(private)对,并且我们将 key 存储在 PKCS12 文件中,因为它很稳定并且几乎所有东西都可以读取该格式。

因为我们在内部做了很多 Java,所以我们有 keytool,所以我们想嘿,只需使用 keytool 来创建私钥和证书。一个典型的实例如下所示:

keytool -keystore MyLuggage.p12 -storepass 123456 -storetype pkcs12
-alias "......"
-genkeypair -keyalg RSA -keysize typically_2048_or_3072 -sigalg SHA256withRSA

-ext "KeyUsage=dataEncipherment,digitalSignature,keyEncipherment"
-startdate ....
-dname "......."

实际的 -keysize 实际上在 2048 和 8192 之间变化;出于这个问题的目的,使用什么似乎没有什么不同,但显然,如果我们完全选择它们,我们会使用适合任务的 key 长度(通常由其他软件的约束决定,或由交给我们的一些规定)。

这一直有效,因为其他软件——包括开头提到的 Java 软件——可以读取 keystore 并使用其中的私钥。 (并且公钥可以导出使用等)

这就是问题所在

该软件最近升级到使用来自 RSA 的 FIPS 140 认证 Java 库的版本。 (“BSAFE”或“JSAFE”取决于你问的是谁。)现在,尝试打开以前创建的 PKCS#12 文件失败了

java.lang.SecurityException: Algorithm not allowable in FIPS140 mode: PBE/PKCS12/SHA1/RC2/CBC/40
at ......
at java.security.KeyStore.load(Unknown Source)

被省略的......帧在我们没有的RSA源中,并且看起来使用在任何情况下都被混淆的函数名称。因此,查看他们的来源以尝试找出它到底在测试什么导致这种情况,这不是一种选择。

那么, 是什么原因造成的?我们选择的唯一算法是“RSA” key 生成和“SHA256withRSA”签名,FIPS 140-2 允许这两种算法。我再次查看了 keytool -genkeypair -help 输出,似乎没有任何其他算法或安全选项。 (我们避免使用 -keypass 因为当 keystore 密码和 key 密码不同时 PKCS#12 工具真的很讨厌它,并且 keytool -genkeypair 将 key 密码默认为 keystore 密码。)错误消息的其余部分令人困惑,因为我们没有在任何地方指定使用 SHA-1 或 RC2 (!)。

谷歌搜索指出人们在创建 SSL 证书时遇到了麻烦,我们在这里没有这样做,并且给出的解决方案似乎是特定于 Tomcat 的。

这是我们创建 keystore 的方式的问题,我们 keystore 中创建 key 对的方式的问题,还是我们以前没有遇到过的 FIPS 140 的某些“功能” ?

最佳答案

PKCS#12 存储使用密码派生 key 加密的私钥。看起来 keytool 使用 pbeWithSHAAnd128BitRC2-CBC (pkcs-12PbeIds 5),这是一种用于执行此操作的 PBES1 算法。甚至 Oracle Java 9 的 keytool.exe 也使用此算法,您可以通过将 .p12 文件上传到 online ASN.1 decoder decoding a sample PKCS#12 file 来验证。

如果我正确阅读了 PKCS#12 standard,PBES1 很久以前就被名为“PBES2”(主要基于 PBKDF2)的“较新”版本的 key 派生系统取代,应该改用它。但是 keytool 没有使用它。这是我对错误消息的解释。

因此证书和 key 可能是可接受的,但 PKCS#12 容器是 Not Acceptable 。您可以尝试使用 OpenSSL 等当前软件提取 key 和证书并将它们保存在新的 PKCS#12 文件中(或者您直接使用 OpenSSL 直接生成整个 PKCS#12 文件)。

OpenSSL 可以选择指定用于 key 和证书加密的 PBE(PKCS#12 模式下的参数 -keypbe-certpbe)。我没有检查过,但是像 AES-256-CBC 这样的算法应该与 FIPS140 兼容。

关于java - 处理 PKCS12 keystore 时的 keytool 与 FIPS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50335852/

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