Error: error:1E08010C:DECODER routines::unsupported Google auth库

回答 3 浏览 5190 2022-10-19

我最近在Node.js上使用google云存储SDK时遇到了这个错误。我知道在过去没有任何改动的情况下这是可行的,但我已经有一段时间没有碰过代码了,可能是错的。

这里是错误本身:

Error: error:1E08010C:DECODER routines::unsupported
    at Sign.sign (node:internal/crypto/sig:131:29)
    at Object.sign (node_modules/jwa/index.js:152:45)
    at Object.jwsSign [as sign] (node_modules/jws/lib/sign-stream.js:32:24)
    at GoogleToken.requestToken (node_modules/gtoken/build/src/index.js:232:31)
    at GoogleToken.getTokenAsyncInner (node_modules/gtoken/build/src/index.js:166:21)
    at GoogleToken.getTokenAsync (node_modules/gtoken/build/src/index.js:145:55)
    at GoogleToken.getToken (node_modules/gtoken/build/src/index.js:97:21)
    at JWT.refreshTokenNoCache (node_modules/google-auth-library/build/src/auth/jwtclient.js:172:36)
    at JWT.refreshToken (node_modules/google-auth-library/build/src/auth/oauth2client.js:153:24)
    at JWT.getRequestMetadataAsync (node_modules/google-auth-library/build/src/auth/oauth2client.js:298:28) {
  library: 'DECODER routines',
  reason: 'unsupported',
  code: 'ERR_OSSL_UNSUPPORTED'
}

抛出这个错误的代码如下:

const credentials = {
    type: process.env.TYPE,
    project_id: process.env.PROJECT_ID,
    private_key_id: process.env.PRIVATE_KEY_ID,
    private_key: process.env.PRIVATE_KEY,
    client_email: process.env.CLIENT_EMAIL,
    client_id: process.env.CLIENT_ID,
    auth_uri: process.env.AUTH_URI,
    token_uri: process.env.TOKEN_URI,
    auth_provider_x509_cert_url: process.env.AUTH_PROVIDER_X509_CERT_URL,
    client_x509_cert_url: process.env.CLIENT_X509_CERT_URL,
  };

  const storage = new Storage({
    credentials,
  });
  if (!req.file) {
    logger('POST /profile_image', logLevels.error, 'No file uploaded!');
    ResponseError.badRequest(res);
  }
  const bucketName = process.env.BUCKET_NAME;
  const bucket = storage.bucket(bucketName);
  const fileName = `profile_pics/${req.user}/${req.file.originalname}`;
  const file = bucket.file(fileName);
  const stream = file.createWriteStream({
    metadata: {
      contentType: req.file.mimetype,
    },
  });
  stream.on('error', (err) => {
    console.error('Error pushing the picture: ', err); <--- error
    throw err;
  });
  stream.on('finish', () => {
    return file.makePublic().then(async () => {
       ...
      })
  });
  stream.end(req.file.buffer);

process.env包含所有正确的值,我已经确保用一个新的私钥来尝试,但同样的错误。有谁以前见过这种情况?

TIA!

Fares 提问于2022-10-19
1) 不要在环境变量中存储服务账户。2) 如果你这样做,不要把服务帐户分成几块。对整个服务账户进行Base64编码,将其存储在一个变量中,然后在需要时对其进行Base64解码。3) 你的代码失败了,因为客户端被设置成了坏的凭证。最有可能的是一个损坏的私钥。John Hanley 2022-10-19
问题是私钥损坏了吗?John Hanley 2022-10-19
我不能说。我按照你的建议进行了编码,问题似乎已经消失了。我开始想,也许分解成碎片的部分可能破坏了各个键。Fares 2022-10-19
根据堆栈跟踪,我相当确信你破坏了private_key字段。John Hanley 2022-10-19
3 个回答
#1楼 已采纳
得票数 6

作为社区维基回答这个问题。如上文中John Hanley的评论所述

  1. 不要在环境变量中存储服务账户。
  2. 如果你这样做,不要把服务帐户分成几块。对整个服务账户进行Base64编码,将其存储在一个变量中,然后在需要时对其进行Base64解码。
  3. 你的代码失败了,因为客户端被设置成了坏的凭证。最有可能的是一个损坏的私钥。
community wiki 提问
community wiki 修改于2022-10-20
#2楼
得票数 4

我遇到了同样的问题,并通过用换行符替换原始的\n字符来解决它。可能你从你的环境中得到的钥匙是原始数据,而原始数据中的\n字符没有被视为换行字符。你可以试试这个。

    private_key: process.env.PRIVATE_KEY.split(String.raw`\n`).join('\n'),

techstack 提问于2022-12-03
#3楼
得票数 0

如果你最近将openssl升级到了第3版,你可能需要在/etc/ssl/openssl.cnf文件中启用遗留的证书。

   openssl_conf = openssl_init
   
   [openssl_init]
   providers = provider_sect
   
   [provider_sect]
   default = default_sect
   legacy = legacy_sect
   
   [default_sect]
   activate = 1
   
   [legacy_sect]
   activate = 1

这些信息来自于OpenSSL WIKI

bobmcn 提问于2022-11-12