SignedJwtAssertionCredentials на AppEngine не распознает ключ PEM

SignedJwtAssertionCredentials на appengine (с pycrypto 2.6) не поддерживает формат PKCS12, поэтому я пытаюсь использовать клавиши PEM вместо этого, как это предлагается везде.

это мой код:

  f = file(os.path.join(os.path.dirname(__file__), KEY_FILE), "r")
  key = f.read()
  f.close()

  credentials = SignedJwtAssertionCredentials(SERVICE_ACCOUNT_EMAIL, key,
      scope="https://www.googleapis.com/auth/drive"
  http = httplib2.Http()
  http = credentials.authorize(http)

а KEY_FILE - это ключ PEM, преобразованный с помощью команды:

openssl pkcs12 -in privatekey.p12 -nodes -nocerts > privatekey.pem

но я все равно получаю эту ошибку, как будто он не распознал ключ PEM:

NotImplementedError: PKCS12 format is not supported by the PyCrpto library. 
Try converting to a "PEM" (openssl pkcs12 -in xxxxx.p12 -nodes -nocerts > privatekey.pem) or using PyOpenSSL if native code is an option.

та же ошибка, если я передаю только имя файла конструктору (не читая содержимое файла)

любая идея?

Ответ 1

Да, ошибка очень вводит в заблуждение. То, что вы делаете, прекрасно; просто удалите заголовок из файла PEM, чтобы он начинался с -----BEGIN PRIVATE KEY-----, или выполнил следующую команду над ним:

openssl pkcs8 -nocrypt -in privatekey.pem -passin pass:notasecret -topk8 -out pk.pem

Ответ 2

для тех, кого это интересует, я закончил составление краткого руководства о том, как использовать API-интерфейсы Google+ с помощью python в App Engine, вы можете найти его здесь: https://gist.github.com/vircheck/6292176

Он также применим к другим API-интерфейсам на основе учетных записей служб, таких как Drive API и т.д.