Ошибка, связанная с ключом RSA при попытке использовать DocuSign API

#python #docusignapi

#python #docusignapi

Вопрос:

Я пытаюсь использовать «api_client.request_jwt_user_token» в DocuSign API. Но я не уверен, как преобразовать файл RSA PEM:

 import rsa
from docusign_esign import ApiClient

with open('docusign.pem', mode='rb') as privatefile:
    keydata = privatefile.read()
privkey = rsa.PrivateKey.load_pkcs1(keydata)
key1 = privkey.save_pkcs1(format='DER')

api_client = ApiClient()
api_client.host = 'https://demo.docusign.net/restapi'
access_token = 'eyJ0eXAiOiJKV...etc'
api_client.set_default_header('Authorization', 'Bearer '  
                              access_token)
client_id = '2e65...etc'
user_id = 12341234
oauth_host_name = 'https://demo.docusign.net/restapi'
private_key_bytes = key1
expires_in = 28800
result = api_client.request_jwt_user_token(client_id, user_id,
                                           oauth_host_name,
                                           private_key_bytes,
                                           expires_in)
  

Я получаю исключение Python при вызове API:

 Could not deserialize key data.
  

Это в «site-packages/cryptography/hazmat/backends/openssl/backend.py «

Я предполагаю, что есть более простой способ получить файл RSA PEM в API.

Ссылка: https://pypi.org/project/rsa /

Обновить

Я также попытался преобразовать файл PEM с помощью openssl, а затем прочитать его вместо:

(командная строка)

 $ openssl rsa -inform pem -in docusign.pem -outform der -out docusign.der
  

Результирующий файл имеет размер 1192 байта.

(код)

 with open('docusign.der', mode='rb') as privatefile:
    key1 = privatefile.read()
  

Что приводит к той же ошибке.

Обновление 2

Я пробовал без какого-либо преобразования ключа, а также с другой настройкой, теперь я получаю другую ошибку:

 oauth_host_name = 'account-d.docusign.com'
  

Возвращает неверный HTTP:

 Exception Value: (400)
Reason: Bad Request
HTTP response headers: HTTPHeaderDict({'Cache-Control': 'no-cache', 
'Pragma': 'no-cache', 'Content-Type': 'application/json; 
charset=utf-8', 'Expires': '-1', 'Server': 'Microsoft-IIS/8.5',
'X-AspNetMvc-Version': '5.2', 'X-DocuSign-TraceToken':
'666633df-ac84-4193-a282-e81075302413', 'X-Content-Type-Options': 
'nosniff', 'Strict-Transport-Security': 'max-age=31536000; 
includeSubDomains; preload, max-age=15768000', 'X-Frame-Options': 
'SAMEORIGIN', 'X-XSS-Protection': '1; mode=block;
report=/client-errors/xss', 'X-DocuSign-Node': 'SE1DFE2', 'Date':
'Sat, 22 Aug 2020 18:53:16 GMT', 'Content-Length': '27'})
HTTP response body: b'{"error":"invalid_request"}'
  

Похоже, это не дает большого представления о том, что пошло не так.

Ответ №1:

В это время вы получаете закрытый ключ RSA из инструмента настройки DocuSign eSignature (ранее известного как инструмент администрирования eSignature). Используйте экран интеграции / API и ключей.

DocuSign имеет идентификатор запроса на улучшение-4714, который позволит разработчикам загружать открытый ключ своей пары ключей в DocuSign. Но в это время вы загружаете закрытый ключ из DocuSign для создания JWT.

Добавлено

К сожалению, метод request_jwt_user_token задокументирован только в исходном коде. Вот мои комментарии к вашему вызову метода:

  • Для private_key_bytes атрибута используйте загруженный закрытый ключ в виде простой строки ASCII (с настоящими новыми строками). Другими словами, его значение должно быть примерно таким

это:

 -----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAkbz3bi31zrH2ry4p8S4ncPoMdkUyu MG46m9BalOKzWNNAvW
1LVs5ftlXxzA6V0m6nx895w8S761/qZ8xtAAl99DezRn/3CueeBUyw tvlmEBu1C
IJK69GVoSInIKf6qyeL1WxxFV5R17QtIiQeT2yCa/fitCaxwxkNlYpP4wd5tcG0W
pNHUqbQmWywTRMIBa6yYMc9qvDTJpOubrTal3BI8VqmBww0diFWLm4l6 IZ7QvDV
Q48JYErfywNXyYTxZ4kugQcuNDR3vSuwR3KSlmiRcfhkn 2jb5rx6kKnZjXQLhg3
...
PEHgznlGh/vUboCuA4tQOcKytxFfKG4F jM/g4GH9z46KZOow3Hb6g==
-----END RSA PRIVATE KEY-----
  
  • Максимальный срок службы токена доступа, созданного JWT, составляет 1 час, поэтому используйте 3600 для expires_in значения
  • user_id является ли guid для пользователя, который будет олицетворяться. Получите это значение либо из инструмента настройки eSignature в разделе Пользователи, либо на экране «API amp; Keys» для вашего собственного значения.
  • Вам нужно указать scopes параметр: использовать signature

Комментарии:

1. Хорошо, но загруженный (из DocuSign) ключ находится в формате PEM. Какой формат принимает API, вызываемый для JWT, и как мне преобразовать в этот формат?

2. Смотрите обновленный ответ. Вызову требуется формат PEM как есть.