PyJWT, ожидание ключа в формате PEM

Я скопировал этот код из Layer:

https://github.com/layerhq/support/blob/master/identity-services-samples/python/controller.py

Мне сказали, что два других человека успешно запустили его на компьютерах Mac. Я использую Windows 7 и получаю TypeError: Ожидается ключ в формате PEM при запуске кода:

#Read RSA key
root = os.path.dirname("__file__")
with open(os.path.join(root, RSA_KEY_PATH), 'r') as rsa_priv_file:
    
    #Not sure about adding the utf-8 AT ALL
    priv_rsakey = RSA.importKey(rsa_priv_file.read())

#Create identity token
#Make sure you have PyJWT and PyCrypto libraries installed and imported
identityToken = jwt.encode(
    payload={
        "iss": PROVIDER_ID,                 # String - The Provider ID found in the Layer Dashboard
        "prn": user_id,                     # String - Provider's internal ID for the authenticating user
        "iat": datetime.datetime.now(),              # Integer - Time of Token Issuance in RFC 3339 seconds
        "exp": datetime.datetime.utcnow() + datetime.timedelta(seconds=30),   # Integer - Arbitrary Token Expiration in RFC 3339 seconds
        "nce": nonce                        # The nonce obtained via the Layer client SDK.
    },
    key=priv_rsakey,
    headers = {
        "typ": "JWS",               # String - Expresses a MIME Type of application/JWS
        "alg": "RS256",             # String - Expresses the type of algorithm used to sign the token, must be RS256
        "cty": "layer-eit;v=1",     # String - Express a Content Type of Layer External Identity Token, version 1
        "kid": KEY_ID               # String - Private Key associated with "layer.pem", found in the Layer Dashboard
    },
    algorithm="RS256"
)

print identityToken

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

-----BEGIN RSA PRIVATE KEY----- MIICWwIBAAKBgQCWjLl4Hw8PLto2wGGxrpJ0afHQDX2iJ/xqNXyybgG0GxZI344u HXxn/bRzH4Z39pw3vGKrvd21hyln5/qaJGoCSb7QHAtdz8pfNF3t96DBcDh2aDMe +8W/4mZqiDi2zNqxAnmuv6vSKnU3UyqFpuPCdXFiA8Gt8OqHHLks8MYYjwIDAQAB AoGAII9i9YXSHfiGHV1SQ7l7102qjNK+HzoCr33N8FE2cRuCoFQpTfP2mg8W3ect j/h4JN3LgVVZBA+tdtiptHi3rF1W4yNs4pO3xYLJZHoCdG5CjHoMzEf2VwixK6+f 8FCCNErG8yxCpcPDH8D0NjMFzJ0t1kwsBQ0w5iSvdY3qtLECQQDgQPVk6W79kNS9 gBoZAB71yJazQpCwJ2SLYj6aFNZDX1Jpg5GRoVOs59gl13UF+9AwJf5MCIMbqaly T1/4aBa1AkEAq9y0DwSjNLl26XeBhWycQJZUu5lsJVqJcx2q0GsKGx5Ntei/48bD ldi7ZXWdA6o4OOV2GpW1hX7vssPHBXBYswJAMGXUkDLRAWiAgWVkPIEKLYFdBNMY 5uuZh3tsh1R36ZJo9tyuTf/DT026GHCnkOMHy1xnxYEQyqeTKlh3HeVZAQJAIQYC r1QTzEDLAaeOAsZQ6 /Q3Cek4545TBgSwWuYGhhl3kznLDYiW8oc30xIbfqXJsd0d qZQU0jcG9hG6f2gMEwJALHz0jXhpjo+UygUjdKbW/mfKRirSYiGLCYQHiNc4aaDe omr9XLu9Hc6aI9RVGIFMnygaI9Ahu2mATpj5=

-----КОНЕЦ ЗАКРЫТОГО КЛЮЧА RSA-----

Я не мог найти никаких решений моей проблемы, которые работали. У кого-нибудь есть идеи? Спасибо


person maininformer    schedule 03.06.2015    source источник
comment
Какую версию Python вы используете?   -  person frasertweedale    schedule 04.06.2015
comment
Питон 2.7; работает в shell_plus --notebook, jupyter   -  person maininformer    schedule 04.06.2015
comment
Этот вопрос указывает, что -----BEGIN PRIVATE KEY----- ожидаемый формат; у вас другой формат. Попробуйте преобразовать его (думаю, у OpenSSL будет инструмент).   -  person frasertweedale    schedule 04.06.2015
comment
Спасибо, но в том же вопросе сказано, что BEGIN RSA PRIVATE KEY также приемлем. Пробовал и другие, безрезультатно. Мне сказали, что это работает на Mac.   -  person maininformer    schedule 14.06.2015
comment
К вашему сведению, теперь, когда вы опубликовали этот ключ, вы больше никогда не сможете его использовать!   -  person Gershy    schedule 23.06.2015
comment
Благодарю вас! Да, я вручную изменил ключ перед публикацией :)   -  person maininformer    schedule 23.06.2015


Ответы (1)


Сдача:

priv_rsakey = RSA.importKey(rsa_priv_file.read())

to:

priv_rsakey = rsa_priv_file.read()
person matthewk    schedule 16.06.2015
comment
Я думаю, что будет более безопасно, если вы удалите верхний и нижний колонтитулы файла, поскольку известные заголовки файлов могут помочь сломать ключ: priv_rsakey = rsa_priv_file.read().replace("-----BEGIN RSA PRIVATE KEY-----\n", "").replace("-----END RSA PRIVATE KEY-----\n", "") - person ffleandro; 18.09.2017