4

我尝试在 TOR 网络中实现与隐藏服务的套接字连接。我有它隐藏服务的洋葱域名主机名。我在设备上安装了 Orbot。我使用代理 Orbot 创建用于连接到隐藏服务的套接字。我是这样做的:

Proxy proxy = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(
            "localhost", 9050));
    clientSocket = new Socket(proxy);

    InetSocketAddress remoteAddress = InetSocketAddress.createUnresolved(HS_DOMEN, HS_PORT);

    if (remoteAddress.isUnresolved())
        Log.i("LOG", "address unresolved!!!");

    Log.i("LOG", "start connect to inet addr");
    clientSocket.connect(remoteAddress, CONNECT_TIMEOUNT);
    Log.i("LOG", "after connect ward");

    if (clientSocket.isConnected()) {
        Log.i("LOG", "socket connected");
    }

套接字成功理解代理设置,但是当我尝试连接到隐藏服务时出现错误:

11-06 14:34:57.215: W/System.err(32101): java.net.UnknownHostException: Host is 
unresolved: *.onion
11-06 14:34:57.215: W/System.err(32101):    at java.net.Socket.connect(Socket.java:825)
11-06 14:34:57.215: W/System.err(32101):    at ru.dtlbox.example.clientsample.MainActivity.connectSocket(MainActivity.java:79)
11-06 14:34:57.215: W/System.err(32101):    at ru.dtlbox.example.clientsample.MainActivity$2.run(MainActivity.java:128)
11-06 14:34:57.215: W/System.err(32101):    at java.lang.Thread.run(Thread.java:856)

Onion 主机名是有效的,因为我尝试使用 Orweb 对其进行测试,一切正常。80端口上有nginx服务器。但是我的 Socket 无法解析这个洋葱地址。我认为这是因为 InetAddress 类无法解析传递的主机名的 IP 地址。但是我怎样才能设置正确的设置或使用不同的连接方式?有什么想法吗?非常感谢!

4

1 回答 1

0

你的问题是很久以前被问到的。我很惊讶甚至没有给出一个答案。我认为您现在可能已经找到了解决方案。但是,以下答案适用于将来可能寻求解决此问题并找到此帖子的人。

我最近在尝试使用洋葱地址将客户端套接字连接到服务器套接字时遇到了同样的问题。我花了很多时间研究来自 Gaurdian 项目链接的开源程序代码。

当我查看现已弃用的 Orlib 库时,我注意到正在使用一个名为 jsocks 的库。我在http://sourceforge.net/projects/jsocks/找到了该库,将其作为库安装在 android studio 中,并使用 Socks5 代理和 SocksSocket 成功连接。我还不确定它为什么会起作用,但确实如此。

这是连接代码,.onion 地址被隐藏了。

 private void connect(){
      new Thread(new Runnable() {
          @Override
          public void run() {
              System.out.println("Orbot Running: " + OrbotHelper.isOrbotRunning(getApplicationContext()));

              int proxyPort = 9050;
              String proxyHost = "127.0.0.1";
              String remoteHost = "[address].onion";
              int remotePort = 12345;

              try {
                  socks5Proxy = new Socks5Proxy(proxyHost, proxyPort);
                  socks5Proxy.resolveAddrLocally(false);
                  socket = new SocksSocket(socks5Proxy, remoteHost, remotePort);

                  out = new PrintWriter(socket.getOutputStream(), true);
                  receive();
              }catch (IOException e){
                  e.printStackTrace();
              }
          }
      }).start();
}
于 2015-11-19T11:34:07.803 回答