如何用Indy组件编写安全http代理? (100分)

  • 主题发起人 主题发起人 踏浪者
  • 开始时间 开始时间

踏浪者

Unregistered / Unconfirmed
GUEST, unregistred user!
初次涉及网络通讯,请问如何使用IdHttpServer/IdHttp控件(还是IdTcpServer/IdTcpClient)编写安全http代理?
为什么图片和文字不能全部出来,浏览器的进度条停在一半,没有反应?
 
安全代理是不是要支持SSL?
INDY的BUG多多,想做个稳定的东西还真是不容易
 
条件:

1 D5 以上
2 Indy9.03b 以上
3 两个 OpenSSL 的DLL 
  ssleay32.dll (151,552)
  libeay32.dll (692,224)
一定要用最新版的,不然由于版本原因会出错,括号中是文件大小
这两个DLL要和应程程序放在一个目录下,或在系统目录
 

实施:

  1 建一个新项目
  2 在FORM上放一个IdSSLIOHandlerSocket
  3 设置属性:
     CertFile 指向一个证书文件(.cer),(一般的https都会有一个证书如果没有可以用IE导出一个)
VerifyDepth 设为2
     Method 设为 sslvSSLv23
     Mode 设为 sslmClient
  
  4 放一个TIdHttp
    设置属性:
     Request.ContentType 设为 application/x-www-form-urlencoded 
     IOHandler 设为刚才上面的那个TIdServerIOHandlerSSL


  5 Memo1.Text := IdHTTP1.Get('https://login.yahoo.com/config/login?.src=my&.v=0&.u=a0gonnoue2jjn&.last=&promo=&.intl=us&.bypass=&.partner=&.done=http%3a//my.yahoo.com');


IE导出证书的方法:

  1菜单工-工具-Internet选项-内容
  2 点击[证书]
  3 选择 受信任的根证书颁发机构
  4 在”颁发给栏“内找"Class 3 primary CA",点击,使之变兰
  5 点击下方的导出按钮,在第三页注意选择Base-64 编码x.509 (cer)
6 取一个名字存放在硬盘上,这个文件就是IdSSLIOHandlerSocket的CerFile属性所指向的文件
 
谢谢二位的答复。我想以后可能要用到ssl以及智能卡之类的来保障和增加安全,但目前主要还是卡在基本的http代理功能(一时未能实现或效果不好)。这几天看了许多英文帮助,仍未有满意的答案。
我的大体思路是:采用IdHttpServer来监听浏览器发出的请求,并将请求经由IdHttp转发给实际的Web服务器,得到反馈的结果后由IdHttpServer来传给浏览器。
问题应是:1、如何把IdHttpServer监听到的请求传给IdHttp?
2、IdHttp好像每次只取当前网页的资源,对网页中内嵌的图片等就没有get过来,如何才能全部get过来?
3、get过来后如何由IdHttpServer传给浏览器?
最好是能提供示范代码,分不够可以另加!
补充一下:开发环境Win2K+Delphi7(indy版本:9.00.10)

 
关于重定向问题:
由IdHttp来执行post('http://127.0.0.1/proxy/admin/login.jsp',...)
login.jsp内部重定向到:http://127.0.0.1/proxy/member.jsp
但如何告知TIdHttpServer已经重定向到http://127.0.0.1/proxy/member.jsp
否则member.jsp的其他资源文件如图片、css、js等文件无法Get到。
察看拦截的log日志会看到如下:POST /proxy/admin/login.jsp ...
GET /proxy/admin/images/c1.gif ....
GET /proxy/admin/css/default.css ....
(如何动态去掉多余的admin/?)
而正确的情况应该是: GET /proxy/images/c1.gif ....
GET /proxy/css/default.css ....
(注:member.jsp是位于/proxy/下)

ps:
我已经设置IdHttp的HandleRedirects为true。
但不知如何在IdHttp的OnRedirect事件里告知IdHttpServer已经发生重定向并由IdHttpServer来发出GET /proxy/member.jsp ...这样member.jsp请求的其他资源的Url就会正确获得(不会多出一个admin/)。
 
用Indy控件开发的代理稳定性和效率都一般,最好还是使用winsocket来开发。

delphi源码下载站 http://www.8366.com
 
重定向的问题基本上已经解决,但碰到一个session(存放userId等信息)问题,导致jsp页面中要用到session的地方无法读取,因此页面的信息不对。 不知道是不是TIdHttp.get()的缘故?知道内幕细节或http如何处理session的朋友烦请告知,谢谢!
近期正在研究许多winsock的东西以及indy控件的内部机制,希望能有突破。
 
问题虽没能得到满意的答案,暂时先结束本问题,感谢各位的参与。
 
多人接受答案了。
 
要做HTTP代理,看我的笔记吧应该适合你
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部