2017-02-22 84 views
0

Мы изучаем реализацию AS2 и хотели бы иметь возможность создавать осмысленные тестовые файлы для использования с SoapUI или Postman. Для того, чтобы сделать это, мы имеем два пути:EDI AS2 HTTP trace?

  1. просто пытаются TCP-свалка/трассировки вызовов от существующего клиента
  2. вручную построить несколько простых вызовов, начиная от простого ЭОДА документов

или по различным причинам, которые мы отбросили (1), поэтому мы должны пойти с (2), и нам нужна документация. Этот документ от Oracle является хорошей отправной точкой: https://docs.oracle.com/cd/E19398-01/820-1228/agfat/index.html

, но мы не можем найти руководство шаг за шагом для создания запроса на AS2, начиная с документа ЗАКАЗЫ EDI (который у нас уже есть).

В идеале я хотел бы шаг за шагом руководство, которое говорит что-то вроде:

  1. создания частного сертификата: +
  2. командной строки
  3. шифровать ИДЭ документа: + + sampleoutput командной строки
  4. создать подпись: + + sampleoutput командной строки
  5. построить/пакет MIME S: + + sampleoutput командной строки
  6. отправить через HTTP/S: + + samplehttptrace командной строки
+0

Не могли бы вы использовать что-то наподобие OpenAS2? Почему вы пишете собственное решение AS2? Похоже, вы изобретаете колесо, или можете получить что-то на месте дешевле и быстрее, чем кататься самостоятельно. – Andrew

+0

Мы не хотим вообще переписывать и выполнять AS2, наша цель состояла в том, чтобы написать какой-то тест с помощью простых инструментов, таких как SoapUI или PostMan, без необходимости автономного клиента AS2. Однако мы отказались. –

ответ

2

Отправка сообщения

Чтобы отправить сообщение, нам нужен файл с сообщением для отправки, две пары ключей для обеих сторон (каждый партнер имеет одну пару ключей для подписи и другую пару ключей для шифрования, каждый пара ключей состоит из открытых и закрытых ключей). Для этого урока мы будем использовать одну и ту же пару ключей для подписывания и шифрования для каждого партнера.

Генерация ключей

Использование 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 например, сообщение.