Мне нужно интегрироваться с API некоторого поставщика услуг, где каждый запрос должен быть подписан закрытым ключом нашего сертификата, и поставщик услуг расшифрует его, используя наш открытый ключ, и аналогично поставщик услуг ответа зашифрует его, используя свой закрытый ключ, и мы расшифруем он использует свой открытый ключ (означает, что мы будем делиться нашим открытым ключом друг с другом)
У поставщика услуг не было образца кода на php
Предоставленные ими инструкции:
Пример кода на 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 дает мне подпись + образец данных запроса,
Поскольку я не могу сгенерировать ту же закодированную строку, которую поставщик услуг предоставил в свой образец,
Вы пытаетесь подписать XML-документы цифровой подписью (XMLDSIG)?
@Daniel, да, Патрик, :-) я имею в виду, правильно ли написал код или нет,
javacode использует кодировку base64 в конце, где вы это используете?
Это немного больше, чем просто подписывать и кодировать данные. Код Java создает полный формат подписи ПКС №7 (это формат для инкапсуляции подписанного хэша, алгоритма, сертификата и т. д.), Вы можете захотеть использовать openssl_pkcs7_sign




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