Подписание ключами RSA в .NET (C#)
(1 чел.) (1) гость
  • Страница:
  • 1

ТЕМА: Подписание ключами RSA в .NET (C#)

Подписание ключами RSA в .NET (C#) 2 года, 1 мес. назад #3265

  • AlexeyD
  • Новый участник
  • Постов: 2
  • Репутация: 0
Суть в том, что проверка подписи происходит на стороне ЭСФ (92.46.122.150:8443/esf-web/login), на нашей стороне (C# + C Kalkan; libeay32.dll & ssleay32.dll) идёт формирование данных и их подпись. Так вот подпись на стороне ЭСФ (там Java Kalkan) и не прошла проверку. При разборе деталей выяснили разницу в используемых алгоритмах.

В качестве алгоритма при подписании юридическим ключом используем следующий код:
var x509Cert = new X509Certificate(authCertificatePath, authCertificatePassword);
var authCertificateEncoded = Convert.ToBase64String(x509Cert.Export(X509ContentType.Cert), Base64FormattingOptions.InsertLineBreaks);

var bio = BIO.File(signCertificatePath, "r");
var signX509Cert = OpenSSL.X509.X509Certificate.FromPKCS12(bio, authCertificatePassword);
var signCertificateEncoded = signX509Cert.PEM.Replace("-----BEGIN CERTIFICATE-----\n", string.Empty).Replace("\n-----END CERTIFICATE-----", string.Empty);
                
var digest = MessageDigest.CreateByName("md_gost95"); //Signature Algorithm: GOST 34.311-95 with GOST 34.310-2004
var context = new MessageDigestContext(digest);

--Далее происходит получение необходимого текста для подписи и полученную подпись помещаем в переменную signature
var signature = Convert.ToBase64String(context.Sign(Encoding.UTF8.GetBytes("123"), signX509Cert.PrivateKey));

Текст "123" приведен для примера.

В выше приведенном примере подпись ключом юридического лица проходит успешно. НО если использовать ключ физического лица, то не получается.
Из тех. поддержки по работе с электронными счет-фактурами, порекомендовали сделать следующее:
Если потребуется использовать ключи физ. лиц, Вам следует использовать алгоритм sha256WithRSAEncryption (OID: 1.2.840.113549.1.1.11).

Рекомендуем Вам реализовать подписание через передачу в MessageDigest алгоритма, полученного из пользовательского сертификата, которым подписывается СФ (cert->cert_info->signature->algorithm).


Если выше приведенный код переделать для использования стандартной библиотеки KalkanCryptCOM.

//KalkanCOMdll.SignXML(alias, 0, signNodeId, parentSignNode, parentNameSpace, inData, out outSignXml);
KalkanCOMdll.SignXML("", 0, "", "", "", signTest1, out outSignXml);

где signTest1 =
<invoice><date>20.07.2017</date><invoiceType>ORDINARY_INVOICE</invoiceType><num>1</num><operatorFullname>baidan</operatorFullname><signatureType>OPERATOR</signatureType><addInf>Приложение №17 от 22.11.2016г.</addInf><consignee><address>LAWN HOUSE  74 SHEPHERDS BUSH GREEN,</address><name>Компания "UNIPEC U.K. Company  Limited"</name></consignee><consignor><address>г. Актау, мкр 3 , 82А</address><name>Казахстанский филиал компании "Нельсон Петролеум Бузачи Б.В."</name><tin>990341000901</tin></consignor><customers><customer><address>LAWN HOUSE  74 SHEPHERDS BUSH GREEN,</address><name>Компания "UNIPEC U.K. Company  Limited"</name><statuses><status>NONRESIDENT</status></statuses><countryCode>GBR</countryCode></customer></customers><deliveryTerm><contractDate>21.08.2015</contractDate><contractNum>NPB2015/30/00</contractNum><destination>Новороссийск</destination><exerciseWay>ФОБ</exerciseWay><term>в течение 5-ти рабочих дней</term></deliveryTerm><productSet><currencyCode>USD</currencyCode><currencyRate>313.21</currencyRate><product><description>Нефть сырая (SKS Segura)</description><ndsAmount>0</ndsAmount><ndsRate>0</ndsRate><priceWithTax>5587225.48</priceWithTax><priceWithoutTax>5587225.48</priceWithoutTax><quantity>108164</quantity><turnoverSize>5587225.48</turnoverSize><unitNomenclature>Барр</unitNomenclature><unitPrice>51.655</unitPrice></product><totalExciseAmount>0</totalExciseAmount><totalNdsAmount>0</totalNdsAmount><totalPriceWithTax>5587225.48</totalPriceWithTax><totalPriceWithoutTax>5587225.48</totalPriceWithoutTax><totalTurnoverSize>5587225.48</totalTurnoverSize></productSet><sellers><seller><address>г. Актау, мкр 3 , 82А</address><bank>АО "Ситибанк Казахстан"</bank><bik>CITIKZKA</bik><certificateNum>1399478</certificateNum><certificateSeries>13788</certificateSeries><deliveryDocDate>19.03.2017</deliveryDocDate><deliveryDocNum>BL10</deliveryDocNum><iik>KZ4983201D0300268013USD</iik><kbe>17</kbe><name>Казахстанский филиал компании "Нельсон Петролеум Бузачи Б.В."</name><statuses><status>EXPORTER</status></statuses><tin>123456789021</tin></seller></sellers><turnoverDate>31.03.2017</turnoverDate></invoice>


В результате outSignXml =
<?xml version="1.0" encoding="UTF-8"?>
<invoice><date>20.07.2017</date><invoiceType>ORDINARY_INVOICE</invoiceType><num>1</num><operatorFullname>baidan</operatorFullname><signatureType>OPERATOR</signatureType><addInf>Приложение №17 от 22.11.2016г.</addInf><consignee><address>LAWN HOUSE  74 SHEPHERDS BUSH GREEN,</address><name>Компания "UNIPEC U.K. Company  Limited"</name></consignee><consignor><address>г. Актау, мкр 3 , 82А</address><name>Казахстанский филиал компании "Нельсон Петролеум Бузачи Б.В."</name><tin>990341000901</tin></consignor><customers><customer><address>LAWN HOUSE  74 SHEPHERDS BUSH GREEN,</address><name>Компания "UNIPEC U.K. Company  Limited"</name><statuses><status>NONRESIDENT</status></statuses><countryCode>GBR</countryCode></customer></customers><deliveryTerm><contractDate>21.08.2015</contractDate><contractNum>NPB2015/30/00</contractNum><destination>Новороссийск</destination><exerciseWay>ФОБ</exerciseWay><term>в течение 5-ти рабочих дней</term></deliveryTerm><productSet><currencyCode>USD</currencyCode><currencyRate>313.21</currencyRate><product><description>Нефть сырая (SKS Segura)</description><ndsAmount>0</ndsAmount><ndsRate>0</ndsRate><priceWithTax>5587225.48</priceWithTax><priceWithoutTax>5587225.48</priceWithoutTax><quantity>108164</quantity><turnoverSize>5587225.48</turnoverSize><unitNomenclature>Барр</unitNomenclature><unitPrice>51.655</unitPrice></product><totalExciseAmount>0</totalExciseAmount><totalNdsAmount>0</totalNdsAmount><totalPriceWithTax>5587225.48</totalPriceWithTax><totalPriceWithoutTax>5587225.48</totalPriceWithoutTax><totalTurnoverSize>5587225.48</totalTurnoverSize></productSet><sellers><seller><address>г. Актау, мкр 3 , 82А</address><bank>АО "Ситибанк Казахстан"</bank><bik>CITIKZKA</bik><certificateNum>1399478</certificateNum><certificateSeries>13788</certificateSeries><deliveryDocDate>19.03.2017</deliveryDocDate><deliveryDocNum>BL10</deliveryDocNum><iik>KZ4983201D0300268013USD</iik><kbe>17</kbe><name>Казахстанский филиал компании "Нельсон Петролеум Бузачи Б.В."</name><statuses><status>EXPORTER</status></statuses><tin>123456789021</tin></seller></sellers><turnoverDate>31.03.2017</turnoverDate><ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="1">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
<ds:Reference URI="">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
<ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue>9YX2ol59qJS4V89nIXeohTmlj8z/9mJ/rbXJGWNtQrQ=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>n29jwZoAhL0iwYmp/Pv1rNq50pifUKhS11vCoiTbalbsKVuenmlA2R7PQaz/1vyF
WpY8KMIsq/TnV1VbdCIxGzRO2Y6cCsZb3octuL4IwMTAnEbElJhWOZo6EaX3KqY0
gMeHTpixVhEKOlk8avurdSRyC2hq2eYMLtmvn28XxJdjPeSiXqwH7mhTd5SUxEal
HOIlkVNnZkKuj9EzxqwZdtIQ0V4uin6HXodal7n1yfoZTItPty8FUTrZ3hxRkl9h
6TAYtMXhiXZxCzCrikleFc74C+yfexu4rpePBzYTaDAJVqIAVlrYLFO5bEbj1CGM
8qyps5dQULS+rScwYSSX3A==</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>MIIG4DCCBMigAwIBAgIUEvoS93sI5h9/iFtQCkMwvBpOjTQwDQYJKoZIhvcNAQEL
BQAwgc4xCzAJBgNVBAYTAktaMRUwEwYDVQQHDAzQkNCh0KLQkNCd0JAxFTATBgNV
BAgMDNCQ0KHQotCQ0J3QkDFMMEoGA1UECgxD0KDQnNCaIMKr0JzQldCc0JvQldCa
0JXQotCi0IbQmiDQotCV0KXQndCY0JrQkNCb0KvSmiDSmtCr0JfQnNCV0KLCuzFD
MEEGA1UEAww60rDQm9Ci0KLQq9KaINCa0KPTmNCb0JDQndCU0KvQoNCj0KjQqyDQ
ntCg0KLQkNCb0KvSmiAoUlNBKTAeFw0xNjEyMjYwNzU1NDRaFw0xNzEyMjYwNzU1
NDRaMIG1MSYwJAYDVQQDDB3QlNCV0KDQr9CR0JjQnSDQkNCb0JXQmtCh0JXQmTEX
MBUGA1UEBAwO0JTQldCg0K/QkdCY0J0xGDAWBgNVBAUTD0lJTjg0MDIxMzMwMDAy
MjELMAkGA1UEBhMCS1oxFTATBgNVBAcMDNCQ0JvQnNCQ0KLQqzEVMBMGA1UECAwM
0JDQm9Cc0JDQotCrMR0wGwYDVQQqDBTQktCQ0JvQldCg0KzQldCS0JjQpzCCASIw
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOdnY0aaG28nJ0CcWhhu9x4/Xpdz
LaF5ozFiw/nrmnPBVrG/LHoETnKOQk6NGJiHM/i/CFQAfozro36qBDGaVwdbSRmY
9zcP+/gfmLhuO/sI2q4mIWSQtO7k1UjfLcxEjCyNVI7DEg+u5WWbGteGPFK+jvq5
d4rX12SDZobNkLb4dm3va2SBz+Zw/jlmr3sUwNdPkol//Ti2QpZCiPtPLJCHd0SV
E75X/GGu1zcPIx4Njn52HJ5UP4uOel2fcmxcZOsj+DASR2wv2E7HBuFHOxjZSEcx
AKvDPWAnEC1jMwJVuKAAPbvJgw+PcMWBZp8JZRs5GyNllatfLf7uD0vw3C8CAwEA
AaOCAcswggHHMA4GA1UdDwEB/wQEAwIGwDAdBgNVHSUEFjAUBggrBgEFBQcDBAYI
KoMOAwMEAQEwDwYDVR0jBAgwBoAEVbW04jAdBgNVHQ4EFgQUFZCpF6lqxSt7Yplt
tqLSjluWr/kwXgYDVR0gBFcwVTBTBgcqgw4DAwIDMEgwIQYIKwYBBQUHAgEWFWh0
dHA6Ly9wa2kuZ292Lmt6L2NwczAjBggrBgEFBQcCAjAXDBVodHRwOi8vcGtpLmdv
di5rei9jcHMwTgYDVR0fBEcwRTBDoEGgP4YdaHR0cDovL2NybC5wa2kuZ292Lmt6
L3JzYS5jcmyGHmh0dHA6Ly9jcmwxLnBraS5nb3Yua3ovcnNhLmNybDBSBgNVHS4E
SzBJMEegRaBDhh9odHRwOi8vY3JsLnBraS5nb3Yua3ovZF9yc2EuY3JshiBodHRw
Oi8vY3JsMS5wa2kuZ292Lmt6L2RfcnNhLmNybDBiBggrBgEFBQcBAQRWMFQwLgYI
KwYBBQUHMAKGImh0dHA6Ly9wa2kuZ292Lmt6L2NlcnQvcGtpX3JzYS5jZXIwIgYI
KwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5nb3Yua3owDQYJKoZIhvcNAQELBQAD
ggIBABoNvtAowcfDlS4DGWdp+MHiP4Md0CihUM0fmZpYrDfrgsugNrwaZGAvCbv7
mmYl5et4+Pmg0lyYti5yifdprBZK6VtmTQGLIkQBXvIma7s1gB/q4ULEs9BMEJAN
TKJoksfuT4Icj3YpSgDCrWunTVz+9jRWyzwD/HpAfayyAokUp56P2BeAvxF0NBUq
fcOjAmnGxElDdHudVzWE4MBZJGXFmT7tPMKysXtZqXc3dbAb5KYUiw3StlK02M32
w6x5GiTUMy0sC3mIZ49DiK1Rxk0hTl/9BK0Nr5DnVM5AZn9Z5/er9KkdoCjoLoh3
XS247tyDowjITLOJSxBb8r/naMZyQfjjDVOC5eeyQgTk5vp8CKjqok3OM5MeqT7L
EqHt1Zjn10PhHlpfQuWQE1cQo4hiG6ozSjmqgP2dK37IXWStB6NYzIMhcsct/ZeB
r7+RU4u0J3le3JixEF7xzBhkHBEcUoe3KkLZiIblGHBptDCxUFCFTt0HWkeCntIo
Dm74TaMNQqNguGg8pUfT9sbJlcTsBk2E1D4BGYhCvatj2KiRO6diFN3NZRQ7WHTw
uSW3Sb50tZ1jXc9E9d6mhcz2r6WNgc8iF5SJn2sTri82dy6NzSUz8ZarkdMlOzLh
Id3FffHiInxSnqXp1C2m0kufEVTRvuCOjqa8zT2KdakQjcQT</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature></invoice>


Если использовать значение из тега SignatureValue для подписи ЭСФ на тестовом сайте "ИС ЭСФ" (92.46.122.150:8443/esf-web/login)), то в результате "ИС ЭСФ" не примет такую ЭСФ с текстом сообщения "Ошибка подписи".

Вопрос:
1. Что необходимо сделать, что с KalkanCOMdll.SignXML, чтобы получить верную подпись, которую примет сайт "ИС ЭСФ"?
2. Что необходимо подать в строку
var digest = MessageDigest.CreateByName("md_gost95")
, чтобы подпись ключом физ. лица прошла проверку успешно?
Изменено: 2 года, 1 мес. назад от AlexeyD.

Re: Подписание ключами RSA в .NET (C#) 2 года назад #3278

  • AlexeyD
  • Новый участник
  • Постов: 2
  • Репутация: 0
Для подписи ключом ЭЦП юридического лица необходимо использовать следующее:
var digest = MessageDigest.CreateByName("md_gost95"); } //Signature Algorithm: GOST 34.311-95 with GOST 34.310-2004

Для подписи ключом ЭЦП физического лица необходимо использовать следующее:
var digest = MessageDigest.CreateByName("RSA-SHA256"); } //Signature Algorithm: sha256WithRSAEncryption


По крайней мере такую подпись принимает система "ИС ЭСФ" ( 92.46.122.150:8443/esf-web/login).

Re: Подписание ключами RSA в .NET (C#) 1 год, 9 мес. назад #3468

  • yerhat
  • Новый участник
  • Постов: 14
  • Репутация: 1
.
Изменено: 1 год, 9 мес. назад от yerhat.
  • Страница:
  • 1
FaLang translation system by Faboba