获取KeyStore实例时NPE

NPE when obtaining KeyStore instance

我有这个简单的代码,它在一段时间前就可以工作了。基本上我正在尝试获取密钥库实例,以便我可以使用它来启用 ssl。 我现在的问题是我得到了下面的空指针异常并且似乎无法在任何地方找到解决方案。 我在 ubuntu 15.04 32 位上使用 openjdk 8。

//Do other initializations things
...
KeyStore ks = KeyStore.getInstance("PKCS12");
KeyStore ts = KeyStore.getInstance("PKCS12");

char[] keymanagerPassPhrase = keymanagerPassPhraseString.toCharArray();
char[] keystorePassPhrase = keystorePassPhraseString.toCharArray();
char[] truststorePassPhrase = truststorePassPhraseString.toCharArray();

ks.load(new FileInputStream(keystoreFile), keystorePassPhrase);

KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, keymanagerPassPhrase);

TrustManager[] trustManagers = null;
    if( useCustomTrustStore ) {
         ts.load(new FileInputStream(truststoreFile), truststorePassPhrase);

         TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
            tmf.init(ts);

         trustManagers = tmf.getTrustManagers();
        }
        SSLContext sslContext = SSLContext.getInstance(protocal);

        sslContext.init(kmf.getKeyManagers(), trustManagers , null);

        return sslContext.createSSLEngine();

抛出的异常是:

Caused by: java.lang.NullPointerException
at java.security.Provider$ServiceKey.<init>(Provider.java:872)
at java.security.Provider$ServiceKey.<init>(Provider.java:865)
at java.security.Provider.getService(Provider.java:1039)
at sun.security.jca.ProviderList.getService(ProviderList.java:332)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:157)
at java.security.Security.getImpl(Security.java:695)
at java.security.KeyStore.getInstance(KeyStore.java:848)

我该如何继续?

这个问题有点老,但在这个问题的 Google 结果中接近顶部,所以我会尽力提供帮助。

要在 Java 的代码库中调试 NPE,您只需要确保您的 IDE 中有可用的 Java 源代码;然后您可以检查有关什么是 null 的提示。您似乎正在使用 JDK 8,所以是这一行:

algorithm = algorithm.toUpperCase(ENGLISH);

此外,ServiceKey init 方法(构造函数)中没有其他可能导致 NPE 的内容。那么... String algorithm 参数从哪里来,传递给这个构造函数?

看起来它刚刚通过了所有这些层;参见 at java.security.Security.getImpl(Security.java:695) -- algorithm 是传入的第一个参数。

再展开一个:at java.security.KeyStore.getInstance(KeyStore.java:848) -- 您在此处传递的参数称为 "type",但这就是作为 algorithm.[=18 传递给 Security.getImpl 的参数=]

所以错误是当您调用 KeyStore.getInstance() 时,您为 type 参数传递了 null。这似乎与您列出的源代码不匹配,因此您可能没有正确编译代码。添加一个 "sanity check" —— 例如,在你的代码前面添加一个 println;并查看 你的 代码中的行号在堆栈跟踪的下方指示。