错误:错误:0909006C:PEM 例程:get_name:无起始行 - 节点

问题描述 投票:0回答:13

我已经克隆了这个存储库(https://github.com/docusign/code-examples-node)并相信我已经输入了所有必需的密钥和代码。但是,当我尝试使用 JWT 进行身份验证时,我收到此错误:

    at Sign.sign (internal/crypto/sig.js:105:29)
    at Object.sign (C:\Users\BrownJ3\Documents\repos\code-examples-node\node_modules\jwa\index.js:152:45)
    at Object.jwsSign [as sign] (C:\Users\BrownJ3\Documents\repos\code-examples-node\node_modules\jws\lib\sign-stream.js:32:24)
    at Object.module.exports [as sign] (C:\Users\BrownJ3\Documents\repos\code-examples-node\node_modules\docusign-esign\node_modules\jsonwebtoken\sign.js:189:16)
    at generateAndSignJWTAssertion (C:\Users\BrownJ3\Documents\repos\code-examples-node\node_modules\docusign-esign\src\ApiClient.js:62:16)
    at exports.requestJWTUserToken (C:\Users\BrownJ3\Documents\repos\code-examples-node\node_modules\docusign-esign\src\ApiClient.js:890:19)
    at _DsJwtAuth._getToken [as getToken] (C:\Users\BrownJ3\Documents\repos\code-examples-node\lib\DSJwtAuth.js:85:33)
    at log (C:\Users\BrownJ3\Documents\repos\code-examples-node\lib\DSJwtAuth.js:174:33)
    at _DsJwtAuth.DsJwtAuth.login (C:\Users\BrownJ3\Documents\repos\code-examples-node\lib\DSJwtAuth.js:184:5)
    at commonControllers.login (C:\Users\BrownJ3\Documents\repos\code-examples-node\lib\commonControllers.js:36:16) {
  library: 'PEM routines',
  function: 'get_name',
  reason: 'no start line',
  code: 'ERR_OSSL_PEM_NO_START_LINE```
docusignapi
13个回答
71
投票

这通常意味着 PEM 文件缺少关键部分已开始的指示符。

PEM 文件的结构如下:

Intitial Data to be processed

-----Begin <Type>-----

Key Information

-----End <Type>-----

这些文件的标准可以在这里找到:https://www.rfc-editor.org/rfc/rfc7468

您能否确认您正在使用的 PEM 文件中是否存在 -----Begin / End 行?请不要在此处发布实际文件,如果它们存在于 PEM 中,我们将希望您使用 DocuSign 打开支持案例,以便我们保留任何必要的私人数据以进行私人故障排除。


23
投票

如果您确实拥有 @Matt King DS 建议的有效 PEM 结构,但您仍然收到此错误,则很可能是新行导致了错误。

如果您正在使用 dotenv 那么来自文档:

多行值

如果您需要多行变量,例如私钥,现在支持带换行符的(>= v15.0.0):

PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----

...

Kh9NV...

...

-----END DSA PRIVATE KEY-----"

或者,您可以用双引号字符串并使用 性格:

PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\nKh9NV...\n-----END DSA PRIVATE KEY---

AWS 拉姆达

我在AWS lambda中也遇到了这个错误。上述方法对我不起作用。我必须在 lambda 中使用不带双引号的 env 变量,并且 而不是新行,并且在代码中我必须替换 经过 ,像这样:

process.env.MY_PRIVATE_KEY.replace(/\\n/g, '\n')

20
投票

您可以在此处验证您的证书:https://www.sslchecker.com/certdecoder

就我而言,我粘贴错误,漏掉了一个破折号:

- -----BEGIN CERTIFICATE-----
+ ----BEGIN CERTIFICATE-----

请注意前五个破折号至关重要。

注意

如果您不想粘贴到未知站点,您可以尝试以下命令,感谢@Adrian Gonzalez:

openssl x509 -in <cert-name>.pem -noout -text

18
投票

如果使用docker,我有一些观察。

  1. 尝试将
    .env
    值设置为纯文本。不是字符串文字。
  2. 对项目进行编码时,将
    '\\n'
    替换为
    '\n'

5
投票

如果您在 Angular CLI 中遇到此问题,请确保您的 ssl 密钥路径有效。

运行时遇到同样的问题:

ng serve --ssl true --ssl-cert ./ssl/server.crt --ssl-key ./ssl/server.key

结果我的路径无效。


3
投票

我通过运行以下代码行解决了这个问题。这可以在任何地方运行,以便将正常的

\n
转换为实际的换行符' '

jWtstring = 'your_JWT_string'
jWtstring.replace(/\\n/g, '\n')

获得新输入的 JWT 密钥后,您可以将其粘贴到 SSM 或根据需要执行后续步骤。


1
投票

尝试从 -->

删除 .nprm

C:\Users{用户名}

然后就可以正常工作了


1
投票

对于 Angular 版本 14.2.8 使用以下命令。

ng服务--ssl“您的项目名称”--ssl-key“密钥路径”--ssl-cert“您的证书路径”

示例:-如果您的密钥和证书位于同一驱动器上 C://your_key 或 C://your_certificate


1
投票
const fs = require('fs')
const https = require('https')


https.createServer(
    {    
        key:fs.readFileSync('key.pem'),
        cert: fs.readFileSync('cert.pem'),
    }
).listen(PORT, () => {
    console.log(`server is running on http://localhost:${PORT}`);
})

在使用属于 fs 模块的 readFileSync 初始化为“key: key.pem”之前,需要加载文件 key.pem

https.createServer:- https://nodejs.org/api/https.html#httpscreateserveroptions-requestlistener fs.readFileSync:- https://nodejs.dev/en/learn/reading-files-with-nodejs/


0
投票

你必须使用

 const key = new NodeRSA({ b: 512 });
    let keypair = {
        private: key.exportKey(),
        public: key.exportKey("public")
    };

使用 RSA 签署令牌时的私钥


0
投票

就我而言,事实证明,pem 具有

-----BEGIN TRUSTED CERTIFICATE----
....
-----END TRUSTED CERTIFICATE-----

但这确实有效:

-----BEGIN CERTIFICATE----
....
-----END CERTIFICATE-----

要“修复”标题,您可以运行:

openssl x509 -in old.pem -out new.pem

-2
投票

如果您只是将其用作沙箱项目,您可以使用:(没有私钥)

var jwt = require('jsonwebtoken');
var token = jwt.sign({ foo: 'bar' }, 'shhhhh');

如果不是沙箱,你必须生成一个privteKey。

您可以在 jsonwebtoken 文档上看到它: https://www.npmjs.com/package/jsonwebtoken


-2
投票

我的 M1 Mac Pro 也遇到同样的问题。

通过以下方式解决了我的问题:

  1. 搜索您的 .npmrc 文件并将其删除。
    sudo find ~ -type f -name
    '*npmrc' rm -rf /Users/<user>/.npmrc
  2. 做一些经典的事情,比如:
    npm cache verify
    npm cache clear --force
  3. 最后使用
    npm install
© www.soinside.com 2019 - 2024. All rights reserved.