我正在按如下方式加载密钥库:
try
{
ks = KeyStore.getInstance("BKS", "BC");
ks.load(ksStream, ksPass);
}
catch (IOException e)
{
if (e.getCause() instanceof UnrecoverableKeyException)
System.err.println("Wrong password!");
}
问题是该异常的原因不是由充气城堡设置的(它为空)。
该如何解决?
答案 0 :(得分:0)
无法确定是否无法正确加载BKS密钥库是由于密码错误,数据损坏或两者导致的。这种不确定性的原因是因为BKS格式中没有专门用于测试密码正确性的字段。可用的是在密钥库的主体上计算出的消息身份验证代码(MAC)。如果MAC检查成功,则您可以确信所有内容(包括密码)都是正确的。如果MAC失败,则问题可能出在密码或数据损坏,或两者都有。
使用IOException
来传达此问题是一个糟糕的选择,并且可能是Sun工程师的原始设计的痕迹。由于Bouncycastle仅仅是JCE框架中的引擎,因此它们必须遵守KeyStore.load()
的签名,包括异常规范。我查看的Bouncycastle的版本在异常中包含一条详细消息"KeyStore integrity check failed."
,该消息至少可以识别由MAC故障引起的异常,而不是实际的I / O问题。