Я использую 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? Неправильно ли я восстанавливаю тело ответа?
Спасибо