Silvertunnel异常:java.lang.NoSuchMethodError:org.bouncycastle.asn1.ASN1InputStream.readObject()Lorg / bouncycastle / asn1 / DERObject;

时间:2016-01-17 15:52:11

标签: java tor silvertunnel

我正在尝试使用silvertunnel netlib连接到tor隐藏服务,但我一直得到同样的例外:

  

线程中的异常“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)       at org.silvertunnel.netlib.layer.tor.util.Encryption.extractPublicRSAKey(Encryption.java:342)       在org.silvertunnel.netlib.layer.tor.directory.AuthorityKeyCertificate。(AuthorityKeyCertificate.java:104)       at org.silvertunnel.netlib.layer.tor.directory.AuthorityKeyCertificates。(AuthorityKeyCertificates.java:100)       在org.silvertunnel.netlib.layer.tor.directory.AuthorityKeyCertificates。(AuthorityKeyCertificates.java:80)       在org.silvertunnel.netlib.layer.tor.directory.Directory.getAuthorityKeyCertificates(Directory.java:492)       在org.silvertunnel.netlib.layer.tor.directory.Directory.updateNetworkStatusNew(Directory.java:324)       在org.silvertunnel.netlib.layer.tor.directory.Directory.refreshListOfServers(Directory.java:287)       at 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 个答案:

答案 0 :(得分:0)

您的java安装中可能有一个版本的bouncy castle,并且由于一个版本试图调用另一个版本而导致此错误。检查您的JAVA_HOME/jre/lib/ext/JAVA_HOME/lib目录,查找名称以“bcprov”开头的文件。

好的,既然你评论说没有用,我仍然认为你的类路径上有多个版本的bouncycastle。具体来说,我认为您有bcprovbcpkix罐子的不同版本。所以让我们编写一个简短的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”类(旧版本的bcpkix jar中的旧类)和“ASN1InputStream”类(应该在旧版和新版bcprov jar中的类)所在的位置从。使用彼此匹配的那些罐子的版本。

答案 1 :(得分:0)

Silvertunnel已过时,您应该使用SilverTunnel-NG代替。 SilverTunnel-NG正在使用spongycastle,因此它也与Android兼容。

您也可以在github上找到SilverTunnel-NG。