Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 节点TLS套接字:深度\u零\u自签名\u证书错误_Node.js_Ssl_Openssl_Certificate_Tls1.2 - Fatal编程技术网

Node.js 节点TLS套接字:深度\u零\u自签名\u证书错误

Node.js 节点TLS套接字:深度\u零\u自签名\u证书错误,node.js,ssl,openssl,certificate,tls1.2,Node.js,Ssl,Openssl,Certificate,Tls1.2,我正在尝试在节点中使用TLS设置服务器和一些客户端。我正在客户端和服务器上使用自签名证书。服务器运行正常,但当我尝试连接客户端时,客户端出现以下错误: Error: DEPTH_ZERO_SELF_SIGNED_CERT 证书生成 核证机关证书: 服务器证书: 客户证书: 客户机的证书是在bash循环中创建的,变量${name}包含客户机的名称并更改每次迭代 openssl ecparam -name secp521r1 -genkey -noout -out ./tls/certs/

我正在尝试在节点中使用TLS设置服务器和一些客户端。我正在客户端和服务器上使用自签名证书。服务器运行正常,但当我尝试连接客户端时,客户端出现以下错误:

Error: DEPTH_ZERO_SELF_SIGNED_CERT
证书生成

核证机关证书:

服务器证书:

客户证书:

客户机的证书是在bash循环中创建的,变量
${name}
包含客户机的名称并更改每次迭代

    openssl ecparam -name secp521r1 -genkey -noout -out ./tls/certs/clients/${name}/client.key
    openssl req -config ./openssl/oid_file -new -key ./tls/certs/clients/${name}/client.key -out ./tls/certs/clients/${name}/client.csr
    openssl x509 -passin file:./tls/passphrase.txt -req -days 365 -in ./tls/certs/clients/${name}/client.csr -CA ./tls/certs/ca/ca.crt -CAkey ./tls/certs/ca/ca.key -CAcreateserial -out ./tls/client.crt
    mv ./tls/client.crt ./tls/certs/clients/${name}/
我还试图通过使用短暂的Diffie-Hellman交换来使用完美的前向保密。客户端和服务器的参数创建为
openssl dhparam-outform PEM-out./tls/params/servers/server/dhparams.PEM 2048

服务器代码:

return new Promise(resolve => {
            // Define parameters of TLS socket
            const options = {
                rejectUnauthorized: false,  
                requestCert: true,
                // Secure Context Parameters
                ca: [fs.readFileSync("tls/certs/ca/ca.crt")], 
                cert: fs.readFileSync("tls/certs/servers/server.crt"),
                key: fs.readFileSync("tls/certs/servers/server.key"),
                ciphers: "ECDHE-ECDSA-AES128-GCM-SHA256:!RC4:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!SRP:!CAMELLIA",
                dhparam: fs.readFileSync("tls/params/servers/server/dhparams.pem"),
                ecdhCurve: tls.DEFAULT_ECDH_CURVE,
                minVersion: "TLSv1.2"
            };
            // Iniciar servidor TLS
            this.SERVIDOR = tls.createServer(options, function (socket) {
                console.log("Server created."); 
            });

            this.SERVIDOR.listen(this.puerto, this.direccion, function () {
                console.log("Listening");
            });

            this.SERVIDOR.on("secureConnection", (socket) => this.handleRequest(socket));

            this.SERVIDOR.on("tlsClientError", (error) => console.log("Error client TLs. %s", error));
        });
return new Promise(resolve => {
            // Define parameters of TLS socket
            const options = {
                host: this.NODE,
                port: this.NODE_PORT,
                rejectUnauthorized: false,
                secureContext: tls.createSecureContext({
                    ca: [fs.readFileSync("tls/certs/ca/ca.crt")],
                    cert: fs.readFileSync("tls/certs/clients/" + this.NAME + "/client.crt"),
                    key: fs.readFileSync("tls/certs/clients/" + this.NAME + "/client.key"),
                    ciphers: "ECDHE-ECDSA-AES128-GCM-SHA256:!RC4:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!SRP:!CAMELLIA",
                    dhparam: fs.readFileSync("tls/params/clients/" + this.NAME + "/dhparams.pem"),
                    ecdhCurve: tls.DEFAULT_ECDH_CURVE, 
                    minVersion: "TLSv1.2"
                })
            };
            // Initialize TLS socket
            this.WEB_SOCKET = tls.connect(options, function () {
                // Check if TLS auth worked
                if (this.authorized) {
                    console.log("Connection authorized by a Cert. Authority ");
                } else {
                    console.log("Authorization not granted. Error: " + this.authorizationError);
                }
            });
客户代码:

return new Promise(resolve => {
            // Define parameters of TLS socket
            const options = {
                rejectUnauthorized: false,  
                requestCert: true,
                // Secure Context Parameters
                ca: [fs.readFileSync("tls/certs/ca/ca.crt")], 
                cert: fs.readFileSync("tls/certs/servers/server.crt"),
                key: fs.readFileSync("tls/certs/servers/server.key"),
                ciphers: "ECDHE-ECDSA-AES128-GCM-SHA256:!RC4:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!SRP:!CAMELLIA",
                dhparam: fs.readFileSync("tls/params/servers/server/dhparams.pem"),
                ecdhCurve: tls.DEFAULT_ECDH_CURVE,
                minVersion: "TLSv1.2"
            };
            // Iniciar servidor TLS
            this.SERVIDOR = tls.createServer(options, function (socket) {
                console.log("Server created."); 
            });

            this.SERVIDOR.listen(this.puerto, this.direccion, function () {
                console.log("Listening");
            });

            this.SERVIDOR.on("secureConnection", (socket) => this.handleRequest(socket));

            this.SERVIDOR.on("tlsClientError", (error) => console.log("Error client TLs. %s", error));
        });
return new Promise(resolve => {
            // Define parameters of TLS socket
            const options = {
                host: this.NODE,
                port: this.NODE_PORT,
                rejectUnauthorized: false,
                secureContext: tls.createSecureContext({
                    ca: [fs.readFileSync("tls/certs/ca/ca.crt")],
                    cert: fs.readFileSync("tls/certs/clients/" + this.NAME + "/client.crt"),
                    key: fs.readFileSync("tls/certs/clients/" + this.NAME + "/client.key"),
                    ciphers: "ECDHE-ECDSA-AES128-GCM-SHA256:!RC4:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!SRP:!CAMELLIA",
                    dhparam: fs.readFileSync("tls/params/clients/" + this.NAME + "/dhparams.pem"),
                    ecdhCurve: tls.DEFAULT_ECDH_CURVE, 
                    minVersion: "TLSv1.2"
                })
            };
            // Initialize TLS socket
            this.WEB_SOCKET = tls.connect(options, function () {
                // Check if TLS auth worked
                if (this.authorized) {
                    console.log("Connection authorized by a Cert. Authority ");
                } else {
                    console.log("Authorization not granted. Error: " + this.authorizationError);
                }
            });
我尝试过的:

return new Promise(resolve => {
            // Define parameters of TLS socket
            const options = {
                rejectUnauthorized: false,  
                requestCert: true,
                // Secure Context Parameters
                ca: [fs.readFileSync("tls/certs/ca/ca.crt")], 
                cert: fs.readFileSync("tls/certs/servers/server.crt"),
                key: fs.readFileSync("tls/certs/servers/server.key"),
                ciphers: "ECDHE-ECDSA-AES128-GCM-SHA256:!RC4:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!SRP:!CAMELLIA",
                dhparam: fs.readFileSync("tls/params/servers/server/dhparams.pem"),
                ecdhCurve: tls.DEFAULT_ECDH_CURVE,
                minVersion: "TLSv1.2"
            };
            // Iniciar servidor TLS
            this.SERVIDOR = tls.createServer(options, function (socket) {
                console.log("Server created."); 
            });

            this.SERVIDOR.listen(this.puerto, this.direccion, function () {
                console.log("Listening");
            });

            this.SERVIDOR.on("secureConnection", (socket) => this.handleRequest(socket));

            this.SERVIDOR.on("tlsClientError", (error) => console.log("Error client TLs. %s", error));
        });
return new Promise(resolve => {
            // Define parameters of TLS socket
            const options = {
                host: this.NODE,
                port: this.NODE_PORT,
                rejectUnauthorized: false,
                secureContext: tls.createSecureContext({
                    ca: [fs.readFileSync("tls/certs/ca/ca.crt")],
                    cert: fs.readFileSync("tls/certs/clients/" + this.NAME + "/client.crt"),
                    key: fs.readFileSync("tls/certs/clients/" + this.NAME + "/client.key"),
                    ciphers: "ECDHE-ECDSA-AES128-GCM-SHA256:!RC4:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!SRP:!CAMELLIA",
                    dhparam: fs.readFileSync("tls/params/clients/" + this.NAME + "/dhparams.pem"),
                    ecdhCurve: tls.DEFAULT_ECDH_CURVE, 
                    minVersion: "TLSv1.2"
                })
            };
            // Initialize TLS socket
            this.WEB_SOCKET = tls.connect(options, function () {
                // Check if TLS auth worked
                if (this.authorized) {
                    console.log("Connection authorized by a Cert. Authority ");
                } else {
                    console.log("Authorization not granted. Error: " + this.authorizationError);
                }
            });
  • 将rejectUnauthorized设置为
    false
  • 尝试使用
    节点\u TLS\u REJECT\u UNAUTHORIZED=“0”运行代码。它不起作用,我认为这不是一个好的生产选择
  • 检查了类似的问题,看起来和我的问题很相似。但投票最多的答案是2014年的,我在网上找不到太多关于知名度的信息
  • 我使用
    opensslx509-in*.cert-text
    检查了证书,它们看起来不错
我是否错误地生成了证书?感谢您的帮助。 谢谢

编辑。2019年10月16日
代码中有问题,我没有使用
resolve()当插座打开时。同样的问题仍然存在但是尽管客户端上出现授权错误,服务器仍会触发“secureConnection”事件并交换消息。这有意义吗*是的,这是有意义的,因为服务器接受未经授权的连接。如果我将服务器设置为拒绝未经认证的连接,客户端将挂起*

问题是我对所有证书使用了相同的配置文件(./openssl/oid_文件)。使用不同的配置文件和不同的备选名称解决了此问题

我以“无法验证叶子签名”错误结束。证书已正确生成,但不起作用。我在nodejs中找不到自签名证书的工作示例。他们中的大多数人只是通过禁用SSL或接受未加密的事务来反对证书的使用,这与TLS应该做的相反

最后,我使用此工具生成证书:。在测试环境中生成自签名证书的最佳且最简单的方法。您只需将节点变量node_EXTRA_CA_CERTS设置为指向根证书:

process.env.NODE_EXTRA_CA_CERTS = [os.homedir() + "/.local/share/mkcert/rootCA.pem"];

-

与您的Q无关,但您的dhparams是无用的。您只启用一个(TLS1.2)密码套件,它不使用DHE;它确实使用ecdhCurve,但将其设置为默认值与未设置相同。即使您启用了其他密码套件,也没有使用带有EC证书(和静态密钥)的DHE的密码套件。对于TLS1.3,如果您的系统(所有)支持它,则可以将DHE与EC证书一起使用,但只能与标准组一起使用,而不能与您生成的组一起使用。任何TLS客户端(任何版本)都不会使用自己的临时参数。@dave_thompson_085非常感谢您提供的信息。我不知道。我会做出改变的。任何关于在哪里阅读这些问题的指针或建议。我发现openssl官方文档有时有点含糊不清。@dave_thompson_085关于您评论的这一部分,“没有任何TLS客户端(任何版本)使用自己的临时参数。”。我理解我不应该提供dhparams属性。但在关于TLS包的nodejs官方文档中,他们声明如下:“要在tls模块中使用DHE使用完美的前向保密性,需要生成Diffie Hellman参数,并使用tls.createSecureContext()的dhparam选项指定它们。以下说明了如何使用OpenSSL命令行界面生成此类参数。。。“。我应该提供我自己的eph吗。是否使用参数?如果使用DHE(您不是),而不是TLS1.3,则您确实需要在服务器上配置dhparam,但不需要在客户端上配置;他们的医生对此并不清楚。从技术上讲,您不需要生成自己的参数,您可以使用来自另一个可靠来源的参数——但在实践中,评估这样的来源通常比生成新参数更困难。在不需要它们的地方提供它们并没有坏处,就像客户一样,只是没有好处。。。。。。当我在做这件事的时候,最后一段(v11-up)也是错的;它说“所有TLSv1.3套件都使用ECDHE”。1.3版本的First-in-keyexchange不再在套件中;第二个也是更具实质性的1.3放弃了以前的静态RSA keyexechange并强制PFS,但对于新的/非重复会话,它使用ECHDE或DHE(后者使用标准化组,而不是自定义组,因此不需要配置)。