node.js中的“tlsv1 alert unknown ca”

时间:2014-12-25 15:06:05

标签: node.js openssl

在过去的5天里,我的应用日志中出现了很多奇怪的错误。这是堆栈跟踪:

Error: 140428615087936:error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca:../deps/openssl/openssl/ssl/s3_pkt.c:1234:SSL alert number 48 
  at CleartextStream._pusher (tls.js:674:24) 
  at SlabBuffer.use (tls.js:217:18) 
  at CleartextStream.CryptoStream._push (tls.js:501:33) 
  at SecurePair.cycle (tls.js:898:20) 
  at EncryptedStream.CryptoStream.write (tls.js:285:13) 
  at Socket.ondata (stream.js:38:26) 
  at Socket.EventEmitter.emit (events.js:96:17) 
  at TCP.onread (net.js:397:14)

所有这些错误都是一样的。 Node.js版本是0.8.24。 有谁知道为什么会发生这种情况?

1 个答案:

答案 0 :(得分:0)

我们已经解决了这个问题。之所以发生这种情况,是因为我们的其他API服务器上的SSL证书中存在轻微的错误配置(与node.js交谈)。

要检查您的SSL配置,您可以使用SSL实验室的one service。在我们的案例中有这个警告(链条问题不完整):

problem with SSL certificate chain

要解决此问题,您应该执行以下操作(摘自nginx docs):

  

有些浏览器可能会抱怨由知名人士签名的证书   证书颁发机构,而其他浏览器可以接受证书   没有问题。发生这种情况是因为签发机构签署了   使用不是的中间证书的服务器证书   出现在知名可信证书的证书基础上   与特定浏览器一起分发的权限。在这   在这种情况下,权威机构提供了一系列链式证书   应该连接到签名的服务器证书。服务器   证书必须出现在链接证书之前   合并文件:

$ cat www.example.com.crt bundle.crt > www.example.com.chained.crt
     

生成的文件应该在ssl_certificate指令中使用:

server {
    listen              443 ssl;
    server_name         www.example.com;
    ssl_certificate     www.example.com.chained.crt;
    ssl_certificate_key www.example.com.key;
    ...
}

关键部分是证书文件的连接。在我们进行了更改后,node.js应用程序中的错误消失了。