Я получил файл JKS, зашифрованный паролем, из финансового учреждения. API использует порт 444. Когда я использую файл JKS и пароль с SoapUI («Настройки» -> «Настройки SSL» -> «KeyStore [File] + KeyStore Password»), я могу отправлять и получать XML-запросы и ответы. Без JSK-файла и пароля, если я пытаюсь получить доступ к URL-адресу, браузер не загружает страницу API.
После установки файла и предоставления пароля браузеру (Firefox -> Параметры -> Дополнительно -> Просмотреть сертификат -> Импорт); результат страницы показывает Неправильный запрос »[формат XML] (Это может получить доступ к странице с сертификатом).
Я преобразовал файл в P12 / PEM (используя: keytool -importkeystore -srckeystore keystore.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore keystore.p12) — и он работает так же, как и выше (как для SoupUI, так и для браузера).
Теперь мне нравится использовать этот файл (JKS / PEM) в моем коде PHP на сервере разработки IIS и сервере Apache-Production. Во время исполнения я получаю: Ошибка: проблема с сертификатом SSL: невозможно получить сертификат локального эмитента.
Примечание: тот же файл JKS с тем же паролем используется другим поставщиком, и среда Python работает нормально.
Пожалуйста, предложите решение.
Спасибо.
Сначала необходимо преобразовать файл JKS в PEM, который может быть использован вашим кодом PHP.
Тогда это должно сделать:
$options = array(
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_PORT => <Port#>, //Post
CURLOPT_CAPATH => $ca_path, //CA Path ***and not filename
CURLOPT_CAINFO => $cert_file, //Certificate File
CURLOPT_SSLCERT => $key_file, //SSL file
CURLOPT_SSLKEYPASSWD => $key_password, //Public Key
CURLOPT_HTTPHEADER => $aHeaders, //Header
CURLOPT_POST => 1, //Send POST
CURLOPT_POSTFIELDS => $xml, //To Fetch Data
CURLINFO_HEADER_OUT => $properties, //Application's Username and password
);
$ch = curl_init($url);
curl_setopt_array($ch, $options);
$content = curl_exec($ch);
$err = curl_errno($ch);
$errmsg = curl_error($ch);
$header = curl_getinfo($ch);
curl_close($ch);
$header['errno'] = $err;
$header['errmsg'] = $errmsg;
$header['content'] = $content;
Других решений пока нет …