node.jsexpressauthenticationjwt

Error: secretOrPrivateKey must be an asymmetric key when using RS256. What is happening?


I have the following piece of code to signIn a user:

export function signJwt(object: Object, options?: jwt.SignOptions | undefined) {
  return jwt.sign(object, privateKey, {
    ...(options && options),
    algorithm: "RS256",
  });
}

But I am getting a Error: secretOrPrivateKey must be an asymmetric key when using RS256. I have generated the public and private keys using the following commands:

Private Key

openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048

Public Key

openssl rsa -pubout -in private_key.pem -out public_key.pem

What is going on? Why am I getting this error? and I am storing the private and public keys in a config/defaults folder:

export default {
  port: 1337,
  dbUri: "mongodb://localhost:27017/[DatabaseName]",
  saltWorkFactor: 10,
  accessTokenTtl: "15m",
  refreshTokenTtl: "1y",
  publicKey: `-----BEGIN PUBLIC KEY-----
  MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqycDj+M3aJXhEuvHiWG0
  /Xqx6Gt3t3ELtJrSzHqwtAyy1VVB1UP52Dw0nRnWjVPhzRdDXRdpLA8ZnfrsDXx7
  bNoiWIs7dQpv7mcPY1yFPHeITpaZcb40yIaHXTbnOcviVJSVa7rXLlnDGrL4SdXz
  RdxIl3iilN/w4lSDaMg+JCpT0O0w3Qzh9XA7Flx9WyqsZagPNmJKs5e3FfUVv074
  aul1kyd2ttIGFDLZRM3w5ay9QaS/hAW8fB/EnuCDd1DaQyIEmeszIx7GXUlaw0GK
  oWFfNJDQmLivfC3QNK142X2iJV0EyyqZ/56+9Kq/PnDpFXrXrPHZp8tWScecIyGq
  VQIDAQAB
  -----END PUBLIC KEY-----`,
  privateKey: `-----BEGIN PRIVATE KEY-----
  MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCrJwOP4zdoleES
  68eJYbT9erHoa3e3cQu0mtLMerC0DLLVVUHVQ/nYPDSdGdaNU+HNF0NdF2ksDxmd
  +uwNfHts2iJYizt1Cm/uZw9jXIU8d4hOlplxvjTIhoddNuc5y+JUlJVrutcuWcMa
  svhJ1fNF3EiXeKKU3/DiVINoyD4kKlPQ7TDdDOH1cDsWXH1bKqxlqA82Ykqzl7cV
  9RW/Tvhq6XWTJ3a20gYUMtlEzfDlrL1BpL+EBbx8H8Se4IN3UNpDIgSZ6zMjHsZd
  SVrDQYqhYV80kNCYuK98LdA0rXjZfaIlXQTLKpn/nr70qr8+cOkVetes8dmny1ZJ
  x5wjIapVAgMBAAECggEAHOo6b9SzR7gKjmfHDi6zpR9Vby64ywUONTTy6BjSQZjj
  nacJuD4Dt8R0HxZ+aOIDA+MqPk/2NLtYWJhLyPt+3qT7qHndUaixwFUpBGBdIhoP
  rTdENTMtN7OCqvzbk6geVKvFkq2+LNZ9X8VcrRy4PNU6blyzGvO6foJIsSsjVHiL
  djcplxPS0D4bulSmFBLQ8FIGIrygbhYJBJ3O/OTtUKzIlmyrhdbLQ+hWYf80i8RO
  IAchdv0x+v5dQ3E8VnHGDg0hlsv2Zodkk09RYPMOypCF0dvkbshI79Vrdr7K2WsK
  JihgnbC/FqjAxL58o28ggAfsCMCMHqjeSI11o+3HAQKBgQDQt2KR6meVllyLnutA
  4W7CWsi7AACDzUe9lbIc9iphe7JxflsNx1qg2FgmiOPakJ2JmaKy69bcfY7Zqr4h
  mIm9Y9qLMvhR23sT4vZXj3NvU9Gq7S0JufUoOTJscvP4BHy46udLOCRqaQNtdz9D
  Mwf3psw8Jp679m3AuPL9AuASJwKBgQDR7RZ2qjJjNrtcxjs3GDvMX+P9KnrcG831
  7N3k7mqkfiYnhYJgXmU+JHbyIAoe9Qop8AZ0OMTdNyjF6uuizW8lwT1+fZJjz9RF
  1lmQJOejfyZDBYAd7gHewA95rAfk5YPJwW4rYE+CSLzPsrVw5uIxc6qhDumR3341
  t8XdnTe5IwKBgQCyjqDqWlIB3GASJoP2vqWl6kreCFNobr9YRu/Y7RQ2z79KbyHw
  uMMk5dEMLoJYIu5ToLdbQH5Rpa0HNJZyYXA9MWbvPUzJou45hirfn97OuDOgekXU
  k11T6xLjSrjDTvtwq63yYPZufqarCKB7mfXP/ceuEhAsl9cvUEq4/7O4cwKBgBkk
  RQF3RsudHXlyAFuL2nWSsnJ6qPY9mkAu2zB04W7L8PPgyImUJJn5sgkzjyLABDSb
  m5pFxkYcOhTiGtCHvB0QdLX2ghbUKD8o+dcKpHdvXfy+5uYuwCiWZgQTd2qRlmQO
  d4xYX41h+sMBSzu3WzXC/ZeGerDOzIXQebEeCDNzAoGAaSmbFIzE1lM+y+gL58lL
  Qs8h8JxUTdhU0o7TH0Yn3P/PGTkhn8IS+HSBQ6QI/I3Y5WHS7LhCBQ6HYtt+dUbc
  goNFJeK0XmODIQ3Ci80LYYvlr33zKwdCKuv+ZQk3ADeQql/VyjtGzEFSuTK7IK3/
  WXq6XLf2L6oEAJKWYrm6sus=
  -----END PRIVATE KEY-----`,
};

Is it the way I am storing the private and public keys?


Solution

  • It is because when you assigned the values for private key and public key the formatting changes. The keys must look exactly how the cert look like even the spacing.

    const publicKey='
    -----BEGIN PRIVATE KEY-----
    MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDLqJlPUBTj1Iiz
    zzAcIB/3dQhYDVWQcCjRG3cQVHuswuIUg2hPIpsppTK0oPUcudfksB4uVob9mSU7
    8fbZ2mvKOtIpiXA7blJVRVrLadPCVeTYXc9QAR+5Wf9mTxYPwpSOFs9O/Hy0CoN2
    WPqIJOQFrgNZEHtL1NetxlRqZabn6I467R49xUZxy4Z9GZIJ2hswd1hUPfr5fiAS
    eUUgJlSbXvDx3VHcIh2jkRvib1lgODDnD/hkNosTpWsTCV+mfzRt5Sred0mzHpG9
    DgMYnCeknPDLHAhkYmJ0/RZmV5G7OoXTGyKtmhYIByRAGrqaqy7K4ROe+JW6Kzt2
    OWhx6/UzAgMBAAECggEADvsdIpaZ9XO7WzqzknC8g+fx0ARUayEM/Ot1HoLlwWdp
    LlLHmAFMLPaQHHW17MHbmItp/5pG03McqDmxdloDptHH3DKrdPu1sRG+eYsUfs2c
    XVwdNV3idwXLQeaHEWwMoHJwwncpNyyKJL5Wg4WZ2QnGs5pWRNWTHfR3s4c8YqpO
    Ji4sXDVO8geDeUARSiWRr5yRDH1rU2cazw0/eF4Z0zWeBrreu3VSKBOCjmdqqYoV
    aHXqGYoJS9Kj3FUG2i0hFTHICNSuys1dSVW5OoAn1fLia3w4PhtVwhTNrYKrkTbE
    qCJ/TEjMdFVg7OEyXmBrezqeBkdmaq1Ng+ymikwS4QKBgQD23hyFuXJPSQBxij3p
    tXHvV156oO0aAJ7CzpyRVt2m+5JIX8SGmvdGhcGy2g4rXAAA78fHc/vx9WNmUez0
    +G4IIi8TDNQdmsv5ogWVkuluyK0tJhfyK4f6/vPliQL8AJcIPOo4X++YYLIwmqKa
    vXKRIPF7dU1jv2Z0toz5aTS60wKBgQDTMUnsvorbXl4Ne4ijUVxq+kyvliM6noWO
    YH2KcssUajQ7X27yTZl0z5JurNBkLMSlrwuEmHXaGNX/ZHYbQ0Bt/ktn9nzzCWtB
    d3CxIMO9zQ5bw78Kft15PL5WZoVWiLH+mKt9Mo1FhpgNGHB0o5JQavWkvGeezQkS
    +YLvi7SgIQKBgQCvwsuD2dis4kjSjZ4u+uQ3h3jYziKBVNez0u5d+/6rmIk5xhVh
    0IslRq317JISBNpr0EvokYdbaV5vxvxyHT4ZxFzHr2aF/WQkQ1q+d26DVZUWg/yg
    iqWx6jszvSzGxpTBZL1NjeBEGPRE7pO+oAslkNLdF1MWJXuItUABgwnryQKBgQDD
    mH2n5t1ByIeBIy1sXNkkNwc5A+tCyjhVoeYDiMeu86HGb1+Yx+fdOLWdDS6/6HqE
    HLelKXLU+HWR4GBGZaXReVgrRC17BfkxG8biNb80FSs8L/HKba7/LxP1f2P0vgtk
    Cc+h12ThxIMkdcMJM8k586Xn2Zp6h9jkmvP6mcBDIQKBgQC1WzFBrmCikop8xYtp
    Q5IUN+MB8w09Wvp2XY/WfBlwzMUa+mMZNz2XLMCEa3uBGPY6u8eg1iDATPR61bym
    j/aCHA+cRks5zZXXmOc8H7qO/rFLWhnYCfzMDqG97dhnhf78vJSEI5n86dMas5ct
    JzorGJm7NnRktgA/ebI6u/cbtw==
    -----END PRIVATE KEY-----
    '
    const privateKey='
    -----BEGIN PUBLIC KEY-----
    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy6iZT1AU49SIs88wHCAf
    93UIWA1VkHAo0Rt3EFR7rMLiFINoTyKbKaUytKD1HLnX5LAeLlaG/ZklO/H22dpr
    yjrSKYlwO25SVUVay2nTwlXk2F3PUAEfuVn/Zk8WD8KUjhbPTvx8tAqDdlj6iCTk
    Ba4DWRB7S9TXrcZUamWm5+iOOu0ePcVGccuGfRmSCdobMHdYVD36+X4gEnlFICZU
    m17w8d1R3CIdo5Eb4m9ZYDgw5w/4ZDaLE6VrEwlfpn80beUq3ndJsx6RvQ4DGJwn
    pJzwyxwIZGJidP0WZleRuzqF0xsirZoWCAckQBq6mqsuyuETnviVuis7djlocev1
    MwIDAQAB
    -----END PUBLIC KEY-----
    '
    
    export default {
      port: 1337,
      dbUri: "mongodb://localhost:27017/[DatabaseName]",
      saltWorkFactor: 10,
      accessTokenTtl: "15m",
      refreshTokenTtl: "1y",
      publicKey: publicKey,
      privateKey: privateKey,
    };