B2BB2CH2H

Подписание XML RSA-сертификатом

Способ защиты данных определяется настройками интеграции. Для уточнения информации по настройке Вашей интеграции или запроса для установления нужных настроек необходимо написать на почту alfa_api@alfabank.ru. При запросе установления настроек необходимо сообщить способ защиты (подпись или подпись с шифрованием), а также алгоритм (RSA или ГОСТ).

Подписание XML
1

Подготовить сообщение в формате XML

Пример сообщения
1<?xml version="1.0" encoding="UTF-8"?>
2<Request>
3    <XmlElementName1>XmlElementValue1</XmlElementName1>
4    <XmlElementName2>XmlElementValue2</XmlElementName2>
5</Request>
2

Подписать запрос

Сформируйте электронную подпись в cоответствии с XMLDsig. Необходимо использовать:

Пример XMLDsig
1<?xml version="1.0" encoding="UTF-8"?>
2<Request>
3    <XmlElementName1>XmlElementValue1</XmlElementName1>
4    <XmlElementName2>XmlElementValue2</XmlElementName2>
5    <ds:Signature xmlns="http://www.w3.org/2000/09/xmldsig#" Id="sigID1">
6        <ds:SignedInfo>
7            <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
8            </ds:CanonicalizationMethod>
9            <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256">
10            </ds:SignatureMethod>
11            <ds:Reference URI="">
12                <ds:Transforms>
13                    <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature">
14                    </ds:Transform>
15                    <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
16                    </ds:Transform>
17                </ds:Transforms>
18                <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#sha384">
19                </ds:DigestMethod>
20                <ds:DigestValue>PFofJkUS6p/00mh0rGBsixzt/IrT0VOQRD3kvQkD3TyPEle2o1Ba7NCMR/ATvzQF</ds:DigestValue>
21            </ds:Reference>
22        </ds:SignedInfo>
23        <ds:SignatureValue>wxBWAIhbSFENVHMdLJ051lZGlhEUbIPPo9W/4BrBjOtNo/cfu9MxCLv7GSqVz0Kr6g6L6+k9q+hu&#13;
24CVAebijxjUmub3KUTx7GPq6SjQsrFo5sZmZg73eyLqiEM3LFux4PJEXeVSadzOpQGBg0ygDZ83gU&#13;
25OXY/YJcwSRcBEQpNp+62ot1ua90QBJzNApZkWtxwSlBvGS0SYmh+6vg0yFbc60h231Q4bBSdWJcD&#13;
26vaAIIayCwbt3oUm2simOGvc/adfz4vn6xiLQCAEDsyD0iK9m9WssqIZKepe8wI0kJCC9CwHx6Zxg&#13;
27Geys+G77rQvskKmN13EX3sokbLAnzb4cWnwZVQ==
28</ds:SignatureValue>
29        <ds:KeyInfo>
30            <ds:X509Data>
31                <ds:X509Certificate>MIIGATCCBLWgAwIBAgITYQADiqqgHk1/OTmNhAABAAOKqjBBBgkqhkiG9w0BAQowNKAPMA0GCWCG&#13;
32SAFlAwQCAwUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAwUAogMCAUAwWzELMAkGA1UEBhMC&#13;
33UlUxEjAQBgNVBAoTCUFsZmEtQmFuazELMAkGA1UECxMCSVQxKzApBgNVBAMTIkFsZmEtQmFuayBJ&#13;
34c3N1aW5nIFN1Ym9yZGluYXRlIENBIDEwHhcNMjMwNzI4MTUxMTE0WhcNMjUwNjE5MTE0ODA2WjCB&#13;
35pzEXMBUGA1UEKgwO0JXRgNC80L7Qu9Cw0LkxGzAZBgNVBAQMEtCa0YPQtNGA0Y/QstGG0LXQsjEL&#13;
36MAkGA1UEBhMCUlUxOzA5BgNVBAMMMtCa0YPQtNGA0Y/QstGG0LXQsiDQldGA0LzQvtC70LDQuSDQ&#13;
37mNCz0L7RgNC10LLQuNGHMSUwIwYJKoZIhvcNAQkBFhZVc2VyNTA0QHBvY2h0b2Noa2EuY29tMIIB&#13;
38IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ZM3Ztf+Ro4e64R8yI4qDV/zLdJjUCx5WNBx&#13;
396gcp1pJ4uhQixw+ASy4Oxu0Xp7OxmpXtvDJFi4kr6QymtzMNYqJA3GZk85p+Iobkwo5zHKyBf0tX&#13;
405HwmFWjJx9CqZKp8iZAFw9nqz1uqronxyzTgULPL6eE9igVSzaVf5msV8sXXfl87guVHF+Ph18hs&#13;
41dng1WiCJ7Mi14ETdI9O0R5eJiPZztLIHRnXuBtB1Oa1YiiWtvkZNnpLKONwxljdTZlH7h7KfaXUw&#13;
42W3kX8r0p7jvO7gNhMXvOSK1JPXWevmBHrjONVlG2atWoxT2IHs2ZDz+BLxgSwLc9NIQK+qKhIMfA&#13;
431wIDAQABo4ICBzCCAgMwJQYDVR0RBB4wHIILZXhhbXBsZS5jb22CDSouZXhhbXBsZS5jb20wHQYD&#13;
44VR0OBBYEFGbczU3B6IZhHwKsC8ODg8r4xi3nMB8GA1UdIwQYMBaAFMkXMx6bqZSglhhLbnFMgdvp&#13;
45c/5lMIG7BgNVHR8EgbMwgbAwga2ggaqggaeGOWh0dHBzOi8vdGVzdGptYi5hbGZhYmFuay5ydS9k&#13;
46aXN0cnBvaW50L0FsZmEtQmFua19TQ0ExLmNybIYwaHR0cDovL3Zsa3dzNjo5MDgxL2Rpc3RycG9p&#13;
47bnQvQWxmYS1CYW5rX1NDQTEuY3JshjhodHRwOi8vdGVzdGptYi5hbGZhYmFuay5ydS9kaXN0cnBv&#13;
48aW50L0FsZmEtQmFua19TQ0ExLmNybDCB2wYIKwYBBQUHAQEEgc4wgcswRQYIKwYBBQUHMAKGOWh0&#13;
49dHBzOi8vdGVzdGptYi5hbGZhYmFuay5ydS9kaXN0cnBvaW50L0FsZmEtQmFua19TQ0ExLmNydDA8&#13;
50BggrBgEFBQcwAoYwaHR0cDovL3Zsa3dzNjo5MDgxL2Rpc3RycG9pbnQvQWxmYS1CYW5rX1NDQTEu&#13;
51Y3J0MEQGCCsGAQUFBzAChjhodHRwOi8vdGVzdGptYi5hbGZhYmFuay5ydS9kaXN0cnBvaW50L0Fs&#13;
52ZmEtQmFua19TQ0ExLmNydDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAwUAoRwwGgYJKoZI&#13;
53hvcNAQEIMA0GCWCGSAFlAwQCAwUAogMCAUADggEBAHTjDmxldqWkRgpT5gXKuIzyqIHjlDZMMfah&#13;
54cWBxqWV9XC46bcPx8gvlpzb8N+oK+X6AqDt3+vneAiGQn8iNs9ajDKtes9ulZzMUJBwzwv26DsiI&#13;
553s4/0phypAcqQVHJQxvU+rdrh5FgqJcNZsuOtOaJhiO/i/3J7hoL/oxVwSk+lX4m+X5u76/Vdqk9&#13;
56ydKXNNnzMi12F4FvD+igTrezzLjPHQRx5vLY0cWwLEdBxLJmBwd1u7EBT3j+v9Pyh0pTzXsJC0BY&#13;
571BIt6VOh6QGKGTKT3cBB6zbIOrY7UTOkYdCqtyB9vhayAyti3aO37PANUQ7dUwUEZyf64/D4/HRl&#13;
58hqI=
59</ds:X509Certificate>
60            </ds:X509Data>
61        </ds:KeyInfo>
62    </ds:Signature>
63</Request>
3

Выполнить запрос

Если добавить заголовки Content-Type: application/xml + X-Request-ChannelSecurity: NO и отправить запрос, то подпись запроса не будет проверяться.

Если добавить заголовки Content-Type: application/xml + X-Request-ChannelSecurity: SIGNATURE и отправить запрос, то подпись запроса будет проверяться.

Если подпись валидна - запрос обрабатывается, если невалидна - Банк определяет запрос как неподлинный и возвращает ошибку.

Проверка подписи XML
1

Получить ответ

Если добавить заголовки Accept: application/xml + X-Response-ChannelSecurity: NO , то ответ не будет подписан.

Если добавить заголовки Accept: application/xml + X-Response-ChannelSecurity: SIGNATURE , то полученный ответ (в том числе ошибки) будет подписан и представлен в виде XMLDsig.

  1. 1.
    Примените алгоритм канонизации, указанный в ds:CanonicalizationMethod , к элементу SignedInfo . Используйте алгоритм Exclusive XML Canonicalization для преобразования SignedInfo в каноническую форму.
  2. 2.
    Используя алгоритм хеширования, указанный в ds:SignatureMethod , вычислите хеш-значение из канонизированного SignedInfo .
  3. 3.
    Декодируйте значение подписи из элемента ds:SignatureValue с использованием Base64.
  4. 4.
    Проверьте целостность содержимого:
    • •
      вычислите хеш-значение оригинальных данных (то есть тела сообщения без учёта подписи), используя алгоритм, указанный в ds:DigestMethod ;
    • •
      сравните вычисленное хеш-значение с декодированным из Base64 значением, указанным в ds:DigestValue . Если значения совпадают, содержимое не изменилось после подписания.
Пример XMLDsig
1<?xml version="1.0" encoding="UTF-8"?>
2<Response>
3    <XmlElementName1>XmlElementValue1</XmlElementName1>
4    <XmlElementName2>XmlElementValue2</XmlElementName2>
5    <ds:Signature
6        xmlns="http://www.w3.org/2000/09/xmldsig#" Id="sigID1">
7        <ds:SignatureValue>H6jGW+bKLwvQ9xxbhZ6jNYRHtupT4aJ4jjlLh4W8svK0w5G7ZXf4OxqRR0t2l6aYOpNBdN2Q0+2T&#13;
81LXyadtnz7XJ7QYXNXrnWNcq7mOxM5Lj5bBQa2JPZSiMkp1lsnAV/LFDAJ+Uhruj3mFQxjiFpJLR&#13;
9W/vRJzmRv925xXWopb94PFvP9mjtAwPXtBGEL5rqJICabzVo8+1BfPwFF5+8sqYzT74mmJIQmeFm&#13;
10FiYVMNive5lRxlt7nXEgS4iENF1dXq5+prCPloms8hIX6I4HQo3Jn+G37Os57nv8g61gk4jnu2OK&#13;
11bOsZasIzXSLVG2GrCbDQ+HFjWs3Fgg4JOkULfw==
12</ds:SignatureValue>
13        <ds:SignedInfo>
14            <ds:Reference URI="">
15                <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#sha384"></ds:DigestMethod>
16                <ds:DigestValue>xgVcc1UZhuWRp4/8K0OAVLuQUhySUtJg7mYo78Od+WWidnIZr2XZUvPqwxOpFwRY</ds:DigestValue>
17                <ds:Transforms>
18                    <ds:Transform/>
19                    <ds:Transform/>
20                </ds:Transforms>
21            </ds:Reference>
22            <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"></ds:SignatureMethod>
23            <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></ds:CanonicalizationMethod>
24        </ds:SignedInfo>
25        <ds:KeyInfo>
26            <ds:X509Data>
27                <ds:X509Certificate>MIIGATCCBLWgAwIBAgITYQADiqqgHk1/OTmNhAABAAOKqjBBBgkqhkiG9w0BAQowNKAPMA0GCWCG&#13;
28SAFlAwQCAwUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAwUAogMCAUAwWzELMAkGA1UEBhMC&#13;
29UlUxEjAQBgNVBAoTCUFsZmEtQmFuazELMAkGA1UECxMCSVQxKzApBgNVBAMTIkFsZmEtQmFuayBJ&#13;
30c3N1aW5nIFN1Ym9yZGluYXRlIENBIDEwHhcNMjMwNzI4MTUxMTE0WhcNMjUwNjE5MTE0ODA2WjCB&#13;
31pzEXMBUGA1UEKgwO0JXRgNC80L7Qu9Cw0LkxGzAZBgNVBAQMEtCa0YPQtNGA0Y/QstGG0LXQsjEL&#13;
32MAkGA1UEBhMCUlUxOzA5BgNVBAMMMtCa0YPQtNGA0Y/QstGG0LXQsiDQldGA0LzQvtC70LDQuSDQ&#13;
33mNCz0L7RgNC10LLQuNGHMSUwIwYJKoZIhvcNAQkBFhZVc2VyNTA0QHBvY2h0b2Noa2EuY29tMIIB&#13;
34IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ZM3Ztf+Ro4e64R8yI4qDV/zLdJjUCx5WNBx&#13;
356gcp1pJ4uhQixw+ASy4Oxu0Xp7OxmpXtvDJFi4kr6QymtzMNYqJA3GZk85p+Iobkwo5zHKyBf0tX&#13;
365HwmFWjJx9CqZKp8iZAFw9nqz1uqronxyzTgULPL6eE9igVSzaVf5msV8sXXfl87guVHF+Ph18hs&#13;
37dng1WiCJ7Mi14ETdI9O0R5eJiPZztLIHRnXuBtB1Oa1YiiWtvkZNnpLKONwxljdTZlH7h7KfaXUw&#13;
38W3kX8r0p7jvO7gNhMXvOSK1JPXWevmBHrjONVlG2atWoxT2IHs2ZDz+BLxgSwLc9NIQK+qKhIMfA&#13;
391wIDAQABo4ICBzCCAgMwJQYDVR0RBB4wHIILZXhhbXBsZS5jb22CDSouZXhhbXBsZS5jb20wHQYD&#13;
40VR0OBBYEFGbczU3B6IZhHwKsC8ODg8r4xi3nMB8GA1UdIwQYMBaAFMkXMx6bqZSglhhLbnFMgdvp&#13;
41c/5lMIG7BgNVHR8EgbMwgbAwga2ggaqggaeGOWh0dHBzOi8vdGVzdGptYi5hbGZhYmFuay5ydS9k&#13;
42aXN0cnBvaW50L0FsZmEtQmFua19TQ0ExLmNybIYwaHR0cDovL3Zsa3dzNjo5MDgxL2Rpc3RycG9p&#13;
43bnQvQWxmYS1CYW5rX1NDQTEuY3JshjhodHRwOi8vdGVzdGptYi5hbGZhYmFuay5ydS9kaXN0cnBv&#13;
44aW50L0FsZmEtQmFua19TQ0ExLmNybDCB2wYIKwYBBQUHAQEEgc4wgcswRQYIKwYBBQUHMAKGOWh0&#13;
45dHBzOi8vdGVzdGptYi5hbGZhYmFuay5ydS9kaXN0cnBvaW50L0FsZmEtQmFua19TQ0ExLmNydDA8&#13;
46BggrBgEFBQcwAoYwaHR0cDovL3Zsa3dzNjo5MDgxL2Rpc3RycG9pbnQvQWxmYS1CYW5rX1NDQTEu&#13;
47Y3J0MEQGCCsGAQUFBzAChjhodHRwOi8vdGVzdGptYi5hbGZhYmFuay5ydS9kaXN0cnBvaW50L0Fs&#13;
48ZmEtQmFua19TQ0ExLmNydDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAwUAoRwwGgYJKoZI&#13;
49hvcNAQEIMA0GCWCGSAFlAwQCAwUAogMCAUADggEBAHTjDmxldqWkRgpT5gXKuIzyqIHjlDZMMfah&#13;
50cWBxqWV9XC46bcPx8gvlpzb8N+oK+X6AqDt3+vneAiGQn8iNs9ajDKtes9ulZzMUJBwzwv26DsiI&#13;
513s4/0phypAcqQVHJQxvU+rdrh5FgqJcNZsuOtOaJhiO/i/3J7hoL/oxVwSk+lX4m+X5u76/Vdqk9&#13;
52ydKXNNnzMi12F4FvD+igTrezzLjPHQRx5vLY0cWwLEdBxLJmBwd1u7EBT3j+v9Pyh0pTzXsJC0BY&#13;
531BIt6VOh6QGKGTKT3cBB6zbIOrY7UTOkYdCqtyB9vhayAyti3aO37PANUQ7dUwUEZyf64/D4/HRl&#13;
54hqI=
55</ds:X509Certificate>
56            </ds:X509Data>
57        </ds:KeyInfo>
58    </ds:Signature>
59</Response>
2

Проверить подпись ответа от Банка

Используйте открытый ключ сертификата для проверки подписи, сравнивая вычисленное хеш-значение SignedInfo с декодированным значением подписи SignatureValue , используя алгоритм, указанный в SignatureMethod .

3

Обработать ответ в формате XML

Пример ответа
1<?xml version="1.0" encoding="UTF-8"?>
2<Response>
3    <XmlElementName1>XmlElementValue1</XmlElementName1>
4    <XmlElementName2>XmlElementValue2</XmlElementName2>
5</Response>