我尝试在TOR网络中实现到隐藏服务的socket连接。我有它的隐藏服务的洋葱域名主机名。我在设备上安装了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");
}Socket成功理解代理设置,但当我尝试连接隐藏服务时发生错误:
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)洋葱主机名是有效的,因为我尝试使用Orweb对其进行测试,一切正常。80端口上有nginx服务器。但是我的套接字不能解析这个洋葱地址。我认为这是因为InetAddress类无法解析传递的主机名的IP地址。但是,我如何设置正确的设置或使用不同的连接方式?有什么想法吗?非常感谢!
发布于 2015-11-19 19:34:08
你的问题很久以前就被问到了。我很惊讶,甚至连一个答案都没有给出。我想你现在可能已经找到解决方案了。然而,下面的答案是给那些可能在未来寻找这个问题的解决方案并找到这篇文章的人的。
我最近尝试使用洋葱地址通过tor将客户端套接字连接到服务器套接字时遇到了同样的问题。我花了很多时间研究来自Gaurdian Project link的开源程序的代码。
当我查看现已弃用的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();
}https://stackoverflow.com/questions/19810179
复制相似问题