php curl с сертификатом и файлом ключа, не подключающимся к swish payment api

#php #curl #certificate #pem #swish

#php #curl #сертификат #pem #swish

Вопрос:

Мне нужно внедрить Swish Payment e-commerce API на моем веб-сайте. Тестовый код, предоставленный swish, отлично работает с использованием Git Bash. Пример здесь

 curl -s -S -i --cert ./Swish_Merchant_TestCertificate_1231181189.pem --key ./Swish_Merchant_TestCertificate_1231181189.key --cacert ./Swish_TLS_RootCA.pem --tlsv1.1 --header "Content-Type: application/json" https://mss.cpc.getswish.net/swish-cpcapi/api/v1/paymentrequests --data '{ "payeePaymentReference" : "0123456789", "callbackUrl" : "https://myfakehost.se/swishcallback.cfm", "payerAlias" : "4671234768", "payeeAlias" : "1231181189", "amount" : "100", "currency" : "SEK", "message" : "Kingston USB Flash Drive 8 GB" }'
  

но когда я конвертирую его в php, это выдает ошибку
Ошибка cURL #: ошибка: 14094410: процедуры SSL: ssl3_read_bytes: сбой подтверждения связи sslv3

Мой php-код здесь

     $data = array(
    "content-type: application/json",
    "accept: application/json",
    "payeePaymentReference: 0123456789",
    "callbackUrl: https://myfakehost.se/swishcallback.cfm",
    "payerAlias: 4671234768",
    "payeeAlias: 1231181189",
    "amount: 100",
    "currency: SEK",
    "message: Kingston USB Flash Drive 8 GB"
);
$curl = curl_init();
curl_setopt($curl, CURLOPT_SSLCERT, getcwd() . '/Swish_Merchant_TestCertificate_1231181189.pem');
curl_setopt($curl, CURLOPT_SSLKEY, getcwd() .'/Swish_Merchant_TestCertificate_1231181189.key');
curl_setopt($curl, CURLOPT_SSLKEYPASSWD,  'swish');
curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://mss.cpc.getswish.net/swish-cpcapi/v1/paymentrequests/',
  CURLOPT_RETURNTRANSFER => TRUE,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_POSTFIELDS => json_encode($data),
  CURLOPT_HTTPHEADER => array(
    "content-type: application/json"
  )
));

$response = curl_exec($curl);

$err = curl_error($curl);
curl_close($curl);
if ($err) {
   echo "cURL Error #:" . $err;
} else {
   echo "Well:" .$response;
}
  

Комментарии:

1. --cacert ./Swish_TLS_RootCA.pem вероятно, необязательно …

2. @SakibAli вы решили это?

Ответ №1:

Вам не хватает сертификата CA.

Добавьте следующую опцию curl

 curl_setopt($curl, CURLOPT_CAINFO, getcwd() . './Swish_TLS_RootCA.pem');
  

Ответ №2:

я думаю, проблема здесь в том, что ваш php / libcurl по умолчанию имеет значение SSLv3, и это mss.cpc.getswish.net отключило поддержку SSLv3 (большинство веб-сайтов больше не поддерживают его, потому что это небезопасно),

1: вы запускаете curl_setopt без проверки ошибок, исправьте это

2. вы забыли установить CURLOPT_SSLVERSION в значение CURL_SSLVERSION_TLSv1_1 , исправьте это

 if(!curl_setopt($ch,CURLOPT_SSLVERSION,CURL_SSLVERSION_TLSv1_1)){
    throw new RuntimeException('failed to set CURL_SSLVERSION_TLSv1_1');
}
  
  • но, учитывая, что в вашей установке php / libcurl по умолчанию установлен SSLv3, ваша установка php, вероятно, слишком старая, чтобы использовать TLS1.1 в любом случае .. что означает, что вам, вероятно, нужно обновить вашу установку php / libcurl.

Комментарии:

1. Спасибо за ваш ответ, использующий php версии 7.2.5 и SSL_VERSION_TLSv1_1, но все еще показывающий ошибку

2. При применении версии TLS ошибка исправлена, но теперь она выдает мне ошибку OpenSSL SSL_read: SSL_ERROR_SYSCALL, ошибка 104

3. @SakibAli что вы получаете от запуска php -r 'phpinfo();' | pastebinit ?