【发布时间】:2016-09-30 16:33:00
【问题描述】:
我有一个为我创建证书的外部服务,我从中收到一个缓冲区(字符串)。我尝试将此缓冲区加载到 Java 中的 KeyStore 中,然后使用“存储”函数来创建一个 .p12 文件。但是,store 函数会引发异常 - “Given final block not proper padding”。
无论我如何尝试,我都无法使其正常工作或找到问题的原因。
我的代码是:
public void createP12Certificate(String userName, String comment) throws KeyStoreException, AdminCertificateException, CertificateException, NoSuchAlgorithmException, IOException
{
KeyStore store = KeyStore.getInstance("PKCS12");
/* Some Code that gets 'buff' etc. */
byte[] byteBuff = hexStringToByteArray(buff);
Arrays.reverse(byteBuff);
InputStream inputStream = new ByteArrayInputStream(byteBuff);
store.load(inputStream, password.toCharArray());
OutputStream outputStream = new FileOutputStream(userName+".p12");
store.store(outputStream,anotherPassword); //Throws Exception
}
非常感谢!
【问题讨论】:
-
您接收内容的格式是什么? hexStringToByteArray 和 Arrays.reverse 的组合很奇怪
-
我正在尝试复制当前在 C# 上运行的代码,因此可以访问 Java 中的 .net 函数。 Java 和 C# 都使用提供缓冲区(证书内容)的外部 Web 服务。由于这是一个十六进制字符串并且 KeyStore 需要一个字节数组,因此我需要使用 hexStringToByteArray。如果我不反转字节数组,Java 会在“加载”方法中引发异常——数据不是 PKCS12 格式。 C# 反转字节数组,所以我也反转了它。 Java 不再在“加载”中抛出异常,但现在它在“存储”中抛出异常,正如我所描述的那样。
-
C# 和 java 中的十六进制转换 -> 字节 -> 反转可能不一样。我建议您确保服务器返回的格式,例如使用支持将十六进制字节转换为记事本 ++ 的文本编辑器。没有看到文件,我无能为力
标签: java encryption certificate pkcs#12