Сбербанк говорит: сертификат прикреплён некорректно. Почему?
Пытаюсь подключиться к API Сбербанка. Делаю голый CURL запрос (без хедера, без полезной нагрузки пока) Приходит ответ: Problem with the local SSL certificate.
$ch = curl_init( 'https://mc.api.sberbank.ru/prod/tokens/v3/oauth' ); curl_setopt( $ch, CURLOPT_SSLCERT, 'https://interotkos.ru/admin/SSL/certificate_fbb85415-7416-4a5d-aa54-93321dc2306d.p12' ); curl_setopt( $ch, CURLOPT_SSLCERTPASSWD, 'XnHJtBKuez3Q' ); curl_setopt( $ch, CURLOPT_CAINFO, 'https://interotkos.ru/admin/SSL/russian-trusted-cacert.pem' ); curl_setopt($ch, CURLOPT_CERTINFO, 1); curl_setopt($ch, CURLOPT_VERBOSE, true); $response = curl_exec( $ch ); echo "<pre>"; print_r( curl_getinfo( $ch ) ); print_r( curl_strerror( curl_errno( $ch ) ); print_r( $response ); curl_close( $ch ); |
$ch = curl_init( 'https://mc.api.sberbank.ru/prod/tokens/v3/oauth' ); curl_setopt( $ch, CURLOPT_SSLCERT, 'https://interotkos.ru/admin/SSL/certificate_fbb85415-7416-4a5d-aa54-93321dc2306d.p12' ); curl_setopt( $ch, CURLOPT_SSLCERTPASSWD, 'XnHJtBKuez3Q' ); curl_setopt( $ch, CURLOPT_CAINFO, 'https://interotkos.ru/admin/SSL/russian-trusted-cacert.pem' ); curl_setopt($ch, CURLOPT_CERTINFO, 1); curl_setopt($ch, CURLOPT_VERBOSE, true); $response = curl_exec( $ch ); echo "<pre>"; print_r( curl_getinfo( $ch ) ); print_r( curl_strerror( curl_errno( $ch ) ); print_r( $response ); curl_close( $ch );
Сертификаты там ок. По указанным URL в коде их можно проверить.
Поддержка Сбера говорит, что "сертификат прикреплён некорректно". Большего от них конечно же не добиться. Права доступа к файлам установлены "777".
В чём может быть дело? А то у меня уже руки опускаются. Я не программистка, но иногда возникают необходимость кое-что сделать.
Данный скрипт работает здесь: https://interotkos.ru/admin/sber.php
Для уточнения: хостинг виртуальный, доступа к командной строке нет.
Дополнительно:
как минимум сертификаты должны быть файлами и подключаться как файлы по пути на диске, а не по ссылке.
Ну теперь ваш сертификат можно выкинуть на помойку потому что вы его всем показали с паролем, от вашего имени кто угодно сможет делать запросы.
как минимум сертификаты должны быть файлами и подключаться как файлы по пути на диске, а не по ссылке.
А это обязательно? Я думала, что возможно у меня там с путями какие-то проблемы и указала путь к сертификату (лежащему рядом) через глобальный URL. Поменяла на локальный путь... Не помогает.
Ну теперь ваш сертификат можно выкинуть на помойку потому что вы его всем показали с паролем, от вашего имени кто угодно сможет делать запросы.
Спасибо за беспокойство. :)) Это тестирование в сбербанковской песочнице. Понятно, что я сертификат перевыпущу, когда отлажу (да и Сбер просто не даст использовать сертификат песочницы на проде).
> А это обязательно?
по другому оно вообще не предусмотрено
Ответы:
Некорректно прикреплен сертификат к запросу либо сертификат вовсе не прикреплен. Необходимо проверить, правильно ли прикреплен клиентский сертификат к запросу. Для успешного вызова API необходимо использование клиентского сертификата в запросе, выпущенного для приложения на Портале разработчика.
- Ну это и так понятно. У меня вопрос, что я делаю не так, почему сертификат в коде прикреплён как-то не так или не прикреплён вовсе?
Необходимо проверить, правильно ли прикреплен клиентский сертификат к запросу.
Как это проверить? Кроме того как пристально смотреть в свой код.
curl_setopt( $ch, CURLOPT_SSLCERT, 'https://interotkos.ru/admin/SSL/certificate_fbb854...' );
Following store locations are supported: CurrentUser, LocalMachine, CurrentService, Services, CurrentUserGroupPolicy, LocalMachineGroupPolicy, LocalMachineEnterprise.
certificate_fbb85415-7416-4a5d-aa54-93321dc2306d.p12
Schannel also support P12 certificate file, with the string P12 specified with CURLOPT_SSLCERTTYPE.
https://curl.se/libcurl/c/CURLOPT_SSLCERT.html
- Спасибо. Удалось продвинуться. Локальный мой Openssl говорит, что не может открыть сертификат p12. Ошибка 58. Unsupported. Сертификат генерит и выдаëт Сбер, вряд ли там что-то не так. В чëм проблема, понять не могу.
- Tyusha, Недавно сталкивался с проблемой, конвертировал из pem в pfx с помощью openssl3. При последующем импорте PFX была ошибка ввода пароля. Оказалось, что новый openssl использует другой алгоритм шифрования который не поддерживается windows. Возможно у тебя такая же проблема, попробуй переконвертировать сертификат в pem,а потом в p12 c использование openssl 1.1.1 или openssl 3 -legacy. Или можно конвертнуть в pem и протестить.
Вот обсуждение
https://stackoverflow.com/questions/69343254/the-p... - Valentin Barbolin, спасибо. Я вчера целый день ковырялась, к ночи решила переставить openssl локально (отлаживаю в phpstorm) . На том и ушла спать, сегодня попробую дальше. Но как быть с хостингом и тамошним openssl с учётом, что хостинг без командной строки, а только веб...
- Tyusha,
Но как быть с хостингом и тамошним openssl с учётом, что хостинг без командной строки, а только веб...
Openssl нужен для разового конвертирования сертификата и не важно где это будет сделано.
- Valentin Barbolin, можете мне обрисовать, что вообще происходит, когда я прикрепляю файл .p12?
Я (извините за серость, я не профи) понимаю так. Локальная машина перед отправкой открывает указанным паролем файл p12, вынимает оттуда публичный ключ и его вместе с цепочкой сертификатов серверу, а остальное шифрует приватным ключом. Пароль и приватный ключ, никуда не отсылаются. Т.е. ошибка (58) возникает на моей стороне, это НЕ ответ сервера об ошибке.
Я правильно понимаю происходящее?
- Tyusha,
Локальная машина перед отправкой открывает указанным паролем файл p12, вынимает оттуда публичный ключ и его вместе с цепочкой сертификатов серверу, а остальное шифрует приватным ключом.
Если мы протеорию. В момент запуска кода происходит разшифровка p12, достается сертификат и ключ клиента, в сертифике есть публичный ключ, сертификат отправляется серверу, сервер проверяет валидность сертификата и шифрует ответ публичным ключем добавляет свой сертификат сервера и отправляет клиенту ответ. Клиент проверяет сертификат сервера, расшифровыет ответ своим приватным ключем. Потом клиент и сервер обмениваются ключем для шифрования (сесионный ключ) На этом рукопожатие можно считать законченным. По факту этот сертификат нужен что бы сервер проверил вашу валидность в дальнейшем он не используется, данные шифруются сессионным ключем.
58. Unsupported - интернет говорит что проблема на вашей стороне. Можно найти решение по запросу 58. Unsupported
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Сертификат может быть прикреплен некорректно по нескольким причинам. Давайте разберем основные возможные причины и способы их решения:
1. Неправильный формат сертификата: Убедитесь, что сертификат имеет правильный формат, который требуется для вашего сервиса. Например, для HTTPS соединения нужен сертификат в формате X.509.
2. Некорректные файлы сертификата: Проверьте, что все необходимые файлы сертификата (ключ, цепочка сертификации) были прикреплены правильно и доступны для сервера.
3. Неправильная конфигурация сервера: Убедитесь, что конфигурация вашего веб-сервера (например, Apache, Nginx) правильно указывает на файлы сертификата и ключа.
Пример кода для настройки SSL сертификата на сервере Apache:
SSLEngine on SSLCertificateFile /path/to/your_domain.crt SSLCertificateKeyFile /path/to/your_domain.key SSLCertificateChainFile /path/to/your_domain.ca-bundle
4. Проблемы с самим сертификатом: Убедитесь, что сертификат действителен и не истек. Проверьте его статус на сайтах проверки сертификатов.
5. Проблемы с цепочкой сертификации: Если используется цепочка сертификации, убедитесь, что все промежуточные сертификаты правильно прикреплены и доступны.
Если после проверки всех вышеперечисленных пунктов проблема не будет решена, рекомендуется обратиться к службе поддержки вашего сертификата или поставщику хостинга для дальнейшей диагностики и решения проблемы.