【问题标题】:Simple TIdHttpServer Example supporting SSL支持 SSL 的简单 TIdHttpServer 示例
【发布时间】:2011-12-27 16:18:56
【问题描述】:

希望有人能给我一个简单的TIdHttpServer例子,它支持SSL。使用 Delphi2007 和 Indy10。我有以下内容来创建/设置服务器和 ioHandler:

ServerIOHandler := TIdServerIOHandlerSSLOpenSSL.Create(self);
ServerIOHandler.SSLOptions.CertFile := 'mycert.pem';
ServerIOHandler.SSLOptions.KeyFile := 'mycert.pem';
ServerIOHandler.SSLOptions.RootCertFile := 'mycert.pem';
ServerIOHandler.SSLOptions.Method := sslvSSLv23;
ServerIOHandler.SSLOptions.Mode := sslmServer;

ServerIOHandler.SSLOptions.VerifyDepth := 1;
ServerIOHandler.SSLOptions.VerifyMode := [sslvrfPeer,sslvrfFailIfNoPeerCert,sslvrfClientOnce];

IdHTTPServer1 := TIdHTTPServer.Create;
IdHTTPServer1.AutoStartSession := True;
IdHTTPServer1.SessionState := True;
IdHTTPServer1.OnCommandGet := IdHTTPServer1CommandGet;
idHttpServer1.ParseParams := True;
idHttpServer1.DefaultPort := 80;
idHttpServer1.IOHandler := ServerIOHandler;
IdHTTPServer1.Active := True;

mycert.pem 是使用 openssl 通过以下命令创建的:

openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mycert.pem -out mycert.pem

我马上认为有问题,因为我对 CertFile、KeyFile、RootCertFile 使用相同的文件。

我为提示输入了空格,但通用名称除外。我确定设置为我正在使用的域名(假设它是 myexample.com)。

在浏览器中,如果我点击 http://myexample.com 会导致异常:接受 SSL 连接时出错。点击 https://myexample.com 永远不会进入我的代码。

1 月 30 日注意 - 我使用 sslbuddy 生成密钥。这仍然没有奏效。然后我注释掉了以下几行,它起作用了:

ServerIOHandler.SSLOptions.VerifyDepth := 1;
ServerIOHandler.SSLOptions.VerifyMode := [sslvrfPeer,sslvrfFailIfNoPeerCert,sslvrfClientOnce];

【问题讨论】:

    标签: delphi indy indy10


    【解决方案1】:

    如果你想在 443 上监听,你需要绑定到它...(如果你想正常的 HTTP 流量也绑定到 80)

     IdHTTPServer1.Bindings.Add.Port := 80;
     IdHTTPServer1.Bindings.Add.Port := 443;
    

    如果为 HTTP 和 HTTPS 侦听多个端口,则在处理连接时,您需要根据端口号允许正常或加密流量。您需要使用 OnQuerySSLPort 事件来禁用端口 80 上的 SSL。

    关于证书...这取决于您是使用自己的 CA 还是使用完善的公共 CA。请注意,您还应该设置 OnGetPassword 事件 (ServerIOHandler) 以告知服务器您的密钥密码。

    【讨论】:

    • 非常感谢达里安。不知道 Bindings.Add.Port。在这个阶段我只想使用我自己的 CA;但我熟悉从 GoDaddy 等权威机构获取证书。我正在修补 OnGetPassword 事件。有一次,当我使用 openssl 创建证书时,它要求输入密码。但是使用我在原始帖子中包含的声明它没有。 Indy 是否仅适用于受密码保护的证书?
    • 使用证书的是 OpenSSL - Indy 只是调用 OpenSSL 方法。我没有设置密码就没有使用它...我假设默认密码为空,因此 OnGetPassword 事件在这种情况下是可选的。
    • 好的 - 在这里取得一些进展。我能够使用 openssl 生成受密码保护的文件。我已经验证它实际上是在使用密码(如果我在 ongetpassword 处理程序中修改密码,它会抛出异常)。现在,当我尝试点击 https url 时,我收到“错误接受与 ssl 的连接。观察到违反协议的 EOF”消息。任何的想法?然后是“SSL3_GET_CLIENT_CERTIFICATE:对等方未返回证书”异常。我需要处理一些返回证书的事件吗?
    • 查看此文档:madboa.com/geek/openssl/#cert-self 看来我还有更多工作要做(即生成密钥)。
    • 谢谢。请参阅我 1 月 30 日的说明。我认为最终问题出在 VerifyDepth 和 VerifyMode 参数上。
    猜你喜欢
    • 1970-01-01
    • 2011-10-12
    • 2011-10-12
    • 2012-05-05
    • 2012-12-06
    • 2013-05-22
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多