#java #cryptography #websphere #bouncycastle
#java #криптография #websphere #bouncycastle
Вопрос:
У меня возникли проблемы на Websphere server 8.5 с версией Java = 1.6.0, Java Runtime Version = pap6460_26sr8fp7ifx-20151008_01 (SR8 FP7)
Код, который завершается ошибкой, является:
Security.addProvider(new BouncyCastleProvider());
Signature sign = Signature.getInstance("MD5withRSA", "BC");
Ошибка, которую я получаю, это:
java.security.NoSuchAlgorithmException: Signature MD5WITHRSA implementation not found: java.lang.ClassNotFoundException: org.bouncycastle.jcajce.provider.asymmetric.rsa.DigestSignatureSpi$MD5
Тот же код работает в среде разработки с немного другой версией Java (версия Java = 1.6.0, версия среды выполнения Java = pap6460_26sr8fp20-20160111_01 (SR8 FP20))
Я попытался перечислить весь алгоритм подписи со следующим кодом:
Security.addProvider(новый BouncyCastleProvider());
TreeSet<String> algorithms = new TreeSet<String>();
for (Provider provider : Security.getProviders())
for (Service service : provider.getServices())
if (service.getType().equals("Signature"))
algorithms.add(service.getAlgorithm());
for (String algorithm : algorithms)
System.out.println(algorithm);
и я получаю:
DSA
DSAforSSL
ECDSA
ECDSAforSSL
ECGOST3410
GOST3410
GOST3411WITHECGOST3410
MD2WITHRSA
MD2withRSA
MD4WITHRSA
MD5WITHRSA
MD5withRSA
MD5withRSA/ISO9796-2
NONEWITHDSA
NONEwithECDSA
OID.1.2.840.113549.1.1.10
RAWRSASSA-PSS
RIPEMD128WITHRSA
RIPEMD160WITHECDSA
RIPEMD160WITHRSA
RIPEMD160withRSA/ISO9796-2
RIPEMD256WITHRSA
RMD128WITHRSA
RMD160WITHRSA
RMD256WITHRSA
RSA
RSAPSS
RSASSA-PSS
RSAforSSL
SHA1WITHCVC-ECDSA
SHA1WITHECNR
SHA1WITHRSA
SHA1withDSA
SHA1withECDSA
SHA1withRSA
SHA1withRSA/ISO9796-2
SHA1withRSA/PSS
SHA224WITHCVC-ECDSA
SHA224WITHDSA
SHA224WITHECDSA
SHA224WITHECNR
SHA224WITHRSA
SHA224withECDSA
SHA224withRSA
SHA224withRSA/PSS
SHA256WITHCVC-ECDSA
SHA256WITHDSA
SHA256WITHECDSA
SHA256WITHECNR
SHA256WITHRSA
SHA256withDSA
SHA256withRSA
SHA256withRSA/PSS
SHA2withECDSA
SHA384WITHDSA
SHA384WITHECDSA
SHA384WITHECNR
SHA384WITHRSA
SHA384withRSA
SHA384withRSA/PSS
SHA3withECDSA
SHA512WITHDSA
SHA512WITHECDSA
SHA512WITHECNR
SHA512WITHRSA
SHA512withRSA
SHA512withRSA/PSS
SHA5withECDSA
Итак, MD5withRSA есть.
Класс org.bouncycastle.jcajce.provider.asymmetric.rsa.DigestSignatureSpi $ MD5 находится внутри приложения и
System.out.println("--->DigestSignatureSpi" MD5.class.getResource("DigestSignatureSpi$MD5.class"));
возвращает местоположение класса правильно.
В чем тогда может быть проблема?
Комментарии:
1. Исходя
java.lang.ClassNotFoundException
из того, что я считаю, чтоorg.bouncycastle.jcajce.provider.asymmetric.rsa.DigestSignatureSpi$MD5
этого нет в пути к классу при выполненииSignature sign = Signature.getInstance("MD5withRSA", "BC")
. Вы проверили версию Bouncy Castle в обоих случаях?2. Версия такая же, как у jar, в той же войне веб-приложения. Файл должен находиться в пути к классу. В противном случае System.out.println(«—> DigestSignatureSpi» MD5.class.getResource(«DigestSignatureSpi $MD5.class «)) не сказал бы мне, где он находится.
Ответ №1:
Пожалуйста, проверьте свой вывод следующим фрагментом.
AlgoCheck.java
import java.net.URL;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.Security;
import java.security.Signature;
import org.bouncycastle.jcajce.provider.asymmetric.rsa.DigestSignatureSpi;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
public class AlgoCheck {
public static void main(String[] args) throws NoSuchAlgorithmException,
NoSuchProviderException, ClassNotFoundException {
Security.addProvider(new BouncyCastleProvider());
URL bcClassUrl = AlgoCheck.class.getClassLoader()
.getResource("org/bouncycastle/jce/provider/BouncyCastleProvider.class");
System.out.println("BouncyCastleProvider class URL = " bcClassUrl);
ClassLoader loader = DigestSignatureSpi.MD5.class.getClassLoader();
URL md5ClassUrl = loader.getResource(
"org/bouncycastle/jcajce/provider/asymmetric/rsa/DigestSignatureSpi$MD5.class");
System.out.println("DigestSignatureSpi.MD5 class URL = " md5ClassUrl);
Signature sign = Signature.getInstance("MD5withRSA", "BC");
System.out.println("algorithm = " sign.getAlgorithm());
}
}
Библиотека, из которой загружаются классы BouncyCastleProvider
и DigestSignatureSpi.MD5
должны быть одинаковыми.
пример вывода
BouncyCastleProvider class URL = jar:file:/home/suboptimal/.m2/repository/org/bouncycastle/bcprov-jdk15on/1.49/bcprov-jdk15on-1.49.jar!/org/bouncycastle/jce/provider/BouncyCastleProvider.class
DigestSignatureSpi.MD5 class URL = jar:file:/home/suboptimal/.m2/repository/org/bouncycastle/bcprov-jdk15on/1.49/bcprov-jdk15on-1.49.jar!/org/bouncycastle/jcajce/provider/asymmetric/rsa/DigestSignatureSpi$MD5.class
algorithm = MD5withRSA
Ответ №2:
Это известная проблема с harmony. Поместите оживленные банки в каталог appserver lib / ext.