Простой пример TIdHttpServer с поддержкой SSL - PullRequest
3 голосов
/ 27 декабря 2011

Надеюсь, кто-то может предоставить мне простой 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, я никогда не попаду в мой код.

30 января ПРИМЕЧАНИЕ - Я использовал sslbuddy для генерации ключей. И это все еще не сработало. Затем я закомментировал следующие строки, и это сработало:

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

1 Ответ

3 голосов
/ 27 декабря 2011

Если вы хотите прослушивать 443, вам нужно привязать к нему ... (Если вы хотите, чтобы обычный HTTP-трафик также связывался и с 80)

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

Если прослушиваете более одного портадля HTTP и HTTPS: при обработке соединений необходимо разрешить нормальный или зашифрованный трафик в зависимости от номера порта.Существует событие OnQuerySSLPort , которое необходимо использовать для отключения SSL на порту 80.

О сертификатах ... это зависит от того, используете ли вы свой собственный ЦС или хорошо установленный общедоступный ЦС.Просто имейте в виду, что вы также должны установить событие OnGetPassword (ServerIOHandler), чтобы сообщить серверу пароль вашего ключа.

...