在 Java 中解码 Base64 JKS 信任库

Decode Base64 JKS Trust Store in Java

我尝试解码基于 64 个 JKS 信任库字符串。 当我使用 site 解码文件时,我得到了一个包含以下详细信息的可下载文件: 当我将它与 -Djavax.net.ssl.trustStore=path-to-file

一起使用时,该文件正在工作

现在我尝试使用 Java 自己解码文件并将其写入文件:

byte[] decoded = Base64.getDecoder().decode(data);
FileOutputStream fos = new FileOutputStream(new File(basePath));
fos.write(decoded);

这样我就得到了像����这样不可读的字符。

我也尝试将字节数组转换为字符串:

StringBuilder sbHexDump = new StringBuilder();
for (byte b : decoded) {
    sbHexDump.append(String.format("%02x", b));
}

这样我得到的 hexdump 与我从网站上下载的一样,但没有空格和换行符。 在这两种方式中,我都收到以下错误:

java.io.IOException: Invalid keystore format
    at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:663)
    at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:56)
    at sun.security.provider.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:224)
    at sun.security.provider.JavaKeyStore$DualFormatJKS.engineLoad(JavaKeyStore.java:70)
    at java.security.KeyStore.load(KeyStore.java:1445)

非常感谢你的帮助

This way I'm getting not readable characters like ���� .

是的,那又怎样? JKS 是一种二进制格式。并非所有字节都映射到可打印字符。只要keytool能读懂就可以了。

除了了解 base 64 编码方案 (https://en.wikipedia.org/wiki/Base64) 之外,您可能还需要了解有关字节放置的所有 big-endian 问题。编码只是取前 8 位,编码其中的 6 位,将接下来的 8 位连接到剩余的 2 位并对其中的 6 位进行编码,将接下来的 8 位连接到剩余的 4 位并编码其中的 6 位,并对最后 6 位进行编码。如果你在 3 字节组中命中 eof,有一个 = 填充系统对此进行编码。

唯一的技巧是从正确的一端取出你的位,并将你的位连接到正确的一端。如果你像整数一样编码二进制 non-byte 数据,你必须 big-endian 知道他们是如何编码它的,因为整数的低字节可能是第一个或第四个字节编码为小端或大端, 分别.

添加空格或换行等只是为了让文本编辑器、屏幕查看、电子邮件、人类等更容易接受。