Исключение 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). Используйте версии тех банок, которые соответствуют друг другу.

Другие вопросы по тегам