在KeyStore.load()中使用日语密码会导致java.io.IOException:Keystore被篡改,或者密码不正确

时间:2012-10-10 04:29:41

标签: java unicode keystore

我使用以下方法创建了一个密钥库:

  

keytool -genkey -keystore myKeyStore -alias我自己

我给的密码是日文,即“myPasswordは” 我使用以下代码加载密钥库文件

String KEYSTORE_FILE="C:/myKeyStore";//Path to the keystore file on disk.
PASSWORD="myPasswordは";//Password

KeyStore.getInstance("JKS").load(new FileInputStream(KEYSTORE_FILE),PASSWORD.toCharArray());

以上引发了以下异常: java.io.IOException:密钥库被篡改,或密码不正确。

如果我使用英文密码创建密钥库并在代码中使用相同的密码,那么它可以正常工作。

最初我使用以下命令创建了密钥库: keytool -genkey -keystore myKeyStore -alias mks 这将提示我输入密码,我输入myPasswordは,然后输入后续详细信息。在这种情况下,代码会生成上述异常。

有趣的是,如果我使用以下方法创建密钥库: keytool -genkey -keystore myKeyStore -alias mks -storepass myPasswordは 那么我上面给出的代码工作正常。我正在使用linux。

2 个答案:

答案 0 :(得分:2)

好吧,根据描述,我猜控制台不会按预期处理unicode字符。您可以尝试使用PowerShell或尝试通过执行chcp 65001命令将cmd.exe的代码页更改为UTF-8(请注意,这会扭曲控制台显示行为,但它会正确接受输入)。

答案 1 :(得分:2)

此问题的根本原因是keytool实用程序无法正确解码在提示符下输入的非ascii密码。

这是一个已知问题,可在http://bugs.sun.com/bugdatabase/view_bug.do;jsessionid=53546691146578386c644cb554976?bug_id=6433238

找到

因此,解决方案是创建一个密钥库,密码未在提示符下输入。这可以通过以下方式完成:

keytool -genkey -keystore myKeyStore -alias myAlias -storepassすてきなパスワード