关于HttpUrlConnection SOCKS代理问题

qiuchuanqing 2015-08-18 03:31:40
InetSocketAddress inetSocketAddress = new InetSocketAddress(ip, port);
Proxy proxy = new Proxy(Proxy.Type.SOCKS, inetSocketAddress);
URL url = new URL("https//:xxx");
HttpURLConnection conn = (HttpURLConnection)url.openConnection(proxy);
conn.setRequestMethod("POST");


报错如下:(求大神)
java.net.SocketException: SOCKS : authentication failed

at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at sun.net.NetworkClient.doConnect(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.protocol.https.HttpsClient.<init>(Unknown Source)
at sun.net.www.protocol.https.HttpsClient.New(Unknown Source)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(Unknown Source)



...全文
810 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiuchuanqing 2015-08-21
  • 打赏
  • 举报
回复
引用 9 楼 zhuangqingch 的回复:
代码服务器,罪过!




SocksSocketImpl里面断点进不来哦~~~

不过目测NO_AUTH是不可能了。。。
qiuchuanqing 2015-08-21
  • 打赏
  • 举报
回复
引用 9 楼 zhuangqingch 的回复:
代码服务器,罪过!
断点跟进去,到162行return false了 http://srl.cs.berkeley.edu/~mhn/ftp/java/net/SocksSocketImpl.java.html
zhuangqingch 2015-08-20
  • 打赏
  • 举报
回复
代码服务器,罪过!
zhuangqingch 2015-08-20
  • 打赏
  • 举报
回复
虽然楼主的代码服务器没有设置帐号认证,但代码服务器是需要先对机器(IP地址、MAX等信息)进行登记后,对应的机器才有权限使用。而且不同的代理服务器设置也能不同,有些可以直接限制IP范围,这个需要楼主你检查下你的代码服务器设置,具体服务器是否要求需要认证,建立楼主看下源代码,可以通过断点跟踪代码确认是否需要认证,具体关键源代码如下:
1、SOCKS有V4和V5两种模式,默认是采用V5,二者主要是协议的处理有区别,这里不做详述,访问代码服务器时,请求方会与代码服务器建立连接并通信(代码中的readSocksReply()),代码服务器会返回相关状态码(代码中的data数组),如下图:


2、根据代码服务器的返回状态码做认证检查,如下图:
qiuchuanqing 2015-08-20
  • 打赏
  • 举报
回复
引用 6 楼 zhuangqingch 的回复:
[quote=引用 5 楼 qiuchuanqing 的回复:]
[quote=引用 1 楼 zhuangqingch 的回复:]
楼主,你应该没有传代理服务器的用户名和密码吧,你当前出现的异常是代理认证失败,楼主可以查下java.net.Authenticator这个类。


可以不使用认证吗?传个系统参数之类的?[/quote]
需不需要认证,需要具体看代理服务器有没有设置(正规的代理服务器都需要认证,只有在内网环境才可能不设置认证,设置不设置,无非就是安全的问题,即限制谁可以用)你可以简单理解为有A和B2台机,A不能访问google,B机器可以,现在A想访问google可以这样做,远程连接到B,操作B访问google。这里的连接到B,如果B的操作系统没有帐号密码,你可以不需要进入登录(即认证)操作,直接直入B机器系统。如果B设置了帐号密码,那你必须得输入帐号密码才有使用B的权利。当然这只是对代理服务器很通俗的比喻(其实代理服务器是会主动把内容推送给你的,而不是像我这里说的要自己去操作)[/quote]

引用 6 楼 zhuangqingch 的回复:
[quote=引用 5 楼 qiuchuanqing 的回复:]
[quote=引用 1 楼 zhuangqingch 的回复:]
楼主,你应该没有传代理服务器的用户名和密码吧,你当前出现的异常是代理认证失败,楼主可以查下java.net.Authenticator这个类。


可以不使用认证吗?传个系统参数之类的?[/quote]
需不需要认证,需要具体看代理服务器有没有设置(正规的代理服务器都需要认证,只有在内网环境才可能不设置认证,设置不设置,无非就是安全的问题,即限制谁可以用)你可以简单理解为有A和B2台机,A不能访问google,B机器可以,现在A想访问google可以这样做,远程连接到B,操作B访问google。这里的连接到B,如果B的操作系统没有帐号密码,你可以不需要进入登录(即认证)操作,直接直入B机器系统。如果B设置了帐号密码,那你必须得输入帐号密码才有使用B的权利。当然这只是对代理服务器很通俗的比喻(其实代理服务器是会主动把内容推送给你的,而不是像我这里说的要自己去操作)[/quote]



服务器已经设置不需要认证了,同样的情况,用Python写的代理是正常的。所以想问,这种情况下,Java方面有没有其它办法
以下是我查到的文档,可以参考下?

链接 http://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html
zhuangqingch 2015-08-20
  • 打赏
  • 举报
回复
引用 5 楼 qiuchuanqing 的回复:
[quote=引用 1 楼 zhuangqingch 的回复:] 楼主,你应该没有传代理服务器的用户名和密码吧,你当前出现的异常是代理认证失败,楼主可以查下java.net.Authenticator这个类。
可以不使用认证吗?传个系统参数之类的?[/quote] 需不需要认证,需要具体看代理服务器有没有设置(正规的代理服务器都需要认证,只有在内网环境才可能不设置认证,设置不设置,无非就是安全的问题,即限制谁可以用)你可以简单理解为有A和B2台机,A不能访问google,B机器可以,现在A想访问google可以这样做,远程连接到B,操作B访问google。这里的连接到B,如果B的操作系统没有帐号密码,你可以不需要进入登录(即认证)操作,直接直入B机器系统。如果B设置了帐号密码,那你必须得输入帐号密码才有使用B的权利。当然这只是对代理服务器很通俗的比喻(其实代理服务器是会主动把内容推送给你的,而不是像我这里说的要自己去操作)
qiuchuanqing 2015-08-20
  • 打赏
  • 举报
回复
引用 1 楼 zhuangqingch 的回复:
楼主,你应该没有传代理服务器的用户名和密码吧,你当前出现的异常是代理认证失败,楼主可以查下java.net.Authenticator这个类。
可以不使用认证吗?传个系统参数之类的?
qiuchuanqing 2015-08-19
  • 打赏
  • 举报
回复
http://stackoverflow.com/questions/1540424/java-proxy-client-class-that-supports-authentication The SOCKS username and password are acquired in the following way. First, if the application has registered a java.net.Authenticator default instance, then this will be queried with the protocol set to the string "SOCKS5", and the prompt set to to the string "SOCKS authentication". If the authenticator does not return a username/password or if no authenticator is registered then the system checks for the user preferences "java.net.socks.username" and "java.net.socks.password". If these preferences do not exist, then the system property "user.name" is checked for a username. In this case, no password is supplied. google一下看到这段话,最后两句 If these preferences do not exist,开始,是说没设置username与password两个参数的话,直接跳过验证了吗,还是有其它意思?求解释!!! 还有,then the system property "user.name" is checked for a username.这句应该怎么解释...
qiuchuanqing 2015-08-19
  • 打赏
  • 举报
回复
主要代码就是这些了,其它就是一些收发数据的。 有跳过用户名密码认证的方法不?
藏红 2015-08-18
  • 打赏
  • 举报
回复
能否贴下完整的代码? 看看具体是什么错误啊
zhuangqingch 2015-08-18
  • 打赏
  • 举报
回复
楼主,你应该没有传代理服务器的用户名和密码吧,你当前出现的异常是代理认证失败,楼主可以查下java.net.Authenticator这个类。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧