简单的TIdHttpServer支持SSL的示例

时间:2011-12-27 16:18:57

标签: delphi indy indy10

希望有人能为我提供支持SSL的简单 TIdHttpServer 示例。使用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];

1 个答案:

答案 0 :(得分:2)

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

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

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

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