【发布时间】:2018-05-15 02:36:09
【问题描述】:
我有一个简单的链设置,在这种情况下可以成功验证:
$ openssl version
OpenSSL 1.0.2m 2 Nov 2017
$ openssl verify -CAfile chain.pem cert.pem
cert.pem: OK
但是在这些情况下我会收到错误:
$ openssl verify -CAfile ca-cert.pem cert.pem
cert.pem: C = US...
error 2 at 1 depth lookup:unable to get issuer certificate
特别是无法获得颁发者证书。
也可以在这里获取:
$ openssl verify chain.pem
chain.pem: C = US...
error 20 at 0 depth lookup:unable to get local issuer certificate
$ openssl verify cert.pem
cert.pem: C...
error 20 at 0 depth lookup:unable to get local issuer certificate
最后,当我将密钥传递给 HTTPS 服务器时,我在 Node.js 中得到它:
events.js:193
throw er; // Unhandled 'error' event
^
Error: unable to get local issuer certificate
at TLSSocket.onConnectSecure (_tls_wrap.js:1036:34)
at emitNone (events.js:115:13)
at TLSSocket.emit (events.js:218:7)
at TLSSocket._finishInit (_tls_wrap.js:637:8)
我尝试使用{ key, cert, ca } 传递它,但仍然是同样的错误。
想知道如何进行调试或解决什么问题才能让 HTTPS 服务器运行。
如果我使用pfx 文件,我会得到以下信息:
events.js:193
throw er; // Unhandled 'error' event
^
Error: self signed certificate in certificate chain
at TLSSocket.onConnectSecure (_tls_wrap.js:1036:34)
at emitNone (events.js:115:13)
at TLSSocket.emit (events.js:218:7)
at TLSSocket._finishInit (_tls_wrap.js:637:8)
如果我在 cert 文件中只保留 cert.pem,并将 ca 属性设为 ca-cert.pem,它会给出:
Error: unable to verify the first certificate
at TLSSocket.<anonymous> (_tls_wrap.js:1108:38)
at emitNone (events.js:105:13)
at TLSSocket.emit (events.js:207:7)
at TLSSocket._finishInit (_tls_wrap.js:638:8)
at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:468:38)
不知道该怎么办。
Here 他们说:
OpenSSL 无法找到用于验证签名的颁发者(或在 TLS 握手期间从 Web 服务器接收的链中第一个证书的颁发者)的本地证书。
不知道这是什么意思。
此错误表示证书路径或链已损坏,并且您缺少证书文件。
- https://wiki.zimbra.com/wiki/Fix_depth_lookup:unable_to_get_issuer_certificate
更新
更多帮助:
此问题通常由日志消息指示,例如“无法获取本地颁发者证书”或“自签名证书”。当证书被验证时,它的根 CA 必须被 OpenSSL “信任”,这通常意味着 CA 证书必须放在一个目录或文件中,并且相关程序配置为读取它。 OpenSSL 程序“验证”以类似的方式运行并发出类似的错误消息:查看 verify(1) 程序手册页以获取更多信息。
但仍然没有太大帮助。
看起来 Node.js 使用的是 1.0.2l 而不是 1.0.2m,但似乎没什么大不了的。
$ node -pe process.versions | grep openssl
openssl: '1.0.2l'
更新 2
奇怪,当我从 Node.js 发出请求时,我得到了这个:
Uncaught Error: unable to verify the first certificate
at TLSSocket.onConnectSecure (_tls_wrap.js:1036:34)
at TLSSocket._finishInit (_tls_wrap.js:637:8)
但是当我去浏览器时,我没有看到“谨慎操作”页面,并且可以在 Node.js 中成功记录一个请求。也许这有点帮助。请帮忙:D
【问题讨论】:
-
明确一点:
cert.pem和ca-cert.pem之间有一个中间 CA?而这个中间 CA 在chain.cert旁边是ca-cert.pem? -
ca-cert.pem 上面有一个顶级的自签名证书,所以是的。
-
回复:“我尝试使用
{ key, cert, ca }传递它,但仍然...”,尝试将cert和ca替换为您的chain.pem的内容的单个参数(即cert.pem的内容的串联,后跟ca-cert.pem)。这假定服务器正在使用高于ca-cert.pem的根 CA,因为它是受信任的 CA。 -
更新了问题。奇怪的是,我现在可以在从浏览器访问时让它工作,但不能从 Node.js 访问。
标签: node.js openssl certificate x509certificate