2012-01-25 2 views
3

У меня есть существующий сервер DataSnap (служба Windows), который отлично работает в HTTP, и теперь я хочу добавить HTTPS в качестве дополнительного протокола. Я получил и установил SSL-сертификат и сгенерировал файл сертификата (.crt) и файл закрытого ключа (.key). В качестве теста при использовании мастера сервера Delphi XE2 DataSnap и тикании «HTTPS» для получения страницы сертификата я могу ссылаться на 2 файла и нажать кнопку «Тест», которая будет успешной. Я добавил дополнительный компонент TDSHTTPService и связал его с компонентом TDSCertFiles. В моем стартовом событии службы я устанавливаю путь к двум файлам сертификатов перед запуском DSServer в свойствах DSCertFiles.CertFile и DSCertFiles.KeyFile. При попытке начать обслуживание я получаю сообщение об ошибке:Сервер данных DataSnap Delphi XE2 «Не удалось загрузить сертификат»

Could not load certificate. error:140AD002:SSL routines:SSL_CTX_use_certificate_file:system lib

Есть ли что-то, что мне не хватает?

+0

ли проверить код, что услуга действительно может «видеть» файлы сертификатов (это может быть путь или проблема разрешения)? – mjn

+0

Привет, см. Мой комментарий к ответу Реми - компонент, похоже, ищет сертификаты в пути, установленном только во время разработки (может быть, ошибка?). –

+0

Вы можете проверить, является ли это ошибкой - если ошибка исчезнет, ​​как только вы поместите файлы в определенное время, определенное временем разработки. В противном случае что-то не так с средой обслуживания. – mjn

ответ

1

Код ошибки 0x140AD002 Средство SSL_CTX_use_certificate_file() не могло открыть файл.

+0

Большое спасибо, кажется, что компонент сертификата DataSnap всегда ищет файлы сертификатов в пути, указанном в компоненте TDSCertFiles, во время разработки и игнорирует новые пути, которые могут быть установлены в коде во время выполнения. –

4

Существует известная ошибка в XE2 и XE3.

Я нашел это обходное решение.

После установить свойства TDSCert и перед тем начать DSHTTPServer, вызовите этот метод:

DSCertFiles2.SetServerProperties(DSHTTPService2.HttpServer); //WORK AROUND