Кто знает, помогите пожалуйста.
Итак, электронные больничные. Пытаюсь скрестить с нашей МИС (почти самописной) на PHP. Сервер на centos
прошел практически все этапы сложного квеста - установил всяческие утилиты cryptopro, собрал модуль phpcades, установил сертификаты
научился каноникализации (по крайней мере понял что это), научился правильно расчитывать хеш, научился правильно рассчитывать подпись, (даже понял что ее надо отреверсивить побайтно)- если кстати у кого-то вопросы - готов научить, остановился на пункте с шифрованием.
хитростью и ваершарком удалось получить пример такого шифрованного xml - чтобы понимать куда, в каком направлении двигаться. какие примерно данные подготовить
Для того чтобы отправить шифрованный запрос (насколько я понял) надо знать и подготовить три параметра
1 - публичный сертификат пользователя (с помощь которого фсс зашифрует ответ и отдаст его мне, а я в свою очередь смогу расшифровать его своим секретным ключом)
2 - случайный сессионный ключ
3 - само уже зашифрованное сообщение
с 1 параметром никаких проблем, непонятки с 2 и 3.
просмотрев код phpcades - придумал зашифровать запрос с помощью CPEnvelopedData указав в качестве сертификата публичный сертификат ФСС
Цитата:// $fss_cer = "/srv/FSS_PROD_CERT_2019_34.10-2012.cer";
$fss_cer = "/srv/FSS_TEST_CERT_2019_34.10-2012.cer";
$content = base64_encode(file_get_contents("/srv/req.xml")); /* здесь у нас правильный сформированый запрос,
успешно протестированый на
https://docs-test.fss.ru...ileOperationsLnPort?WSDL - т.е. без шифрования */
$cert = new CPCertificate();
$cert->Import(file_get_contents($fss_cer));
print "get_SerialNumber : ".$cert->get_SerialNumber()."\n";
print "get_Thumbprint : ".$cert->get_Thumbprint()."\n";
print "get_SubjectName : ".$cert->get_SubjectName()."\n";
print "get_IssuerName : ".$cert->get_IssuerName()."\n";
print "get_Version : ".$cert->get_Version()."\n";
print "get_ValidToDate : ".$cert->get_ValidToDate()."\n";
print "get_ValidFromDate : ".$cert->get_ValidFromDate()."\n";
$obj = new CPEnvelopedData();
$obj->set_Content($content);
$obj->get_Recipients()->Add($cert);
$v = $obj->Encrypt(BASE64_TO_BINARY);
file_put_contents('test_asn1_struc.pem',wordwrap( base64_encode($v),64,"\n",TRUE)); //эту структуру я и загнал в
https://lapo.it/asn1js/}
catch (Exception $e)
{
printf($e->getMessage());
}
на выходе получил ASN.1 структуру
https://lapo.it/asn1js/#...GMMUL1IG0E+188sZkyMdQ7Y=заметил что структура сессионного ключа, которую я получил хитростью и ваершарком
https://lapo.it/asn1js/#...vdXk8kqexWBAgvkcnUStx2pgочень похожая есть, в том, что я получил с помощью CPEnvelopedData
а в конце - как раз все очень похоже на сами зашифрованные данные.
Подскажите пожалуйста, прав ли я, или ошибаюсь, ибо заполнив все эти параметры и отправив полученный xml курлом на
https://docs-test.fss.ru...ileOperationsLnPort?WSDLя получаю 500-ю ошибку
Код:* About to connect() to docs-test.fss.ru port 443 (#0)
* Trying 193.148.44.188... connected
* Connected to docs-test.fss.ru (193.148.44.188) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none
* SSL connection using TLS_RSA_WITH_RC4_128_MD5
* Server certificate:
* subject: CN=*.fss.ru,OU=job,O=The Fund of Social Insurance of the Russian Federation,L=Moscow,C=RU
* start date: Aug 14 00:00:00 2018 GMT
* expire date: Aug 13 12:00:00 2020 GMT
* common name: *.fss.ru
* issuer: CN=Thawte RSA CA 2018,OU=www.digicert.com,O=DigiCert Inc,C=US
> POST /WSLnCryptoV11/FileOperationsLnPort?WSDL HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.27.1 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: docs-test.fss.ru
> Accept: */*
> Content-Type: text/xml
> Content-Length: 25
>
< HTTP/1.1 500 Internal Server Error
< Date: Mon, 16 Sep 2019 10:33:48 GMT
< Server: GlassFish Server Open Source Edition 4.1.2
< X-Powered-By: Servlet/3.1 JSP/2.3 (GlassFish Server Open Source Edition 4.1.2 Java/Oracle Corporation/1.8)
< Content-Type: text/xml; charset=utf-8
< Connection: close
< Transfer-Encoding: chunked
<
<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope"><faultcode>S:Client</faultcode><faultstring>Couldn't create SOAP message due to exception: XML reader error: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '/' (code 47) in prolog; expected '<'
* Closing connection #0
at [row,col {unknown-source}]: [1,1]</faultstring></S:Fault></S:Body></S:Envelope>