При работе с HTTPS-запросами в Delphi с использованием компонента TIdHTTP и SSL-сертификатов разработчики часто сталкиваются с ошибкой:
EIdOSSLLoadingCertError with message 'Could not load certificate. error:0906D06C:PEM routines:PEM_read_bio:no start line'
Эта ошибка возникает, когда компонент TIdSSLIOHandlerSocketOpenSSL не может правильно загрузить SSL-сертификат или приватный ключ. Рассмотрим причины и решения этой проблемы.
Основные причины ошибки
Неправильное форматирование файлов сертификата и ключа
Наличие BOM (Byte Order Mark) в UTF-8 файлах
Проблемы с путями к файлам
Некорректное содержимое сертификата или ключа
Решение проблемы
1. Удаление BOM из файлов сертификата
Основная проблема в предоставленном коде - использование TEncoding.UTF8 при сохранении файлов сертификата и ключа. Это добавляет BOM в начало файла, что может мешать OpenSSL правильно прочитать файл.
Вот улучшенная версия функции GetToken с учетом замечаний:
function TAPI.GetToken: string;
var
IdHTTP: TIdHTTP;
Params: TStringList;
ResponseStream: TStringStream;
begin
IdHTTP := TIdHTTP.Create(nil);
try
IdHTTP.IOHandler := LoadCertificate; // или LoadCertificateInMemory
ResponseStream := TStringStream.Create('', TEncoding.UTF8);
try
Params := TStringList.Create;
try
Params.Add('client_id=' + FAAuthorization);
Params.Add('client_secret=' + FAAuthorizationSecret);
Params.Add('grant_type=client_credentials');
IdHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
try
IdHTTP.Post(URLBasic, Params, ResponseStream);
Result := ResponseStream.DataString;
except
on E: EIdHTTPProtocolException do
LogHttpClientError(E, IdHTTP.ResponseCode, False);
on E: Exception do
raise;
end;
finally
Params.Free;
end;
finally
ResponseStream.Free;
end;
finally
IdHTTP.Free;
end;
end;
Дополнительные рекомендации
Проверка версии OpenSSL: Убедитесь, что используете актуальную версию библиотек OpenSSL, совместимых с вашей версией Delphi.
Проверка сертификата вручную: Попробуйте открыть сохраненные файлы сертификата и ключа в текстовом редакторе и убедиться, что они выглядят корректно.
Логирование: Добавьте логирование перед вызовом Post, чтобы записывать точные параметры запроса и содержимое файлов сертификатов.
Альтернативные методы: Если проблема сохраняется, попробуйте использовать другие компоненты для HTTPS-запросов, например TNetHTTPClient из стандартной библиотеки.
Следуя этим рекомендациям, вы сможете решить проблему с загрузкой SSL-сертификатов в Delphi и успешно выполнять HTTPS-запросы с аутентификацией по клиентскому сертификату.
Решение ошибки "Could not load certificate" при работе с TIdHTTP и SSL-сертификатами в Delphi, включая проверку формата файлов, удаление BOM и альтернативные методы загрузки.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.