Для шифрования сообщения необходимо предварительно выпустить сертификат в УЦ Альфа-Банка используя сервис "Электронная подпись". Если вы уже выпускали сертификат - повторно выпускать не нужно.
Подписать и зашифровать XML
Сформируйте электронную подпись в cоответствии с XMLDsig. Необходимо использовать:
- •
- •Метод канонизации: Canonicalization Method Algorithm
- •Алгоритм подписи: Signature Method Algorithm
- •Метод трансформации: Enveloped Signature Transform (Transform Algorithm)
- •Метод трансформации: Exclusive XML Canonicalization (Transform Algorithm)
- •Алгоритм хэширования: Digest Method Algorithm
<?xml version="1.0" encoding="UTF-8"?>
<Request>
<XmlElementName1>XmlElementValue1</XmlElementName1>
<XmlElementName2>XmlElementValue2</XmlElementName2>
<ds:Signature xmlns="http://www.w3.org/2000/09/xmldsig#" Id="sigID1">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
</ds:CanonicalizationMethod>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256">
</ds:SignatureMethod>
<ds:Reference URI="">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature">
</ds:Transform>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
</ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#sha384">
</ds:DigestMethod>
<ds:DigestValue>PFofJkUS6p/00mh0rGBsixzt/IrT0VOQRD3kvQkD3TyPEle2o1Ba7NCMR/ATvzQF</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>wxBWAIhbSFENVHMdLJ051lZGlhEUbIPPo9W/4BrBjOtNo/cfu9MxCLv7GSqVz0Kr6g6L6+k9q+hu
CVAebijxjUmub3KUTx7GPq6SjQsrFo5sZmZg73eyLqiEM3LFux4PJEXeVSadzOpQGBg0ygDZ83gU
OXY/YJcwSRcBEQpNp+62ot1ua90QBJzNApZkWtxwSlBvGS0SYmh+6vg0yFbc60h231Q4bBSdWJcD
vaAIIayCwbt3oUm2simOGvc/adfz4vn6xiLQCAEDsyD0iK9m9WssqIZKepe8wI0kJCC9CwHx6Zxg
Geys+G77rQvskKmN13EX3sokbLAnzb4cWnwZVQ==
</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>MIIGATCCBLWgAwIBAgITYQADiqqgHk1/OTmNhAABAAOKqjBBBgkqhkiG9w0BAQowNKAPMA0GCWCG
SAFlAwQCAwUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAwUAogMCAUAwWzELMAkGA1UEBhMC
UlUxEjAQBgNVBAoTCUFsZmEtQmFuazELMAkGA1UECxMCSVQxKzApBgNVBAMTIkFsZmEtQmFuayBJ
c3N1aW5nIFN1Ym9yZGluYXRlIENBIDEwHhcNMjMwNzI4MTUxMTE0WhcNMjUwNjE5MTE0ODA2WjCB
pzEXMBUGA1UEKgwO0JXRgNC80L7Qu9Cw0LkxGzAZBgNVBAQMEtCa0YPQtNGA0Y/QstGG0LXQsjEL
MAkGA1UEBhMCUlUxOzA5BgNVBAMMMtCa0YPQtNGA0Y/QstGG0LXQsiDQldGA0LzQvtC70LDQuSDQ
mNCz0L7RgNC10LLQuNGHMSUwIwYJKoZIhvcNAQkBFhZVc2VyNTA0QHBvY2h0b2Noa2EuY29tMIIB
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ZM3Ztf+Ro4e64R8yI4qDV/zLdJjUCx5WNBx
6gcp1pJ4uhQixw+ASy4Oxu0Xp7OxmpXtvDJFi4kr6QymtzMNYqJA3GZk85p+Iobkwo5zHKyBf0tX
5HwmFWjJx9CqZKp8iZAFw9nqz1uqronxyzTgULPL6eE9igVSzaVf5msV8sXXfl87guVHF+Ph18hs
dng1WiCJ7Mi14ETdI9O0R5eJiPZztLIHRnXuBtB1Oa1YiiWtvkZNnpLKONwxljdTZlH7h7KfaXUw
W3kX8r0p7jvO7gNhMXvOSK1JPXWevmBHrjONVlG2atWoxT2IHs2ZDz+BLxgSwLc9NIQK+qKhIMfA
1wIDAQABo4ICBzCCAgMwJQYDVR0RBB4wHIILZXhhbXBsZS5jb22CDSouZXhhbXBsZS5jb20wHQYD
VR0OBBYEFGbczU3B6IZhHwKsC8ODg8r4xi3nMB8GA1UdIwQYMBaAFMkXMx6bqZSglhhLbnFMgdvp
c/5lMIG7BgNVHR8EgbMwgbAwga2ggaqggaeGOWh0dHBzOi8vdGVzdGptYi5hbGZhYmFuay5ydS9k
aXN0cnBvaW50L0FsZmEtQmFua19TQ0ExLmNybIYwaHR0cDovL3Zsa3dzNjo5MDgxL2Rpc3RycG9p
bnQvQWxmYS1CYW5rX1NDQTEuY3JshjhodHRwOi8vdGVzdGptYi5hbGZhYmFuay5ydS9kaXN0cnBv
aW50L0FsZmEtQmFua19TQ0ExLmNybDCB2wYIKwYBBQUHAQEEgc4wgcswRQYIKwYBBQUHMAKGOWh0
dHBzOi8vdGVzdGptYi5hbGZhYmFuay5ydS9kaXN0cnBvaW50L0FsZmEtQmFua19TQ0ExLmNydDA8
BggrBgEFBQcwAoYwaHR0cDovL3Zsa3dzNjo5MDgxL2Rpc3RycG9pbnQvQWxmYS1CYW5rX1NDQTEu
Y3J0MEQGCCsGAQUFBzAChjhodHRwOi8vdGVzdGptYi5hbGZhYmFuay5ydS9kaXN0cnBvaW50L0Fs
ZmEtQmFua19TQ0ExLmNydDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAwUAoRwwGgYJKoZI
hvcNAQEIMA0GCWCGSAFlAwQCAwUAogMCAUADggEBAHTjDmxldqWkRgpT5gXKuIzyqIHjlDZMMfah
cWBxqWV9XC46bcPx8gvlpzb8N+oK+X6AqDt3+vneAiGQn8iNs9ajDKtes9ulZzMUJBwzwv26DsiI
3s4/0phypAcqQVHJQxvU+rdrh5FgqJcNZsuOtOaJhiO/i/3J7hoL/oxVwSk+lX4m+X5u76/Vdqk9
ydKXNNnzMi12F4FvD+igTrezzLjPHQRx5vLY0cWwLEdBxLJmBwd1u7EBT3j+v9Pyh0pTzXsJC0BY
1BIt6VOh6QGKGTKT3cBB6zbIOrY7UTOkYdCqtyB9vhayAyti3aO37PANUQ7dUwUEZyf64/D4/HRl
hqI=
</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
</Request>
- 1.Выполните шифрование подписанного на предыдущем шаге сообщения симметричным алгоритмом:
- •Параметры шифрования:
- •Алгоритм блочного шифрования:
AES
; - •Режим сцепления блоков:
CBC
; - •Схема дополнения контента (padding):
PKCS5
.
- •Сгенерируйте секретный ключ
AES (Symmetric Key)
. Размер ключа - 128 бит; - •Сгенерируйте вектор инициализации режима
CBC (Initialization Vector)
. Размер - 128 бит; - •Если размер данных не кратен размеру блока
AES
Размер - 128 бит. ИспользуйтеPKCS5
для дополнения данных до нужного размера; - •Зашифруйте сообщение, используя
Symmetric Key
иInitialization Vector
в режимеCBC
; - •Передайте полученное зашифрованное сообщение в теле запроса.
FXCTdsI0cNpiwf17K9ZX113TOUwbQIrlD7ycM9PELZAp+KN8mP+kFklDafqbQWDjA2V9fqLcUljGo7S1v+D262AJnUi49XEugcJkKSwnjmYWCottWMB0XYCT+hu+/SOPgedFek5DzuAEPXxv7g/qBKaqQXJQNZ7ucqg+AOCxpVYLlD7czhiymUKviTzTBasyqx1andFRW30GhShjCPWopFe6VfciR+K9HcEKnkJO/QxKdIuSrEE1qS7uYsqDdg6aOO5M3B984oWX7z216T63skSl6OVQNKydF98zLkDrLhDRQysYaFD+HKDaXnWKLUWX0xJqA/K4kvU8xdOZbqiqiHfMkw3Fp03z/oVGatxFQWGDKTaSgAHlNscwl3X2YxEMb9IWS+NyCqbahF+WF9WyJIdoPTC/vFxzHl+UwPS8+nppSpRvQSO4ae4jtdA2V4sa4/N+lB8UtQs7ZuBB6gExLGL7DdB9kPpG3T6rN6uzCWDst9j4BaHsV5k4ZbmTR8VLwdXm1+5k+tTzvW0X/n/cziTaBD8dmNPsuSTWxmQRAAhVQOmzBYTWR4gx3xjHVyRuiUMV5nIBDq48m5PY/SBWWnplvYaomcPthxNaaBfo3iVOCXfUEvaHrn/npq3tGK+6ePDbXAWzAQZYfV7OaYAqz7+q8SvXElrT2n1t67gL7obvqPsIOK/wzD5uZF8KsQy1haYqciIrQe9omWeN24jyl+zHqbmn6RCAQXYZ5ZG9Qq21Jckkqgo0wo/lQNtNq3udzhRe1s
- 1.Выполните шифрование симметричного секретного ключа и вектора инициализации ассиметричным алгоритмом:
- •Параметры шифрования:
- •Алгоритм шифрования:
RSA
; - •Режим сцепления блоков:
NONE (не использовать)
; - •Схема дополнения контента (padding):
OAEP
.
- •Зашифруйте с помощью открытого ключа сертификата Банка секретный ключ
Symmetric Key
используя алгоритмRSA
c механизмомOAEP
; - •Аналогичным образом зашифруйте вектор инициализации
Initialization Vector
; - •Передайте полученный зашифрованный секретный ключ
Symmetric Key
в заголовке запросаX-SymmetricKey
; - •Передайте полученный зашифрованный вектор инициализации
Initialization Vector
в заголовке запросаX-InitializationVector
.
X-SymmetricKey: xrzL4iCYGP0NCXUjVYDUXshS7QEye3iTzpH+TIgJuzCcBFtMtdFsHVymsT5HsEeVZr01nGpyTkM6eNgKj6dH9hCEuFfv+dkGtBbd//jSPDntzKxFRkK7vxrugtFNILkxgZK1FaBBDOaOya0U1xJCc34FKrH/DltbPOxoxA9v7mS9ZF0kebhQO5wvlhGH525uKhe7a0XkcxBH6XRdElwM3PExY194uFQ+OH+EeEc+6AhGKk+pLsIeATkgNHsLDuGx1gzQy4iLf/NQZXT8Pkldw8fd+ECXiqh7nXOY5sdmTJ08FyPZ+Vsxre+Cc6yoRgRTzwnkqx3XsHxv80sXRZcDeg==
X-InitializationVector: aOwLSirltsxJx3GdZqJ0N+b2YmtY04NTIQmbNdT0v4Wk38T5OJtdAhmP4GWSqDAA7TYuEqccFnRi1DurkizkLqX02w4k+OfpFHJZaHDKg9rMOmdjso7KQMLRmWBzUujs9ray9KYSgPydDvzteIJIoO89C6zEP4Mqv5JQzEnH+/ChtSuDeZ1xPfbgiLWppa0O2whq8wHzsZtYckBd4LEjbQgy1/cuuq7IOOtK+oABfa/WCYsksgbxwX0VkC1OKNPvL2Izm8aPRnocLSKFiDNDkMORFcKWVQfugo5WGFRwcB9Ihixud2GzZcQ93JUviXZswCb9LCPdhrDe2G2ddZCWng==
Добавьте заголовок Content-Type = "application/xml"
и отправьте запрос. Далее Банк дешифрует запрос и проверяет подпись. Если подпись валидна - запрос обрабатывается, если не валидна - Банк определяет запрос как неподлинный и возвращает ошибку. В случае ошибки с дешифровкой запроса также будет возращена ошибка. Возвращаемая ошибка будет подписана и зашифрована.
Дешифровать и проверить подпись XML
Полученный ответ (в том числе ошибки) будет представлен в виде XMLDsig.
- 1.Примените алгоритм канонизации, указанный в
ds:CanonicalizationMethod
, к элементуSignedInfo
. Используйте алгоритм Exclusive XML Canonicalization для преобразованияSignedInfo
в каноническую форму; - 2.Используя алгоритм хеширования, указанный в
ds:SignatureMethod
, вычислите хеш-значение из канонизированногоSignedInfo
; - 3.Декодируйте значение подписи из элемента
ds:SignatureValue
с использованием Base64; - 4.Проверьте целостность содержимого:
- •Вычислите хеш-значение оригинальных данных (то есть тела сообщения без учета подписи), используя алгоритм, указанный в
ds:DigestMethod
; - •Сравните вычисленное хеш-значение с декодированным из Base64 значением, указанным в
ds:DigestValue
. Если значения совпадают, содержимое не изменилось после подписания.
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<XmlElementName1>XmlElementValue1</XmlElementName1>
<XmlElementName2>XmlElementValue2</XmlElementName2>
<ds:Signature
xmlns="http://www.w3.org/2000/09/xmldsig#" Id="sigID1">
<ds:SignatureValue>H6jGW+bKLwvQ9xxbhZ6jNYRHtupT4aJ4jjlLh4W8svK0w5G7ZXf4OxqRR0t2l6aYOpNBdN2Q0+2T
1LXyadtnz7XJ7QYXNXrnWNcq7mOxM5Lj5bBQa2JPZSiMkp1lsnAV/LFDAJ+Uhruj3mFQxjiFpJLR
W/vRJzmRv925xXWopb94PFvP9mjtAwPXtBGEL5rqJICabzVo8+1BfPwFF5+8sqYzT74mmJIQmeFm
FiYVMNive5lRxlt7nXEgS4iENF1dXq5+prCPloms8hIX6I4HQo3Jn+G37Os57nv8g61gk4jnu2OK
bOsZasIzXSLVG2GrCbDQ+HFjWs3Fgg4JOkULfw==
</ds:SignatureValue>
<ds:SignedInfo>
<ds:Reference URI="">
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#sha384"></ds:DigestMethod>
<ds:DigestValue>xgVcc1UZhuWRp4/8K0OAVLuQUhySUtJg7mYo78Od+WWidnIZr2XZUvPqwxOpFwRY</ds:DigestValue>
<ds:Transforms>
<ds:Transform/>
<ds:Transform/>
</ds:Transforms>
</ds:Reference>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"></ds:SignatureMethod>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></ds:CanonicalizationMethod>
</ds:SignedInfo>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>MIIGATCCBLWgAwIBAgITYQADiqqgHk1/OTmNhAABAAOKqjBBBgkqhkiG9w0BAQowNKAPMA0GCWCG
SAFlAwQCAwUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAwUAogMCAUAwWzELMAkGA1UEBhMC
UlUxEjAQBgNVBAoTCUFsZmEtQmFuazELMAkGA1UECxMCSVQxKzApBgNVBAMTIkFsZmEtQmFuayBJ
c3N1aW5nIFN1Ym9yZGluYXRlIENBIDEwHhcNMjMwNzI4MTUxMTE0WhcNMjUwNjE5MTE0ODA2WjCB
pzEXMBUGA1UEKgwO0JXRgNC80L7Qu9Cw0LkxGzAZBgNVBAQMEtCa0YPQtNGA0Y/QstGG0LXQsjEL
MAkGA1UEBhMCUlUxOzA5BgNVBAMMMtCa0YPQtNGA0Y/QstGG0LXQsiDQldGA0LzQvtC70LDQuSDQ
mNCz0L7RgNC10LLQuNGHMSUwIwYJKoZIhvcNAQkBFhZVc2VyNTA0QHBvY2h0b2Noa2EuY29tMIIB
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ZM3Ztf+Ro4e64R8yI4qDV/zLdJjUCx5WNBx
6gcp1pJ4uhQixw+ASy4Oxu0Xp7OxmpXtvDJFi4kr6QymtzMNYqJA3GZk85p+Iobkwo5zHKyBf0tX
5HwmFWjJx9CqZKp8iZAFw9nqz1uqronxyzTgULPL6eE9igVSzaVf5msV8sXXfl87guVHF+Ph18hs
dng1WiCJ7Mi14ETdI9O0R5eJiPZztLIHRnXuBtB1Oa1YiiWtvkZNnpLKONwxljdTZlH7h7KfaXUw
W3kX8r0p7jvO7gNhMXvOSK1JPXWevmBHrjONVlG2atWoxT2IHs2ZDz+BLxgSwLc9NIQK+qKhIMfA
1wIDAQABo4ICBzCCAgMwJQYDVR0RBB4wHIILZXhhbXBsZS5jb22CDSouZXhhbXBsZS5jb20wHQYD
VR0OBBYEFGbczU3B6IZhHwKsC8ODg8r4xi3nMB8GA1UdIwQYMBaAFMkXMx6bqZSglhhLbnFMgdvp
c/5lMIG7BgNVHR8EgbMwgbAwga2ggaqggaeGOWh0dHBzOi8vdGVzdGptYi5hbGZhYmFuay5ydS9k
aXN0cnBvaW50L0FsZmEtQmFua19TQ0ExLmNybIYwaHR0cDovL3Zsa3dzNjo5MDgxL2Rpc3RycG9p
bnQvQWxmYS1CYW5rX1NDQTEuY3JshjhodHRwOi8vdGVzdGptYi5hbGZhYmFuay5ydS9kaXN0cnBv
aW50L0FsZmEtQmFua19TQ0ExLmNybDCB2wYIKwYBBQUHAQEEgc4wgcswRQYIKwYBBQUHMAKGOWh0
dHBzOi8vdGVzdGptYi5hbGZhYmFuay5ydS9kaXN0cnBvaW50L0FsZmEtQmFua19TQ0ExLmNydDA8
BggrBgEFBQcwAoYwaHR0cDovL3Zsa3dzNjo5MDgxL2Rpc3RycG9pbnQvQWxmYS1CYW5rX1NDQTEu
Y3J0MEQGCCsGAQUFBzAChjhodHRwOi8vdGVzdGptYi5hbGZhYmFuay5ydS9kaXN0cnBvaW50L0Fs
ZmEtQmFua19TQ0ExLmNydDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAwUAoRwwGgYJKoZI
hvcNAQEIMA0GCWCGSAFlAwQCAwUAogMCAUADggEBAHTjDmxldqWkRgpT5gXKuIzyqIHjlDZMMfah
cWBxqWV9XC46bcPx8gvlpzb8N+oK+X6AqDt3+vneAiGQn8iNs9ajDKtes9ulZzMUJBwzwv26DsiI
3s4/0phypAcqQVHJQxvU+rdrh5FgqJcNZsuOtOaJhiO/i/3J7hoL/oxVwSk+lX4m+X5u76/Vdqk9
ydKXNNnzMi12F4FvD+igTrezzLjPHQRx5vLY0cWwLEdBxLJmBwd1u7EBT3j+v9Pyh0pTzXsJC0BY
1BIt6VOh6QGKGTKT3cBB6zbIOrY7UTOkYdCqtyB9vhayAyti3aO37PANUQ7dUwUEZyf64/D4/HRl
hqI=
</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
</Response>
Используйте открытый ключ сертификата для проверки подписи, сравнивая вычисленное хеш-значение SignedInfo
с декодированным значением подписи SignatureValue
, используя алгоритм, указанный в SignatureMethod
.
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<XmlElementName1>XmlElementValue1</XmlElementName1>
<XmlElementName2>XmlElementValue2</XmlElementName2>
</Response>