KeyStore [ java.lang.IllegalArgumentException: missing provider ] [BouncyCastle]

KeyStore [ java.lang.IllegalArgumentException: missing provider ] [BouncyCastle]

源码展示

KeyStore ks = KeyStore.getInstance("PKCS12", getProvider());
FileInputStream fis = new FileInputStream(pfxPath);
// If the keystore password is empty(""), then we have to set
// to null, otherwise it won't work!!!
char[] nPassword = null;
if ((pfxPassword == null) || pfxPassword.trim().equals("")) {
    nPassword = null;
} else {
    nPassword = pfxPassword.toCharArray();
}
ks.load(fis, nPassword);
fis.close();

KeyStore 是Java提供的一个类,用于存储私钥和公钥证书;在获取KeyStore实例时出现异常错误

错误信息

错误信息
错误信息为:IllegalArgumentException:缺少提供程序
BouncyCastle 注册后,提示内容不存在

问题分析

1.错误原因

报错位置源码如下:

    public static KeyStore getInstance(String type, Provider provider)
        throws KeyStoreException
    {
        if (provider == null)
            throw new IllegalArgumentException("missing provider");
        try {
            Object[] objs = Security.getImpl(type, "KeyStore", provider);
            return new KeyStore((KeyStoreSpi)objs[0], (Provider)objs[1], type);
        } catch (NoSuchAlgorithmException nsae) {
            throw new KeyStoreException(type + " not found", nsae);
        }
    }

根据以上代码可以看出,异常原因为: Provider 为 null 出现错误;

而获取 Provider 实例 使用方法如下:

private static Provider getProvider() {
       return Security.getProvider(BouncyCastleProvider.PROVIDER_NAME);
}

获取 Provider实例 从Java的Security类中获取一个安全提供者实例,该提供者实现了BouncyCastle加密库的功能;
BouncyCastle 注册后,内容不存在;

2.错误排查
BouncyCastle版本验证

使用代码查看调用版本,判断BouncyCastle 是否存在;是否与引入版本一致

System.out.println( "version=" + Security.getProvider(BouncyCastleProvider.PROVIDER_NAME).getVersion());
引入版本不一致

如果引入版本与查看版本不一致的话,对Provider移除;

Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME);
添加Provider实例

a.在执行版本验证时,依旧为错误信息;版本验证代码未执行;
b.引入版本不一致,移除后需要重新添加

 Security.addProvider(new BouncyCastleProvider());
引入后重新验证版本
private static Provider getProvider() {
    Security.addProvider(new BouncyCastleProvider());
    System.out.println( "version=" + Security.getProvider(BouncyCastleProvider.PROVIDER_NAME).getVersion());
    return Security.getProvider(BouncyCastleProvider.PROVIDER_NAME);
}

如果版本依旧与引入版本不一致,需要对引入jar进行处理,查看是否存在多版本问题;

3.处理结果

第一次执行版本验证时,依旧出现错误,版本代码并未执行,因此重新添加 Provider实例/重新引入;
重新引入后,输出内容与引入版本一致,调用方法也未出现 IllegalArgumentException

对 getProvider() 方法进行优化

private static Provider getProvider() {
     Security.addProvider(new BouncyCastleProvider());
     //System.out.println( "version=" + Security.getProvider(BouncyCastleProvider.PROVIDER_NAME).getVersion());
     return Security.getProvider(BouncyCastleProvider.PROVIDER_NAME);
 }

引入BouncyCastle 版本为 1.68;输出版本一致
执行版本

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用中提到了一个异常:java.lang.IllegalStateException: Method has too many Body parameters。这个异常表示方法具有太多的Body参数,可能是代码中的某个方法在定义时接受了过多的参数。需要检查代码中的方法定义并确保参数数量正确。 引用中提到了修改Spring Cloud Config Server服务端Postgres数据库连接配置文件的步骤。在这个步骤中,需要修改licensingservice-dev.yml文件中的一些属性,包括数据库连接URL、用户名、密码等。确保这些属性的值正确配置。 引用中提到了修改Spring Cloud Config Client客户端属性配置文件的步骤。在这个步骤中,需要修改bootstrap.yml文件中的一些属性,包括应用程序名称、激活的配置文件、Spring Cloud Config Server的URI等。确保这些属性的值正确配置。 根据提供的信息,关于"java.lang.IllegalStateException: Invalid keystore location"的问题,我们无法在引用的内容中找到直接的相关引用。不过,通常这个异常表示密钥库(keystore)的位置不正确。密钥库是用于存储加密和身份验证相关信息的文件。您需要检查代码中密钥库的位置是否正确,并确保该位置对应的文件存在。另外,还需要确保密钥库的配置信息正确,包括密码和别名等。 综上所述,如果您遇到"java.lang.IllegalStateException: Invalid keystore location"异常,您需要检查密钥库的位置和配置信息,并进行相应的修正。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Java异常之—-Caused by: java.lang.IllegalStateException: Method has too many Body parameters](https://download.csdn.net/download/weixin_38551143/14883721)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [java.lang.IllegalStateException: Cannot decrypt: key=spring.datasource.password](https://blog.csdn.net/daqiang012/article/details/105745540)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值