Мне нужно интегрироваться с API-интерфейсом какого-либо поставщика услуг, где каждый запрос должен быть подписан закрытым ключом нашего сертификата, а поставщик услуг расшифровывает его с помощью нашего открытого ключа и аналогичным образом поставщик услуг ответа будет шифровать его с помощью своего закрытого ключа имы расшифруем его, используя их открытый ключ (значит, мы передадим наш открытый ключ друг другу)
У поставщика услуг не было примера кода в php
Инструкции, которые онипредоставляются:
- Получение содержимого в байтах для подписи (с использованием кодировки UTF-8)
- Получение сертификата X509 (сертификата закрытого ключа)
- Вычисление дайджеста сообщения
- Подпишите сообщение и сгенерируйте прикрепленную подпись (используйте свойство Detached / attach из библиотеки подписей)
- Кодируйте подписанное сообщение в кодировку Base64
- Отправьте закодированное сообщение по HTTP
Пример кода на Java, предоставляемый поставщиком услуг:
string data = "SAMPLE REQUEST XML";
priv = (PrivateKey)keystore.getKey(name, passw);
CMSSignedDataGenerator sgen = new CMSSignedDataGenerator();
sgen.addSigner(priv, (X509Certificate)cert, CMSSignedDataGenerator.DIGEST_SHA1);
sgen.addCertificatesAndCRLs(certs);
byte[] utf8 = data.getBytes("UTF8");
// The 2nd parameter need to be true (dettached form) we need to attach original message to signed message
CMSSignedData csd = sgen.generate(new CMSProcessableByteArray(utf8), true, "BC");
byte[] signedData = csd.getEncoded();
char[] signedDataB64 = Base64Coder.encode(signedData);
String str = new String(signedDataB64);
Я написал следующеекод крыла в php:
$utf8_data = utf8_encode($xmlString);
$byte_array = unpack('C*', $utf8_data);
$bytesStr = implode("", $byte_array);
$data = file_get_contents('/path/to/abc.pfx');
$certPassword = 'certpassword';
openssl_pkcs12_read($data, $certs, $certPassword);
$private_key = $certs['pkey'];
$binary_signature = "";
openssl_sign($bytesStr, $binary_signature, $private_key, OPENSSL_ALGO_SHA1);
Теперь мой вопрос правильный мой код выше?Кроме того, как openssl_sign дает мне подпись + образец данных запроса,
Поскольку я не могу сгенерировать ту же самую закодированную строку, которую поставщик услуг предоставил в свой образец,