Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

参考:No such provider: BC : 问题解决

在Fabric-SDK实例化一个身份的时候需要加载证书,通过java.security存储证书。

在读取的证书String对象,实例化java.security.PrivateKey的时候,报了No Such Provider的错误。

1
2
3
4
5
6
7
8
9
10
11
12
13
public PrivateKey getPrivateKeyFromBytes(byte[] data) throws IOException {
final Reader pemReader = new StringReader(new String(data));
final PrivateKeyInfo pemPair;
try (PEMParser pemParser = new PEMParser(pemReader)) {
pemPair = (PrivateKeyInfo) pemParser.readObject();
}
PrivateKey privateKey = new JcaPEMKeyConverter().
// 报错位置 No Such Provider:BC. 而BouncyCastleProvider.PROVIDER_NAME == "BC"
setProvider(BouncyCastleProvider.PROVIDER_NAME).
getPrivateKey(pemPair);

return privateKey;
}

解决方法

法一(欠佳)

1、修改以下两个文件

1
2
3
%JDK_Home%\jre\lib\security\java.security

%JRE_Home%\jre\lib\security\java.security

%JRE_Home%\jre\lib\security\java.security

​ 追加 最后一行

1
2
3
4
5
6
7
8
9
10
11
security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=sun.security.ec.SunEC
security.provider.4=com.sun.net.ssl.internal.ssl.Provider
security.provider.5=com.sun.crypto.provider.SunJCE
security.provider.6=sun.security.jgss.SunProvider
security.provider.7=com.sun.security.sasl.Provider
security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.9=sun.security.smartcardio.SunPCSC
security.provider.10=sun.security.mscapi.SunMSCAPI
security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider

2、将bcprov-ext-jdk16-143.jar 放到

 %JDK_Home%\jre\lib\ext
 %JRE_Home%\jre\lib\ext

上述方法欠佳。

法二(maven导入)

1:maven(版本很关键,不说了,说多了都是泪😢)

1
2
3
4
5
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-ext-jdk15on</artifactId>
<version>1.64</version>
</dependency>

2、在加密类中加入静态块。

1
2
3
4
5
6
7
static{
try{
Security.addProvider(new BouncyCastleProvider());
}catch(Exception e){
e.printStackTrace();
}
}

评论