How to verify a JWT using python PyJWT with a public PEM cert?
-
I recently upgraded from PyJWT 0.4.1 to 1.0.1 and I can't figure out how to verify a JWT signed with a public key. My code looks like this: import jwt cert_string = "-----BEGIN CERTIFICATE-----\nMIICITCCAYqgAwIBAgIIBEsUSxL..." token_string = "eyJhbGciOiJSUzI1NiIsImtpZCI6I..." jwt.decode(token_string, cert_string, algorithms=['RS256']) The error I get is: File "<stdin>", line 1, in <module> File "~/.virtualenvs/project/lib/python2.7/site-packages/jwt/api.py", line 117, in decode key, algorithms, **kwargs) File "~/.virtualenvs/project/lib/python2.7/site-packages/jwt/api.py", line 176, in _verify_signature key = alg_obj.prepare_key(key) File "~/.virtualenvs/project/lib/python2.7/site-packages/jwt/algorithms.py", line 165, in prepare_key key = load_pem_public_key(key, backend=default_backend()) File "~/.virtualenvs/project/lib/python2.7/site-packages/cryptography/hazmat/primitives/serialization.py", line 24, in load_pem_public_key return backend.load_pem_public_key(data) File "~/.virtualenvs/project/lib/python2.7/site-packages/cryptography/hazmat/backends/multibackend.py", line 285, in load_pem_public_key return b.load_pem_public_key(data) File "~/.virtualenvs/project/lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 716, in load_pem_public_key self._handle_key_loading_error() File "~/.virtualenvs/project/lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 912, in _handle_key_loading_error raise ValueError("Could not unserialize key data.") ValueError: Could not unserialize key data. I'm confident my cert_string and token are good. The following code runs OK: from cryptography.x509 import load_pem_x509_certificate from cryptography.hazmat.backends import default_backend load_pem_x509_certificate(cert_string, default_backend()) My code that used to work with 0.4.1 looked like this: cert_string = "".join(cert_string.strip().split("\n")[1:-1]) der = a2b_base64(cert_string) cert = DerSequence() cert.decode(der) tbsCertificate = DerSequence() tbsCertificate.decode(cert[0]) subjectPublicKeyInfo = tbsCertificate[6] pub_key = RSA.importKey(subjectPublicKeyInfo) jwt.decode(token_string, pub_key) Any help would be appreciated.
-
Answer:
You need to pass the public key instead of the full certificate to the decode method. So extract the key from the certificate in order to use it as in: from cryptography.x509 import load_pem_x509_certificate from cryptography.hazmat.backends import default_backend cert_str = "-----BEGIN CERTIFICATE-----MIIDETCCAfm..." cert_obj = load_pem_x509_certificate(cert_str, default_backend()) public_key = cert_obj.public_key() and then: token_string = "eyJhbGciOiJSUzI1NiIsImtpZCI6I..." jwt.decode(token_string, public_key, algorithms=['RS256'])
Lee at Stack Overflow Visit the source
Related Q & A:
- how to zip similar files using python?Best solution by Stack Overflow
- how to call a function in Python in another function?Best solution by Yahoo! Answers
- How to create a graph using python?Best solution by Stack Overflow
- How to Creating text File using Python?Best solution by Stack Overflow
- How to make a font using a png image?Best solution by Super User
Just Added Q & A:
- How many active mobile subscribers are there in China?Best solution by Quora
- How to find the right vacation?Best solution by bookit.com
- How To Make Your Own Primer?Best solution by thekrazycouponlady.com
- How do you get the domain & range?Best solution by ChaCha
- How do you open pop up blockers?Best solution by Yahoo! Answers
For every problem there is a solution! Proved by Solucija.
-
Got an issue and looking for advice?
-
Ask Solucija to search every corner of the Web for help.
-
Get workable solutions and helpful tips in a moment.
Just ask Solucija about an issue you face and immediately get a list of ready solutions, answers and tips from other Internet users. We always provide the most suitable and complete answer to your question at the top, along with a few good alternatives below.