Отправка сообщения
Чтобы отправить сообщение, нам нужен файл с сообщением для отправки, две пары ключей для обеих сторон (каждый партнер имеет одну пару ключей для подписи и другую пару ключей для шифрования, каждый пара ключей состоит из открытых и закрытых ключей). Для этого урока мы будем использовать одну и ту же пару ключей для подписывания и шифрования для каждого партнера.
Генерация ключей
Использование OpenSSL создать две пары ключей:
openssl req -x509 -newkey rsa:2048 -keyout P1_private.pem -out P1_public.pem -days 365
То же самое для второй пары:
openssl req -x509 -newkey rsa:2048 -keyout P2_private.pem -out P2_public.pem -days 365
Вход Файл
Предположим, мы хотим отправить файл GETMSG.edi через протокол AS2 от P1 partner => до P2, с подписью и шифрованием. Сначала мы добавим соответствующие заголовки MIME к нему:
Content-Type: application/edi-consent
Content-Disposition: attachment; filename="GETMSG.edi"
UNA:+./*'
UIB+UNOA:0++2289+++77777777:C:PASSWORDA+111111:M+19971001:074620'
UIH+SCRIPT:010:006:GETMSG+111'
UIT+111+2'
UIZ++1'
Сохранить новый файл как GETMSG.msg
Затем подписать файл с закрытым ключом отправки партнера P1:
openssl smime -sign -in GETMSG.msg -out GETMSG_SIGNED.msg -signer P1_private.pem
Примечание: OpenSSL путы старые типы MIME, начинающиеся с «x-pkcs7- », некоторые приложения (pyAS2) могут обрабатывать только новые типы MIME без eks «pkcs7-». Просто удалите 'x-' всюду из результирующего файла.
Encrypt
Теперь у нас есть многослойное приложение с первой частью является содержимым файла, а вторая частью является подписью. Теперь мы зашифровать его с помощью открытого ключа получения партнера P2:
openssl smime -encrypt -in GETMSG_SIGNED.msg -out GETMSG_ENC.msg -des3 P2_public.pem
Результирующий файл GETMSG_ENC.msg можно отправить сейчас получателю в качестве запроса с дополнительными заголовками AS2.
Примечание: OpenSSL помещает старые типы MIME, начинающиеся с 'х-pkcs7- ', некоторые приложения (pyAS2) может обрабатывать только новые типы MIME без ЭКС 'pkcs7-. Просто удалите 'x-' всюду из результирующего файла.
Отправить по Curl
Чтобы отправить с Curl мы должны отделить заголовки и тело запроса POST. Удалите из файла GETMSG_ENC.msg все заголовки (он начнется с «MI ..»). Используйте эту команду, чтобы отправить его из P1 (AS2 ID: p1as2) Р2 (AS2 ID: p2as2), предполагая, что URL-Р2 "http://localhost:8080/pyas2/as2receive":
set NOW=%DATE:~10,4%%DATE:~4,2%%DATE:~7,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
curl -i -X POST-H "Content-Disposition: attachment; filename=\"smime.p7m\""-H "Content-Type: application/pkcs7-mime; smime-type=enveloped-data; name=\"smime.p7m\""-H "Content-Transfer-Encoding: base64"-H "AS2-TO: p1as2"-H "AS2-FROM: p2as2"-H "AS2-VERSION: 1.2"-H "MESSAGE-ID: <openssl%NOW%@LOCALHOST>"-H "Disposition-Notification-To: [email protected]"-H "DISPOSITION-NOTIFICATION-OPTIONS: signed-receipt-protocol=required, pkcs7-signature; signed-receipt-micalg=optional, sha1"--data-binary @GETMSG_ENC.msg http://localhost:8080/pyas2/as2receive
Примечание: эта команда также будет просить MDN с подписью (из-за наличия Disposition-Notification-To и стоимости ОПАСНО-ОПИСАНИЕ-ОПЦИИ).
Прием сообщений
Далее будет уже происходить на приемной стороне. Это будет включать в себя дешифрующее сообщение, проверку подписи, извлечение полезной нагрузки и подготовку подтверждения или уведомления об отправке сообщения (MDN). Это также потребовало бы вычисления хэша принятого сообщения (MIC) для отправки в подтверждение.
Расшифровать Запрос
Использование OpenSSL содержание запроса команды декодирования сохраняется как smime.p7m:
Using OpenSSL command decode request content saved as smime.p7m:
OpenSSL SMIME -decrypt -в smime.p7m -recip P2_public.pem -inkey P2_private.pem отъезда request.txt
Проверка подписи
openssl smime -verify -in request.txt -nosigs -noverify -signer P2_public.pem -out original.txt
Вычислить Received-контент-MIC
Digest полученного контента должен быть вычислен через исходный файл MIME заголовки, в нашем случае это содержание GETMSG.msg.
Примечание: в реальной жизни приемник должен извлечь из расшифрованного содержимого типа multipart/signed. Первая часть - это полученное содержимое.
Планировка Сообщение Уведомление
не подписал уведомление о размещении сообщения или подтверждение будет выглядеть многочастного отчета:
Content-Type: multipart/report; report-type="disposition-notification"; boundary="===============1785295974=="
--===============1785295974==
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
The AS2 message has been processed. Thank you for exchanging AS2 messages with Pyas2.
--===============1785295974==
Content-Type: message/disposition-notification; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Reporting-UA: Bots Opensource EDI Translator
Original-Recipient: rfc822; p1as2
Final-Recipient: rfc822; p1as2
Original-Message-ID: <[email protected]>
Disposition: automatic-action/MDN-sent-automatically; processed
Received-content-MIC: 1GZ1SDk5vvGz5YFGYP6lfhk4MXE=, sha1
--===============1785295974==--
Подписано Распоряжение Сообщение Уведомление
Если подписанного MDN запрашивается (в зависимости на HTTP-заголовке «Параметры-уведомление-Параметры»), тогда многостраничный отчет, показанный выше, является оберткой d в multipart/signed. А секундная часть - это подпись первой части, показанной выше. Если мы предположим, что mdn.txt содержит не авторизованы MDN, как показано выше, а затем подписать его:
openssl cms -sign -signer P2_private.pem -in mdn.txt -out mdn_signed.txt
Теперь нам нужно только добавить некоторые конкретные заголовки AS2 к началу mdn.txt или mdn_signed.txt, в зависимости о том, какие MDN было предложено, прежде чем передать его через HTTP (взято из фактического ответа pyAS2):
ediint-features: CEM
as2-from: p1as2
user-agent: PYAS2, A pythonic AS2 server
AS2-Version: 1.2
as2-to: p2as2
date: Thu, 06 Jul 2017 16:50:18 +0200
X-Frame-Options: SAMEORIGIN
Message-ID: <[email protected]>
Transfer-Encoding: chunked
Server: pyas2-webserver
на основе источников: pyAS2 документации, OpenSSL документации, НЦЗПД SCRIPT например, сообщение.
Не могли бы вы использовать что-то наподобие OpenAS2? Почему вы пишете собственное решение AS2? Похоже, вы изобретаете колесо, или можете получить что-то на месте дешевле и быстрее, чем кататься самостоятельно. – Andrew
Мы не хотим вообще переписывать и выполнять AS2, наша цель состояла в том, чтобы написать какой-то тест с помощью простых инструментов, таких как SoapUI или PostMan, без необходимости автономного клиента AS2. Однако мы отказались. –