Шифрование строки с использованием закрытого ключа в php

Мне нужно интегрироваться с API некоторого поставщика услуг, где каждый запрос должен быть подписан закрытым ключом нашего сертификата, и поставщик услуг расшифрует его, используя наш открытый ключ, и аналогично поставщик услуг ответа зашифрует его, используя свой закрытый ключ, и мы расшифруем он использует свой открытый ключ (означает, что мы будем делиться нашим открытым ключом друг с другом)

У поставщика услуг не было образца кода на php

Предоставленные ими инструкции:

  • Получить содержимое в байтах для подписи (с использованием кодировки UTF-8)
  • Получите сертификат X509 (сертификат закрытого ключа)
  • Вычислить дайджест сообщения
  • Подпишите сообщение и сгенерируйте прикрепленную подпись (используйте свойство Detached / connected библиотеки подписи)
  • Закодируйте подписанное сообщение в кодировке 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 дает мне подпись + образец данных запроса,

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

"Правильно ли мой приведенный выше код" Хорошо, дает ли он желаемые результаты?

Patrick Q 24.10.2018 18:08

Вы пытаетесь подписать XML-документы цифровой подписью (XMLDSIG)?

odan 24.10.2018 19:16

@Daniel, да, Патрик, :-) я имею в виду, правильно ли написал код или нет,

shary 24.10.2018 21:10

javacode использует кодировку base64 в конце, где вы это используете?

karthick 25.10.2018 00:46

Это немного больше, чем просто подписывать и кодировать данные. Код Java создает полный формат подписи ПКС №7 (это формат для инкапсуляции подписанного хэша, алгоритма, сертификата и т. д.), Вы можете захотеть использовать openssl_pkcs7_sign

gusto2 26.10.2018 09:11
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
405
0

Другие вопросы по теме