Исключение Silvertunnel: java.lang.NoSuchMethodError: org.bouncycastle.asn1.ASN1InputStream.readObject()Lorg/bouncycastle/asn1/DERObject;
Я пытаюсь подключиться к скрытому сервису tor, используя silvertunnel netlib, но получаю одно и то же исключение:
Исключение в потоке "org.silvertunnel.netlib.layer.tor.directory.DirectoryManagerThread" java.lang.NoSuchMethodError: org.bouncycastle.asn1.ASN1InputStream.readObject()Lorg/bouncycastle/asn1/DERObject; по адресу org.bouncycastle.openssl.PEMReader.readRSAPublicKey(PEMReader.java:193) по адресу org.bouncycastle.openssl.PEMReader.readObject(PEMReader.java:110) по адресу org.silvertunnel.netlib.layer.tor.uubliceyec. (Encryption.java:342) в org.silvertunnel.netlib.layer.tor.directory.AuthorityKeyCertificate.(AuthorityKeyCertificate.java:104) в org.silvertunnel.netlib.layer.tor.directory.AuthorityKeyCertificates.:100.jates) в org.silvertunnel.netlib.layer.tor.directory.AuthorityKeyCertificates.(AuthorityKeyCertificates.java:80) в org.silvertunnel.netlib.layer.tor.directory.Directory.getAuthorityKeyCertificates(Directory.java:492) в org.sil.netlib.layer.tor.directory.Directory.updateNetworkStatusNew(Directory.java:324) в org.silvertunnel.netlib.layer.tor.directory.Directory.refreshListOfServers(Directory.java:287) в org.silvertunnel.netlib.layer.tor.directory.DirectoryManagerThread.updateDirectory(DirectoryManagerThread.java:60) в org.silvertunnel.NETlib.layer.tor.directory.DirectoryManagerThread.run(DirectoryManagerThread.java:76)
Я пробовал разные версии Bouncycastle, но я просто не могу заставить его работать. Кто-нибудь знает, в чем может быть проблема?
Вот мой код:
String host = "some_site.onion";
int port = 7878;
TcpipNetAddress remoteAddress = new TcpipNetAddress(host, port);
NetLayer netLayer = NetFactory.getInstance().getNetLayerById(NetLayerIDs.TOR);
netLayer.waitUntilReady();
NetSocket netSocket = netLayer.createNetSocket(null, null, remoteAddress);
BufferedReader br = new BufferedReader(new InputStreamReader(netSocket.getInputStream()));
System.out.println(br.readLine());
br.close();
netSocket.close();
2 ответа
Silvertunnel устарел, вы должны использовать SilverTunnel-NG. SilverTunnel-NG использует spongycastle, поэтому он также совместим с Android.
Вы также можете найти SilverTunnel-NG на github.
Вероятно, в вашей java-версии установлена версия bouncy castle, и эта ошибка возникает из-за того, что одна версия пытается вызвать другую. Проверьте свои JAVA_HOME/jre/lib/ext/
а также JAVA_HOME/lib
каталоги для файлов, имена которых начинаются с "bcprov".
Хорошо, так как вы прокомментировали, что это не сработало, я все еще думаю, что у вас есть несколько версий bouncycastle на вашем classpath. В частности, я думаю, что у вас есть другая версия bcprov
а также bcpkix
банки. Итак, давайте напишем короткую Java-программу, чтобы найти их:
import java.net.URL;
import java.util.Enumeration;
public class FindBouncy {
static void printResources(String n) throws Exception {
Enumeration<URL> e = FindBouncy.class.getClassLoader().getResources(n);
if (!e.hasMoreElements()) {
System.out.println(n + " not found!");
} else {
System.out.println(n + " found as:");
while(e.hasMoreElements()) {
System.out.println(" " + e.nextElement());
}
}
}
public static void main(String argv[]) throws Exception {
printResources("org/bouncycastle/openssl/PEMReader.class");
printResources("org/bouncycastle/asn1/ASN1InputStream.class");
}
}
Запустите его в eclipse и найдите, откуда класс "PEMReader" (старый класс, который был в старых версиях jar-файлов bcpkix) и откуда класс "ASN1InputStream" (класс, который должен быть как в старых, так и в новых jar-файлах bcprov). Используйте версии тех банок, которые соответствуют друг другу.