Dreamka
@Dreamka
Web-разработчик.

Как использовать php-curl вместе с сертификатами НУЦ Минцифры?

Приветствую, коллеги!
Помогите решить задачку. Есть сайт на хостинге jino. На нем подключен сберовский эквайринг. Недавно сбер придумал использовать сертификаты от Минцифры (вот и вот) и перестал отвечать на запросы. Если выполнять запрос в браузере, предварительно установив в него сертификаты с госуслуг, то на такие запросы сбер отвечает. Вопрос. Что нужно сделать на сервере, чтобы посылать запросы с использованием отечественных сертификатов. Раньше это было так.
public function request() {
        if ($this->test_mode == "TRUE") {
            $url = 'https://3dsec.sberbank.ru/payment/rest/'.$this->method;
       } else {
            $url = 'https://securepayments.sberbank.ru/payment/rest/'.$this->method;
        }

        if( $curl = curl_init() ) {
            curl_setopt($curl, CURLOPT_URL, $url . "?" . http_build_query($this->fields, '', '&'));
            curl_setopt($curl, CURLINFO_HEADER_OUT, true);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);

            $responce = curl_exec($curl); 
            $headerSent = curl_getinfo($curl, CURLINFO_HEADER_OUT ); 
            curl_close($curl);
            if (!$responce) {
                return json_decode(json_encode([
                    "errorCode" => 500,
                    "errorMessage" => "Не удается установить связь с платежным шлюзом"
                ]));
            }
            return json_decode($responce);
        } else {
            return false;
        }

    }


Добавлял опции
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSLCERT, $this->DOCUMENT_ROOT . "/sberbank/Cert_CA.pem");

Результата нет. Cert_CA.pem - скачан со странички сбера.

Пробовал конвертировать в pem те что с госуслуг и подставлять их - результата нет.

Может кто-то уже сделал переход на эти сертификаты и подскажет хотя бы нужное направление?
  • Вопрос задан
  • 1933 просмотра
Решения вопроса 1
LocKing
@LocKing
Не задавай вопросов — не услышишь лжи
Судя по описанию Сбера, добавлять сертификат НУЦ Минцифры нужно только если вы используете собственную платежную страницу.
Если же используется ПС Сбера, то для сайта никаких доработок проделывать не нужно. Кроме как "Учесть ограничения по альтернативным доменам ПС".
Частично это подтверждается тем, что в предоставленных ими архивах для разных CMS - нет никакх доработок, которые касаются добавления сертификатов в CURL-запросах (посмотрел самые популярные).
Дополнительно ещё задал вопрос поддержке, но не факт, что ответ поступит быстро.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
посмотрите
https://qna.habr.com/q/1020098
Ответ написан
Комментировать
@idneutrino24
В моем случае (linux centos-7) проблему решило кроме установки pem-сертификата
еще и добавление нового файла /etc/php.d/z_bx_custom.ini со ссылкой на сертификат:
openssl.cafile=/etc/pki/ca-trust/source/anchors/Cert_CA.pem

Далее:
service httpd restart

И curl увидел сертификаты:

protected function RequestToBank($method, $data, $url)
{
$dataEncoded = http_build_query($data);
if(strlen($url) < 1)
return false;

$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $url.$method,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $dataEncoded,
CURLOPT_HTTPHEADER => array('CMS: Bitrix'),
CURLOPT_SSLVERSION => 6
));

$response = curl_exec($curl);
curl_close($curl);

return json_decode($response, true);
}
Ответ написан
Комментировать
Dremkin
@Dremkin
В Ubuntu сделал так:
1. Скачиваем https://securepayments.sberbank.ru/wiki/lib/exe/fe...
2. Из файла Cert_CA.pem вручную в текстовом редакторе делаем отдельные файлы crt на каждый сертификат. Всего получается 11 файлов
3. Кидаем их в папку: /usr/local/share/ca-certificates/
4. Запускаем: sudo update-ca-certificates
5. Curl открывает все сбербанковские ссылки в экваринг API
Ответ написан
Комментировать
the_alex_mark
@the_alex_mark
Разработчик веб-приложений
/**
 * Формирует параметры верификации запроса.
 *
 * @param  resource $ch Дескриптор cURL.
 * @param  string $path Расположение файла сертификата.
 * @param  int $ttl Интервал обновления сертификата (в минутах). По умолчанию: 7 дней.
 * @return void
 */
function curl_setopt_verify($ch, $path, $ttl = 10080) {
    $update = true;
    $chain  = [
        'https://curl.haxx.se/ca/cacert.pem',
        'https://gu-st.ru/content/Other/doc/russiantrustedca.pem'
    ];

    if (file_exists($path)) {

        // Определение необходимости обновления сертификата
        if ((filemtime($path) + ($ttl * 60)) > time())
            $update = false;

        else
            @unlink($path);
    }

    if ($update) {
        foreach ($chain as $url) {
            if ($content = file_get_contents($url))
                file_put_contents($path, $content . PHP_EOL, FILE_APPEND | LOCK_EX);
        }
    }

    if ($ch) {
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);

        if (file_exists($path))
            curl_setopt($ch, CURLOPT_CAINFO, $path);
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы