节点TLS错误:使用Axios发出请求时可能太弱



当我在节点获取错误时与Axios发出请求时遇到问题:ca md太弱。

我正在发送。pfx文件和pfx证书文件的密码。我可以使用Postman轻松访问API并发送pfx证书和密码,但在node js (v. 18.0)中使用Axios发出请求,我得到错误:ca md太弱。

我不想降级Node版本并使用:process.env。Node_tls_reject_unauthorized = 0;也没用

也连接到服务器,我必须使用VPN,这个错误弹出,即使我没有打开VPN。

是否有可能绕过这个检查,这样我就可以像在Postman中那样发送请求?

下面是一个代码示例:
agent = new https.Agent({
pfx: fs.readFileSync((process.cwd() + "\src\sources\KIISWSClient.pfx")),
passphrase: 'password',
rejectUnauthorized: false,
});
userKiisData = axios.post('https://ws-kiis.hlk.hr/AdeoMembersPublicService.svc/WSPublic/BasicData', {
Username: "myusername",
Role: "role"
}, {
auth: {
username: "user",
password: "mypassword"
},
httpsAgent: agent
}
return userKiisData

错误如下:

Error: ca md too weak
at configSecureContext (node:internal/tls/secure-context:278:15)
at Object.createSecureContext (node:_tls_common:113:3)
at Object.connect (node:_tls_wrap:1622:48)
at Agent.createConnection (node:https:142:22)
at Agent.createSocket (node:_http_agent:343:26)
at Agent.addRequest (node:_http_agent:294:10)
at new ClientRequest (node:_http_client:311:16)
at Object.request (node:https:352:10)

TLDR:跳转到结尾如果你不关心理解

rejectUnauthorized指示nodejs接受(一些)服务器使用的无效证书而不是终止连接,但此错误发生在您自己的客户端证书/链上,而不是服务器的。(这就是为什么即使没有实际连接所需的VPN,它也可以发生。)"CA_MD_TOO_WEAK"检查发生在OpenSSL的现代版本(1.1.0以上),但可以根据OpenSSL的构建方式而变化,因此对于nodejs来说,它还取决于您的nodejs是构建使用自己的嵌入式OpenSSL(通常在Windows上)还是已经在安装它的系统上提供的OpenSSL(通常在Linux上)。

您可以使用openssl查看证书链中使用的签名算法,如果您在这台机器上有(或获得)它,或者您(可能,可以,并且确实)将pfx复制到相同的机器上。第一次做

openssl pkcs12 -in yourpfxfile -nokeys >temp0

,看temp0;它应该包含一个或多个块,每个块由一个subject=行、一个issuer=行、一个-----BEGIN CERTIFICATE-----行、几个base64行和一个-----END CERTIFICATE-----行组成。(可能也有Bag Attributes:行可选地后跟缩进行;忽略这些。)

如果只有一个块,并且subjectissuer的值相同,那么你的错误应该不会发生,因为证书是自签名的,OpenSSL不应该检查自签名证书的签名强度。

openssl x509 -in temp0 -noout -text -certopt no_pubkey,no_sigdump,no_extensions

,您应该得到几行输出,其中包括signatureAlgorithm: x,其中x的形式为{hash}withRSAEncryption ecdsa_with_{hash} dsa-with-{hash} or dsaWith{hash}。如果{hash}是MD5,你的证书上的签名是弱的,不能提供它声称的安全性——尽管在你的情况下,如果服务器不顾这个弱点接受它,这可能不是你的问题。

如果第一个(叶子)证书不是自签名的(subjectissuer不一样)并且它的签名算法不使用MD5,

  1. 你的nodejs使用的OpenSSL被设置为高于通常的"安全级别"——这对于嵌入OpenSSL的nodejs来说不太可能,但对于系统提供的nodejs来说更合理,特别是在像RedHat 8这样的安全重点系统上;或者

  2. 问题是与第一个证书(即CA证书)以外的证书有关,但如果您的证书来自正常运行的CA,则不应该发生这种情况,因为这样的CA不应该使用比叶子证书更弱的密钥签名算法签名的更高的CA证书,除了自签名根,其签名无关紧要,并且没有被检查,因此不会导致您的错误。但是,如果您愿意,可以将除第一个块以外的每个块分解为一个单独的文件,并在除之外的每个上重复上述openssl x509过程,如果最后一个块具有subjectissuer相同,则不要检查它,因为它是自签名根证书。

,处理:ciphers: "DEFAULT:@SECLEVEL=0"添加到https-Agent选项中。这将关闭几个检查,这些检查旨在防止不安全的SSL/TLS连接,包括此处相关的检查;因此,如果您使用此代码来处理任何重要的数据,则根据服务器的操作,它可能面临更高的风险。

相关内容

最新更新