2016-11-20 93 views
0

我正在嘗試使用Node.js發佈JSON Web Token以允許加密new registration endpoint。我如何創建這個令牌?這是一些代碼,我一直在嘗試,試圖生成令牌,它可以讓加密的Web服務器會接受:如何使用Node.js創建與LetsEncrypt兼容的JWT?

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);  
     }); 
} 

這實際上不產生有效的智威湯遜:

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令牌被解析和Nonce正在看着。當我解碼此智威湯遜,我看到:

Decoded JWT

看起來這傢伙使用RSA 256創建此JWT。我不確定值「e」和「n」來自哪裏?

如何用Node.JS/Jose重新創建上述工作示例?

回答

0

我想這裏的答案只是使用letsencrypt node.js NPM包。沒有必要從頭開始開發ACME協議,因爲這個庫似乎這樣做。