DocuSign Connect - HMA C Безопасность с помощью REST API v2.1 и Java библиотеки - PullRequest
0 голосов
/ 03 августа 2020

Я использую DocuDign REST API v2.1 с использованием библиотеки Java. До сих пор я без проблем использую DocuSign Connect, и у меня есть сервлет для управления обратным вызовом из DocuSign. Теперь я хочу использовать HMA C Security, и для этого я выполнил инструкции, указанные в https://developers.docusign.com/esign-rest-api/guides/connect-hmac, а именно:

  • в нашей учетной записи на DocuSign. Я установил для Connect подпись Include HMA C и создал ключ аутентификации Connect;

  • когда я отправляю запрос подписи, я устанавливаю EventNotification # setIncludeHMA C ("true") ;

  • когда DocuSign вызывает наш сервлет, я извлекаю из запроса HttpServletRequest поля

    // Extract the text of the UTF-8 payload as an array of bytes. The entire body of the POST request is used, including line endings
    byte[] body = IOUtils.toByteArray(request.getInputStream()); 
    or
    byte[] body = IOUtils.toByteArray(request.getReader(), "UTF-8");
    // x-docusign-signature headers
    String docuSignHmacSignature = request.getHeader("X-DocuSign-Signature-1");
    // Connect Authentication Key create on DocuSign console
    String hmacKey = "...";
    
  • Вычисление SHA256 HMA C дайджеста для массив байтов тела:

    Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
    sha256_HMAC.init(new SecretKeySpec(hmacKey.getBytes("UTF-8"), "HmacSHA256"));
    byte[] result = sha256_HMAC.doFinal(body);
    String bodyHash = Base64.getEncoder().encodeToString(result);
    
  • сравнить bodyHa sh, хешированную строку тела, созданную с помощью hmacKey, со значением заголовков x-docusign-signature , но он всегда терпит неудачу.

Если я использую онлайн-генератор HMA C (например, https://www.liavaag.org/English/SHA-Generator/HMAC/) и вставляю значения body в виде текста , а hmacKey I получает значение bodyHa sh, поэтому я думаю, что процедура хеширования e тела HttpServletRequest верен.

Есть ли кто-нибудь, кто знает, почему мой код ha sh отличается от кода, полученного от DocuSign? Неправильно ли я восстанавливаю тело ответа?

Спасибо

1 Ответ

0 голосов
/ 08 августа 2020

Возможны три проблемы:

  1. Вы используете неправильный секрет или неправильную подпись. Убедитесь, что вы используете весь секрет, созданный DocuSign. Не декодируйте его в Base64. Включите знак окончания =. Установите для DocuSign только один секрет.

  2. Вы неправильно рассчитываете подпись. Существуют двоичные подписи HMA C (выраженные в виде шестнадцатеричной строки) и подписи Base64 HMA C. Убедитесь, что вы вычисляете подпись Base64.

    Эта HMA C страница вычисляет подпись HMA C так же, как DocuSign.

    Используйте InputType: Text, Вариант SHA: SHA-256, Тип вывода: Base-64

  3. Вы не использование правильных данных полезной нагрузки для расчета подписи. Подходящая полезная нагрузка - это весь корпус. Это то же самое, что и весь контент XML, без новых строк, перевода строки и т. Д. c.

Вы можете вручную проверить расчет текста и подписи:

  1. Открыть webhook.site
  2. Вы получите https-URL для отправки уведомлений о веб-перехватчиках на
  3. Создайте подписку на веб-перехватчик (с HMA C on) в DocuSign для URL-адреса из шага 2. Отправьте конверт, чтобы увидеть уведомление на веб-сайте webhook.site. Также обратите внимание на значение заголовка x-docusign-signature-1.
  4. Скопируйте все тело уведомления на страницу HMA C . Добавьте свой секрет и используйте эту страницу для расчета HMA C. Он будет соответствовать значению в заголовке, если вы ввели правильный секрет.
  5. Теперь вы можете использовать свою тестовую информацию для тестирования своего приложения.
...