delphi7, indy10 实现接受https请求时报错

seleron2 2015-09-05 09:22:48
Indy版本是10.0.52
使用的组件 IdHttpServer、IdServerIOHandlerSSLOpenSSL
SLL库文件:Libeay32.dll、ssleay32.dll

代码如下

IdHTTPServer1.Bindings.Clear;
IdHTTPServer1.DefaultPort:= 443;
IdHTTPServer1.Bindings.Add.IP := '127.0.0.1';
IdHTTPServer1.IOHandler:=IdServerIOHandlerSSLOpenSSL1;
//启动服务器
IdHTTPServer1.Active := True;



procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
memo1.Lines.Add(ARequestInfo.Document) ;
end;


报错图片如下


1、试了多个SSL库文件,均报错。
2、IdServerIOHandlerSSLOpenSSL1组件的SSLOptions.sslvTLSv1属性的各个属性值都试过,均报错。
3、如果接受http请求是正确的,只是接受https请求时报错。


请教大家该如何解决呢?
...全文
919 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
seleron2 2015-09-09
  • 打赏
  • 举报
回复
引用 10 楼 pathletboy 的回复:
重载TIdServerIOHandlerSSLOpenSSL这个组件的OnGetPassword方法,设置你证书的密码。
使用正确的证书后不报错了 但是发现,注释掉下面的代码后,也能正确运行


  //idsrvrhndlrslpnsl1.OnGetPassword:=GetPassword;


//procedure TForm1.GetPassword(var strPassword:string);
//begin
//  strPassword:='zyyzyy';
//end;

难道不需要赋值证书文件的密码吗?
pathletboy 2015-09-09
  • 打赏
  • 举报
回复
引用 20 楼 seleron2 的回复:
[quote=引用 10 楼 pathletboy 的回复:] 重载TIdServerIOHandlerSSLOpenSSL这个组件的OnGetPassword方法,设置你证书的密码。
使用正确的证书后不报错了 但是发现,注释掉下面的代码后,也能正确运行


  //idsrvrhndlrslpnsl1.OnGetPassword:=GetPassword;


//procedure TForm1.GetPassword(var strPassword:string);
//begin
//  strPassword:='zyyzyy';
//end;

难道不需要赋值证书文件的密码吗?[/quote] 你试试看能不能正常访问呢
seleron2 2015-09-08
  • 打赏
  • 举报
回复
pathletboy 2015-09-08
  • 打赏
  • 举报
回复
引用 17 楼 seleron2 的回复:
[quote=引用 15 楼 pathletboy 的回复:] 你的证书生成的有问题,我另外生成了一份,密码就是你那个。 http://download.csdn.net/download/pathletboy/9089525
下载时,提示资源不存在。[/quote] 貌似被删除了。。。
seleron2 2015-09-08
  • 打赏
  • 举报
回复
引用 15 楼 pathletboy 的回复:
你的证书生成的有问题,我另外生成了一份,密码就是你那个。 http://download.csdn.net/download/pathletboy/9089525
确实是证书的问题, 原因是,我的操作系统是64位,却使用了openssl32来制作证书导致 换成openssl64制作证书后,就ok了 谢谢!
seleron2 2015-09-08
  • 打赏
  • 举报
回复
引用 15 楼 pathletboy 的回复:
你的证书生成的有问题,我另外生成了一份,密码就是你那个。 http://download.csdn.net/download/pathletboy/9089525
谢谢,我下载下来试试。
seleron2 2015-09-08
  • 打赏
  • 举报
回复
引用 15 楼 pathletboy 的回复:
你的证书生成的有问题,我另外生成了一份,密码就是你那个。 http://download.csdn.net/download/pathletboy/9089525
下载时,提示资源不存在。
pathletboy 2015-09-08
  • 打赏
  • 举报
回复
你的证书生成的有问题,我另外生成了一份,密码就是你那个。 http://download.csdn.net/download/pathletboy/9089525
pathletboy 2015-09-07
  • 打赏
  • 举报
回复
你可以打包工程让大家一起看看,到底哪步出问题了。
seleron2 2015-09-07
  • 打赏
  • 举报
回复
seleron2 2015-09-06
  • 打赏
  • 举报
回复
引用 10 楼 pathletboy 的回复:
重载TIdServerIOHandlerSSLOpenSSL这个组件的OnGetPassword方法,设置你证书的密码。
我重载OnGetPassword后还是报错“could not load key, check password”,并且发现在执行IdHTTPServer1.Active := True;之前,并不会执行OnGetPassword中的语句.


procedure TForm1.idsrvrhndlrsl1GetPassword(var Password: String);
begin
  Password:='zyyzyy';
end;

procedure TForm1.btn2Click(Sender: TObject);
var
  lAppDir:string;
begin
  idsrvrhndlrsl1.OnGetPassword:=idsrvrhndlrsl1GetPassword;
  lappDir:= extractFilePath(application.exename);
  idsrvrhndlrsl1.SSLOptions.KeyFile := lappDir +'key.pem';
  idsrvrhndlrsl1.SSLOptions.CertFile := lAppDir+'cert.pem';
  idsrvrhndlrsl1.SSLOptions.RootCertFile:= lappDir + 'root.pem';
  idsrvrhndlrsl1.SSLOptions.VerifyDirs := lAppDir;
  idsrvrhndlrsl1.SSLOptions.Method := sslvSSLv23;
  idsrvrhndlrsl1.SSLOptions.Mode := sslmServer;
  idhtpsrvr1.Active:=TRUE;
end;
seleron2 2015-09-05
  • 打赏
  • 举报
回复
引用 1 楼 pathletboy 的回复:
你证书设置在哪呢?
lappDir:= extractFilePath(application.exename)+'cert\';
IdServerIOHandlerSSLOpenSSL1.SSLOptions.KeyFile := lappDir +'key.pem';
IdServerIOHandlerSSLOpenSSL1.SSLOptions.CertFile := lAppDir+'cert.pem';
IdServerIOHandlerSSLOpenSSL1.SSLOptions.RootCertFile:= lappDir +
'root.pem';
IdServerIOHandlerSSLOpenSSL1.SSLOptions.VerifyDirs := lAppDir;
IdServerIOHandlerSSLOpenSSL1.SSLOptions.Method := sslvSSLv23;
IdServerIOHandlerSSLOpenSSL1.SSLOptions.Mode := sslmServer;
请问key.pem、cert.pem、root.pem这三个文件是怎么得来的呢?
pathletboy 2015-09-05
  • 打赏
  • 举报
回复
你证书设置在哪呢?
lappDir:= extractFilePath(application.exename)+'cert\';
IdServerIOHandlerSSLOpenSSL1.SSLOptions.KeyFile := lappDir +'key.pem';
IdServerIOHandlerSSLOpenSSL1.SSLOptions.CertFile := lAppDir+'cert.pem';
IdServerIOHandlerSSLOpenSSL1.SSLOptions.RootCertFile:= lappDir +
'root.pem';
IdServerIOHandlerSSLOpenSSL1.SSLOptions.VerifyDirs := lAppDir;
IdServerIOHandlerSSLOpenSSL1.SSLOptions.Method := sslvSSLv23;
IdServerIOHandlerSSLOpenSSL1.SSLOptions.Mode := sslmServer;
pathletboy 2015-09-05
  • 打赏
  • 举报
回复
重载TIdServerIOHandlerSSLOpenSSL这个组件的OnGetPassword方法,设置你证书的密码。
seleron2 2015-09-05
  • 打赏
  • 举报
回复
seleron2 2015-09-05
  • 打赏
  • 举报
回复
引用 6 楼 pathletboy 的回复:
你到底是server还是client client是从server获取证书信息的 而server则是要提供证书信息给client的 请自己对照。
我安装OPENSSL后,自己使用命令生成了下面的三个文件 server-key.pem server-csr.pem server-cert.pem 请问,这个三个文件是不是对应你提供的代码中的key.pem、cert.pem、root.pem这三个文件呢? 我将对应的属性设置为这三个文件后,运行IdHTTPServer1.Active := True;这句代码时提示 “could not load root certificat”
seleron2 2015-09-05
  • 打赏
  • 举报
回复
引用 6 楼 pathletboy 的回复:
你到底是server还是client client是从server获取证书信息的 而server则是要提供证书信息给client的 请自己对照。
读取12306时是client 我现在是要自己做一个server
pathletboy 2015-09-05
  • 打赏
  • 举报
回复
你到底是server还是client client是从server获取证书信息的 而server则是要提供证书信息给client的 请自己对照。
seleron2 2015-09-05
  • 打赏
  • 举报
回复
引用 3 楼 pathletboy 的回复:
[quote=引用 2 楼 seleron2 的回复:] [quote=引用 1 楼 pathletboy 的回复:] 你证书设置在哪呢?
lappDir:= extractFilePath(application.exename)+'cert\';
IdServerIOHandlerSSLOpenSSL1.SSLOptions.KeyFile := lappDir +'key.pem';
IdServerIOHandlerSSLOpenSSL1.SSLOptions.CertFile := lAppDir+'cert.pem';
IdServerIOHandlerSSLOpenSSL1.SSLOptions.RootCertFile:= lappDir +
'root.pem';
IdServerIOHandlerSSLOpenSSL1.SSLOptions.VerifyDirs := lAppDir;
IdServerIOHandlerSSLOpenSSL1.SSLOptions.Method := sslvSSLv23;
IdServerIOHandlerSSLOpenSSL1.SSLOptions.Mode := sslmServer;
请问key.pem、cert.pem、root.pem这三个文件是怎么得来的呢?[/quote] 自己生成,但是浏览器会告警,或者去买ssl证书,具体搜索ssl 证书生成吧。[/quote] 我用https访问12306网址查询车票信息时,没用到key.pem、cert.pem、root.pem这三个文件啊,也可以读取到车票信息
seleron2 2015-09-05
  • 打赏
  • 举报
回复
引用 3 楼 pathletboy 的回复:
[quote=引用 2 楼 seleron2 的回复:] [quote=引用 1 楼 pathletboy 的回复:] 你证书设置在哪呢?
lappDir:= extractFilePath(application.exename)+'cert\';
IdServerIOHandlerSSLOpenSSL1.SSLOptions.KeyFile := lappDir +'key.pem';
IdServerIOHandlerSSLOpenSSL1.SSLOptions.CertFile := lAppDir+'cert.pem';
IdServerIOHandlerSSLOpenSSL1.SSLOptions.RootCertFile:= lappDir +
'root.pem';
IdServerIOHandlerSSLOpenSSL1.SSLOptions.VerifyDirs := lAppDir;
IdServerIOHandlerSSLOpenSSL1.SSLOptions.Method := sslvSSLv23;
IdServerIOHandlerSSLOpenSSL1.SSLOptions.Mode := sslmServer;
请问key.pem、cert.pem、root.pem这三个文件是怎么得来的呢?[/quote] 自己生成,但是浏览器会告警,或者去买ssl证书,具体搜索ssl 证书生成吧。[/quote] 多谢了!
加载更多回复(1)

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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