2017年12月30日更新-4:
我已经成功解包了.jks
文件并从中提取了密钥和证书。为了做到这一点,我编写了一个小的nodejs程序,受signerbox2
开源项目启发,该项目使用.jks
来签署数据。特别地,我使用了jksreader
npm包,它只存在几天!
我编写的程序看起来像这样:
const fs = require('fs');
jksreader = require('jksreader'),
pathToFile = process.argv[2],
password = process.argv[3],
contents = fs.readFileSync(pathToFile),
parsedContent = jksreader.parse(contents);
var key = jksreader.decode(parsedContent.material[0].key, password);
fs.writeFileSync('key', key);
for (var i = 0; i < parsedContent.material[0].certs.length; i++) {
var cert = parsedContent.material[0].certs[i];
fs.writeFileSync('cert' + i, cert);
}
该程序被如下调用:
node index.js /path/tp/my_key.jks my_password
输出看起来像一堆文件:
cert0
cert1
cert2
cert3
key
证书采用 DER 格式,并可以按照以下方式读取(注意参数
-engine dstu
):openssl x509 -in cert2 -inform der -text -noout -engine dstu
然而,我无法弄清楚如何读取(或转换为PEM格式)该密钥。我仍在努力中。
openssl asn1parse
可以在密钥文件上很好地运行。这是 openssl asn1parse
的 输出。我不确定下一步该怎么做。更新于2017年12月28日-3:
我安装了 Keystore Explorer。它也无法提取私钥。它可以显示比我用
keytool
获得的更多信息。唯一奇怪的事情是,有两个几乎完全相同的证书副本,以我的名字(大写)命名:
这里的提示表示该条目遵循DSTU-4145标准:
2017年12月28日更新-2:
.jks
文件中包含的密钥遵循或与“DSTU-4145签名方案”(算法)相关。这是乌克兰的一项政府标准。
我对签名方案几乎一无所知;例如,DSTU-4145可以在BouncyCastle 规范页面上找到。
也许我需要安装DSTU-4145算法,以便keytool
知道如何提取私钥?
2017年12月28日更新-1:
在Ubuntu上使用以下版本的Java进行此操作:
$ java -version
java version "1.7.0_151"
OpenJDK Runtime Environment (IcedTea 2.6.11) (7u151-2.6.11-2ubuntu0.14.04.1)
OpenJDK 64-Bit Server VM (build 24.151-b01, mixed mode)
同样不适用于 macOS 下以下版本的 Java:
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)
我从官方机构获得了一个 .jks
文件。
我想将 .jks
文件转换为 .pkcs12
文件,以便使用 openssl 签署实际内容。但是,我遇到了错误。
这是我的操作步骤:
$ keytool -importkeystore \
-srckeystore my_keystore.jks \
-destkeystore my_keystore.pkcs12 \
-deststoretype pkcs12
Enter destination keystore password:
Re-enter new password:
Enter source keystore password:
Enter key password for <my_key>
keytool error: java.security.UnrecoverableKeyException: excess private key
然而,同时,密钥可以被列出:
$ keytool -list -keystore my_key.jks
Enter keystore password:
Keystore type: JKS
Keystore provider: SUN
Your keystore contains 1 entry
my_key, Jan 18, 1970, PrivateKeyEntry,
Certificate fingerprint (SHA1): A1:B2:C3:D4:E5:F6:85:E4:2B:03:B9:68:FD:AE:9D:5B:24:CF:BF:FF
我做错了什么?
my_key.pkcs12
吗?不,我刚刚检查过,任何地方都没有这样的文件。 - oldhomemoviekeytool -list
带有-v
参数应该显示完整的证书链,而重复的名称确实很奇怪,但无法帮助查找私钥问题。(2) 使用该密钥的代码需要像 BC 这样的提供程序,但 keytool 不需要。(3) 错误消息在sun.security.pkcs.PKCS8Key.parseKey
中,并提示写入系统中存在错误,但我无法从sun.security.provider.KeyProtector
中进行隔离,这使得确认此问题非常困难。该机构是否以其他形式提供密钥(和证书)?他们是否提供任何测试或虚拟密钥,你可以安全地公开使用? - dave_thompson_085.jks
文件:我现在有了证书和密钥,它们都是单独的文件。现在我正在努力确定密钥的格式,以便能够实际使用它。 - oldhomemovie