【问题标题】:ssl httpserver throwing 'Access violation at address 00000000. Read of address 00000000' errorssl httpserver 抛出“地址 00000000 的访问冲突。读取地址 00000000”错误
【发布时间】:2013-05-02 10:51:34
【问题描述】:

此代码在运行时引发“地址 00000000 的访问冲突。读取地址 00000000”错误。我试图让服务器接受 ssl 请求,但遇到了真正的麻烦。

我还在调试文件夹中保存了 ssleay32.dll 和 libeay32.dll。任何帮助表示赞赏:

ServerIOHandler := TIdServerIOHandlerSSLOpenSSL.Create;

ServerIOHandler.SSLOptions.Method := sslvSSLv23;
ServerIOHandler.SSLOptions.Mode := sslmClient;
ServerIOHandler.SSLOptions.VerifyMode := [];
ServerIOHandler.SSLOptions.VerifyDepth := 0;

server:=TIdHTTPServer.Create;
server.IOHandler := ServerIOHandler;       
server.DefaultPort:=port;              
server.Bindings.DefaultPort:=port;

server.OnQuerySSLPort(8092, newBool);     //this is the line that throws the error

server.AutoStartSession:=true;
server.OnCommandGet:=idhttpserver1commandget;
server.SessionTimeOut:=360;
server.Active:=True;

【问题讨论】:

    标签: delphi https indy delphi-xe3


    【解决方案1】:

    您收到此错误的原因是OnQuerySSLPort 是一个事件,您尚未为其分配处理程序。

    OnQuerySSLPort 的重点是 应该编写一个方法,然后将其分配给TIdHTTPServer 对象的这个属性。 那么这个方法(写的)将在每次触发事件时执行:

    procedure TForm5.MyHandler(APort: TIdPort; var VUseSSL: Boolean);
    begin
      // Do something
    end;
    
    procedure TForm5.FormCreate(Sender: TObject);
    begin
      server := TIdHTTPServer.Create;
      server.OnQuerySSLPort := MyHandler;
      ...
    end;
    

    您可能更熟悉其他事件,例如 TForm.OnCreateTTimer.OnExecute 等。它们的工作方式相同:编写一段代码,然后对象在适当的时候执行来了。

    【讨论】:

    • 谢谢。服务器使用 ssl 连接是否需要该事件?
    • @user1365875:我对 Indy 的经验很少。 Indy 文档应该足以回答您的问题,但您也可以希望其他人会在此处看到您的 Q(或者您可以针对该问题提出新的 Q)。
    • @AndreasRejbrand:Indy 文档不是最新的。
    • @user1365875:如果您的服务器正在侦听多个端口并且某些端口已加密而其他端口未加密(即,一个端口用于 HTTP,另一个端口用于HTTPS)。该事件允许服务器询问您连接到给定端口的客户端是否应该加密。如果要无条件加密所有连接,那么您可以让您的处理程序始终返回 VUseSSL:=True,或者您可以使用 OnConnect 事件手动激活 SSL,而不是让服务器为您执行此操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    相关资源
    最近更新 更多