Шифрование строки с использованием закрытого ключа в php - PullRequest
0 голосов
/ 24 октября 2018

Мне нужно интегрироваться с 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 дает мне подпись + образец данных запроса,

Поскольку я не могу сгенерировать ту же самую закодированную строку, которую поставщик услуг предоставил в свой образец,

...