InvalidAlgorithmParameterException:trustAnchors 参数必须非空

boh*_*anl 5 java pki keytool

我从我的 java 代码中收到这个奇怪的错误:

java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
Run Code Online (Sandbox Code Playgroud)

我用来生成密钥库的命令: keytool -genkey -alias tomcat -keystore keystore.jks

这是我的java代码:

import java.security.cert.PKIXParameters;
import java.security.KeyStore;
import java.io.FileInputStream;

public class MyKeyTest {
    public static void main(String[] args) throws Exception {
        KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
        String password = "mypass";
        ks.load(new FileInputStream("keystore.jks"), password.toCharArray());
        new PKIXParameters(ks);
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图用谷歌搜索这个错误,但大多数情况下它说当找不到密钥库或不允许读取密钥库时会发生这种情况。

但对于我来说,这两种情况都不成立。有任何想法吗?

San*_*eev 3

一些简短和简化的背景以防不清楚。PKIXParameters 对象用于客户端证书验证。这是您允许或禁止访问您的网络资源的一种方式。这通常的工作方式是

  • 您有一个您信任的证书颁发机构 (CA) 证书列表(这是您的信任存储区)。
  • 您的应用程序要求客户端提供数字证书(客户端证书
  • 客户端证书将包括签署客户端证书的CA 证书。如果CA 证书在您的列表中,则客户端通过验证

keystore.jks 文件是您的信任存储区。您的信任存储当前不包含任何证书(只是一个无用的私钥)。要添加 ca 证书,您可以使用此命令

keytool -import -alias <an alias for the CA cert> -file <the trusted CA cert> -keystore <your keystore>
Run Code Online (Sandbox Code Playgroud)

例如,将 CA 证书从浏览器导出到文件,然后将其导入到您的信任存储中

  • 转到控制面板/互联网选项/内容选项卡,然后单击证书。
  • 选择“受信任的根证书颁发机构”选项卡并选择一个证书(例如“Microsoft 根证书颁发机构”)
  • 单击导出并将其保存到文件(在本例中我使用“msroot.cer”)。
  • 在命令提示符下运行以下命令

    keytool -import -alias msroot -file msroot.cer -keystore keystore.jks

现在,当您使用此更新的 keystore.jks 运行 Java 代码时,它应该运行得很好。