2016-11-20 5 views
0

Я пытаюсь POST a JSON Web Token использовать шифрование new registration endpoint с использованием Node.js. Как создать этот токен? Это код, который я экспериментировал с, чтобы попытаться сгенерировать маркер, который веб-сервер Давайте Encrypt будет принимать:Как создать совместимый с LetsEncrypt JWT с Node.js?

var jwt = require('jsonwebtoken');  
var jws = require('jws'); 
var crypto = require('crypto'); 
var pem = require('pem'); 
var jose = require('node-jose'); 
var keystore = jose.JWK.createKeyStore(); 

var key; 

var props = { 
    //kid: 'gBdaS-adsfasdfasdfsa', 
    alg: 'HS256', 
    //use: 'enc', 
    n: "pK7LuT2hxkWnYRl1Tcw9iAy9-_TqvHp2wh6EcHq_wglsNmtpxAe9gNGZevWu6T2O1aEmPYkgy7Q1meKNifenFuWicDcSSenkMM0JApfdveiVqjBA81EL0Y76T8i2JolggGXbiSa_ZRGwG-0FPDSIX3Jy5mQgOn-t-zrhD9yLDn2N7zzFqCBOtxzrwz1HEtN8QWZAFAzOceyyL6C791lGOk9SYYekxyuZkwkzhDEsoqR7fN6hmu6IfIU8hF5kt8M_Gef30wt5dUESvcTNdmQmq_L1QYA8qYO6-T0mC0zIpHpwQnANYOSZBCz1uE-vwS17MlfnUwGkPHJXWThlMZqZmQ", 
    e: "AQAB" 
}; 
keystore.generate("oct", 256, props). 
     then(function(result) { 

      console.log(result); 

     var obj = { 
       header: { 
       alg: "HS256", 
       jwk: result, 
       nonce: "kajdfksajdf39393" 
       }, 
       payload: { 
        "resource": "new-reg", 
        "contact": [ 
        "mailto:[email protected]", 
        "tel:+12025551212" 
        ] 
       }, 
       secret: 'has a van', 
      }; 

      const signature = jws.sign(obj);  
      console.log(signature);  
     }); 
} 

В этом на самом деле генерировать действительный JWT:

eyJhbGciOiJIUzI1NiIsImp3ayI6eyJrdHkiOiJvY3QiLCJraWQiOiJXeVFRNFNJV2I4SGJIM2ZrQnRLOHdnR1NibU9zaGZNeUNWODZyTWdoOTR3IiwiYWxnIjoiSFMyNTYiLCJuIjoicEs3THVUMmh4a1duWVJsMVRjdzlpQXk5LV9UcXZIcDJ3aDZFY0hxX3dnbHNObXRweEFlOWdOR1pldld1NlQyTzFhRW1QWWtneTdRMW1lS05pZmVuRnVXaWNEY1NTZW5rTU0wSkFwZmR2ZWlWcWpCQTgxRUwwWTc2VDhpMkpvbGdnR1hiaVNhX1pSR3dHLTBGUERTSVgzSnk1bVFnT24tdC16cmhEOXlMRG4yTjd6ekZxQ0JPdHh6cnd6MUhFdE44UVdaQUZBek9jZXl5TDZDNzkxbEdPazlTWVlla3h5dVprd2t6aERFc29xUjdmTjZobXU2SWZJVThoRjVrdDhNX0dlZjMwd3Q1ZFVFU3ZjVE5kbVFtcV9MMVFZQThxWU82LVQwbUMweklwSHB3UW5BTllPU1pCQ3oxdUUtdndTMTdNbGZuVXdHa1BISlhXVGhsTVpxWm1RIiwiZSI6IkFRQUIifSwibm9uY2UiOiJrYWpkZmtzYWpkZjM5MzkzIn0.eyJyZXNvdXJjZSI6Im5ldy1yZWciLCJjb250YWN0IjpbIm1haWx0bzpjZXJ0LWFkbWluQGV4YW1wbGUuY29tIiwidGVsOisxMjAyNTU1MTIxMiJdfQ.RiHTdM_k1eLUJaGx4b59w8-hEQ-J0SpZjPIeGWhh1yg

Однако, когда я пытаюсь запостить в новой регистрации конечной точки, я получаю следующее сообщение об ошибке:

{ "type": "urn:acme:error:malformed", "detail": "Parse error reading JWS", "status": 400 } 

код тестирования представляет собой набор фрагментов кода я соединил после погуглить это в течение нескольких часов. Я понимаю, что есть серверы LetsEncrypt, которые я могу запустить, но не хочу этого делать. Я хочу фактически генерировать запросы и обратные вызовы непосредственно в Node.js, потому что я хочу запустить все это из функций AWS Lambda (здесь не задействованы серверы).

Я нашел один example of a JWT token that actually seems to work, вроде. Я говорю «как бы», потому что ответ из этого примера:

{ "type": "urn:acme:error:badNonce", "detail": "JWS has invalid anti-replay nonce 5H63XwyOHKpAETFpHR8stXSkhkqhlAY1xV7VsCnOrs", "status": 400} 

Это, по крайней мере, говорит мне маркер JWT в настоящее время анализируется и Нонс в настоящее время рассматривается в. Когда я декодировать этот JWT, я вижу это:

Decoded JWT

Похоже, этот парень используется RSA 256 Для создания этой JWT. Я не знаю, откуда взялись значения «e» и «n»?

Как воссоздать приведенный выше рабочий образец с помощью Node.JS/Jose?

ответ

0

Я думаю, что ответ здесь заключается в том, чтобы просто использовать пакет NPM node.js. Нет необходимости разрабатывать протокол ACME с нуля, поскольку эта библиотека, похоже, это делает.