auth0 / node-jwa

JSON Web Algorithms
http://tools.ietf.org/id/draft-ietf-jose-json-web-algorithms-08.html
MIT License
98 stars 42 forks source link

Error: PEM_read_bio_PUBKEY failed #20

Closed PhillippOhlandt closed 6 years ago

PhillippOhlandt commented 6 years ago

Hey,

I try to use https://github.com/brianloveswords/node-jws/ to generate and verify a JWT using a PEM certificate.

Here is my code:

var pem = fs.readFileSync('public/certs/key.pem');

var sign = function (data) {
    return jws.sign({
        header: {
            alg: 'RS256',
            typ: 'JWT'
        },
        payload: data,
        secret: secretJwk()
    });
};

var verify = function (signed) {
    return jws.verify(signed, 'RS256', secretJwk())
};

function secretJwk() {
    return pem.toString();
}

When I test it in the console, the signing works, but the verification throws an error:

$ node
> cr = require('./auth/consentRequest.js')
{ sign: [Function: sign], verify: [Function: verify] }
> signed = cr.sign({foo: "bar"})
'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIifQ.UBU_OakKEMN-NhO2AfHTUMq1rsjHKc7pJxUclJX9BvI4AU_bDpe-dBbDfTmqSFE45PX8FGCXdUl5_gJtbc8OZcAWpaltDwmhQ-Z_nxDYoAq9D0fYnNjsfx8axGfTE_D8ayENmvMIK143kt-cKWO-WjFbUKvoDDwC6aQiAMaF8R1XX0SxMGqXb7w44E8xRDB2mryV-54i2JwiMA3aWzqPa5z0BPirOEnnpnSvnf1KvxsisMiHf4asRhSxDHeJXI1DCdJ4MzK7x4jooWXN5cxbH4BHMItprvdABPqqxTViaLkeKzUKBmrEYhZVJoV65LGdG1SVi-bCeZCno66WnjX0xw'
> cr.verify(signed)
Error: PEM_read_bio_PUBKEY failed
    at Error (native)
    at Verify.verify (crypto.js:311:23)
    at Object.verify (/Users/phillipp/Work/Customer/Project/node_modules/jwa/index.js:68:21)
    at Object.jwsVerify [as verify] (/Users/phillipp/Work/Customer/Project/node_modules/jws/lib/verify-stream.js:54:15)
    at Object.verify (/Users/phillipp/Work/Customer/Project/auth/consentRequest.js:43:16)
    at repl:1:4
    at sigintHandlersWrap (vm.js:22:35)
    at sigintHandlersWrap (vm.js:96:12)
    at ContextifyScript.Script.runInThisContext (vm.js:21:12)
    at REPLServer.defaultEval (repl.js:346:29)
>

Here is my certificate:

-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAsOdk8QW1jengFToHHKWfKbqWqeQT3fws/6ninQHLiCaPug1e
McMvMv23YYFFL5mQZmDevTnhOxaY5+5mnLyzhCYrD6rrU8+biE/W5Zcv2GcSr1ij
JqtQslQwA2YHwCqdZPNyBVJRLwqCH5c/X017LZyFmfTEg1TFh87u1XB+SmL8aaLi
yl3H8fdYV3ws6AJIn9IyuKGxst6VCgRpoHw3Aif5BRY9bYYbHQpPXEkKZxNDZlZK
PD59qvFfqZ3ciyqYWOdXXbHk9H4uo3h+buWLeb9W1GN0R31027gTaZ/dlkrQUIa4
tIbMJA9U5kq4KkyFPdECAdF0CrbQm8WhNepXJwIDAQABAoIBACsu8Scc26re0oKb
/axyiZ3oHGswb+Eac+mdEOJ+065Sq3chWEMRgG4UHTXCFp99/w/eycCrZl3EMGM9
gPL15WR25MAYWwXEghUOWEkHVPiggKEpI/qGi1Zc0rOhrnascGt6OfUumP7As+7+
PswG3/DMapigdXARu35hd0/G/C0wAMLb5tlB7Zx/XRYHDhRmwywGZy2umrQU9n+Z
CibbWHreNMj8opTiDjWbO9eEJFoZOmcs1mLRNdc8iMGbuCFJROCR8heNTtS62GeQ
cXcWQV000mNBDs/CTNLTFIK/AcZ5yNn42WMFdRNPexxSzVGEfmum1lJ4HNuKC+TZ
BP8SxwECgYEA1t78KQZNhi6ICa3IshBJs823ECTZICUjsYGUTxAumKbsfbt90TQY
GYdDIkMJL6vmaJFA2vvKmqL1U9WWRfKIVb0gZbVmwX+A0HdVHyljMX+oCnolXDLt
ds/kNCJwotDCLHWpVOX1OlFFeFQBDel9oEfu/7k+JNgw5uLz9sat4ecCgYEA0sP1
t1jWcZpDFZwIexNMius8ZmRz+c/KqFEL3wmz0WY7EjMChd4EHpYLAGCFyQdyjS8n
t0Qr7mre9GYm/QZimgOVvkRayEbovTe9943Xux4f4b73z+4jzz0E8eg8gL2akrRm
me2AxBbiVoKC3KeDE/ClZM2LiwznZ/7UQrVDuMECgYEAyxMV+OPnEwEZOySOwJOa
RKAQ+uYIe1P+hv3zoEGn+EgSzMYNpFH60O3Aqjn3DaIGch+NzykXk8yd1izQCK2u
4nGLk/S89/W8Vcninj/satS+iaBlfNz5B0h14jwGfiqUyZYugnmPqh0zbgTetjpN
q9UwcWmu7P2SQjSO5FVj81MCgYAcP8efW3jioRp8uv0oAd4wgHcIAk7JHOC8zqAY
tOQ1HM6uEcg0yR0kPFgdJNLJrwXbhoZ8Odbpjcl0WHzBTSnKGtDnP6IrVdW8Bsyf
cZOIsPD1APOWGwURscwH4Gi7mK4vG57k4sBvh+GuVq/Tg2A+O/LvH92kNYaOmck5
Z7I8AQKBgEfG1J/abSonS7TJ/C7ZIm1Djk29Cj057fRbc/LdYddtV96nzvqUFlHA
wdYCTYW9JDLDVa2bJdcbCBPmgjzwiCflivZ5JRE/g+wyEWFP7ZHZrWiCBjaVgond
qiGWXZG9KRmUiB1MnYgr18MKhf8sYmQRlQPTdoJH6ESgPWZsN02J
-----END RSA PRIVATE KEY-----

Anything I do wrong?

PhillippOhlandt commented 6 years ago

Seems like this package doesn't handle the export of public keys from a private key. The verify function needs a public key.

Solution:

var NodeRSA = require('node-rsa');

function publicJwk(){
    var key = new NodeRSA(pem.toString());
    return key.exportKey('pkcs1-public-pem');
}