获取KeyStore实例时的NPE

时间:2015-07-13 17:31:24

标签: java ssl keystore pkcs#12

我有这个简单的代码,有一段时间了。基本上我正在尝试获取密钥库实例,以便我可以使用它来启用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)

我该怎么办?

1 个答案:

答案 0 :(得分:1)

这个问题有点老了但是谷歌的问题接近顶部,所以我会尽力帮忙。

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

algorithm = algorithm.toUpperCase(ENGLISH);

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

看起来它只是通过了所有这些层;请参阅at java.security.Security.getImpl(Security.java:695) - 算法是第一个在那里传递的参数。

再打开一个:at java.security.KeyStore.getInstance(KeyStore.java:848) - 您在这里传递的参数称为“类型”,但这就是Security.getImpl传递给algorithm的内容。

因此,当您调用type时,错误是您为KeyStore.getInstance()参数传递了null。这似乎与您列出的源代码不符,因此您可能没有正确编译代码。添加“健全性检查” - 例如,代码中的println;并查看您的代码中的哪个行号在堆栈跟踪的下方显示。