我已经克隆了这个存储库(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```
这通常意味着 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 打开支持案例,以便我们保留任何必要的私人数据以进行私人故障排除。
如果您确实拥有 @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 lambda中也遇到了这个错误。上述方法对我不起作用。我必须在 lambda 中使用不带双引号的 env 变量,并且 而不是新行,并且在代码中我必须替换 经过 ,像这样:
process.env.MY_PRIVATE_KEY.replace(/\\n/g, '\n')
您可以在此处验证您的证书:https://www.sslchecker.com/certdecoder。
就我而言,我粘贴错误,漏掉了一个破折号:
- -----BEGIN CERTIFICATE-----
+ ----BEGIN CERTIFICATE-----
请注意前五个破折号至关重要。
如果您不想粘贴到未知站点,您可以尝试以下命令,感谢@Adrian Gonzalez:
openssl x509 -in <cert-name>.pem -noout -text
如果使用docker,我有一些观察。
.env
值设置为纯文本。不是字符串文字。'\\n'
替换为 '\n'
如果您在 Angular CLI 中遇到此问题,请确保您的 ssl 密钥路径有效。
运行时遇到同样的问题:
ng serve --ssl true --ssl-cert ./ssl/server.crt --ssl-key ./ssl/server.key
结果我的路径无效。
我通过运行以下代码行解决了这个问题。这可以在任何地方运行,以便将正常的
\n
转换为实际的换行符'
'
jWtstring = 'your_JWT_string'
jWtstring.replace(/\\n/g, '\n')
获得新输入的 JWT 密钥后,您可以将其粘贴到 SSM 或根据需要执行后续步骤。
尝试从 -->
删除 .nprmC:\Users{用户名}
然后就可以正常工作了
对于 Angular 版本 14.2.8 使用以下命令。
ng服务--ssl“您的项目名称”--ssl-key“密钥路径”--ssl-cert“您的证书路径”
示例:-如果您的密钥和证书位于同一驱动器上 C://your_key 或 C://your_certificate
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/
你必须使用
const key = new NodeRSA({ b: 512 });
let keypair = {
private: key.exportKey(),
public: key.exportKey("public")
};
使用 RSA 签署令牌时的私钥
就我而言,事实证明,pem 具有
-----BEGIN TRUSTED CERTIFICATE----
....
-----END TRUSTED CERTIFICATE-----
但这确实有效:
-----BEGIN CERTIFICATE----
....
-----END CERTIFICATE-----
要“修复”标题,您可以运行:
openssl x509 -in old.pem -out new.pem
如果您只是将其用作沙箱项目,您可以使用:(没有私钥)
var jwt = require('jsonwebtoken');
var token = jwt.sign({ foo: 'bar' }, 'shhhhh');
如果不是沙箱,你必须生成一个privteKey。
您可以在 jsonwebtoken 文档上看到它: https://www.npmjs.com/package/jsonwebtoken
我的 M1 Mac Pro 也遇到同样的问题。
通过以下方式解决了我的问题:
sudo find ~ -type f -name
'*npmrc' rm -rf /Users/<user>/.npmrc
npm cache verify
npm cache clear --force
npm install