当前位置: 首页 > 知识库问答 >
问题:

服务器端客户端证书验证,深度\u零\u自签名\u证书错误

穆俊名
2023-03-14

我正在使用节点0.10.26,并试图通过客户端验证建立https连接。

服务器代码:

var https = require('https');
var fs = require('fs');

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

var options = {
    key: fs.readFileSync('ssl/server1.key'),
    cert: fs.readFileSync('ssl/server1.pem'),
    requestCert: true,
    rejectUnauthorized: false,
};

var server = https.createServer(options, function (req, res) {
    if (req.client.authorized) {
        res.writeHead(200, {"Content-Type":"application/json"});
        res.end('{"status":"approved"}');
        console.log("Approved Client ", req.client.socket.remoteAddress);
    } else {
        console.log("res.connection.authroizationError:  " + res.connection.authorizationError);
        res.writeHead(403, {"Content-Type":"application/json"});
        res.end('{"status":"denied"}');
        console.log("Denied Client " , req.client.socket.remoteAddress);
    }
});

server.on('error', function(err) {
    console.log("server.error: "  + err);
});

server.on("listening", function () {
    console.log("Server listeining");
});

server.listen(5678);

客户代码:

var https = require('https');
var fs = require('fs');

var options = {
    host: 'localhost',
    port: 5678,
    method: 'GET',
    path: '/',
    headers: {},
    agent: false,
    key: fs.readFileSync('ssl/client2.key'),
    cert: fs.readFileSync('ssl/client2.pem'),
    ca: fs.readFileSync('ssl/ca.pem')
};

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

var req = https.request(options, function(res) {
    console.log(res.req.connection.authorizationError);
});

req.on("error", function (err) {
    console.log('error: ' + err);
});

req.end();

我使用以下命令创建了证书,每次都将“uname-n”的结果作为“Common Name”提供:

openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -key ca.key -days 999 -out ca.pem

openssl genrsa -out server1.key  1024
openssl req -new -key server1.key -out server1.csr
openssl x509 -req -days 999 -in server1.csr -CA ca.pem  -CAkey ca.key -set_serial 01 -out server1.pem

openssl genrsa  -out client1.key 1024
openssl req -new -key client1.key  -out client1.csr
openssl  x509  -req -days 999 -in client1.csr  -CA ca.pem  -CAkey ca.key  -set_serial 01     -out client1.pem

openssl genrsa  -out server2.key 1024
openssl req -new -key server2.key  -out server2.csr
openssl  x509  -req -days 999 -in server2.csr -CA server1.pem -CAkey server1.key -     set_serial 02 -out server2.pem

openssl  genrsa -out client2.key 1024
openssl req -new -key client2.key -out client2.csr
openssl x509 -req -days 999 -in client2.csr -CA client1.pem -CAkey client1.key  -set_serial 02 -out client2.pem

我已经使用客户端和服务器证书的所有组合(即:[(server1,client1),(server1,client2),(server2,client1),(server2,client1),(server2,client2)]运行了客户端和服务器,并且对这些服务器的每种组合都进行了测试,默认值为“agent”字段,并且“agent”设置为“false”。

每次我运行客户端时。js,res.req。联系authorizationError被设置为深度0自签名证书。

如何使用客户端的证书身份验证在节点中建立安全连接?

共有3个答案

燕建中
2023-03-14

这个对我很有用:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

注意:发布答案,以便将来帮助他人。

鲁霄
2023-03-14

对于那些想要使用自签名证书的用户,答案是在https中添加rejectUnauthorized:false。请求选项。

喻昀
2023-03-14

我相信你有两个问题,一个是代码问题,一个是证书问题。

代码问题在您的服务器中。您没有指定CA来检查具有选项属性的客户端证书,就像您在客户端代码中所做的那样:

ca: fs.readFileSync('ssl/ca.pem'),

第二个问题是真正导致DEPTH_ZERO_SELF_SIGNED_CERT错误的问题。您正在为所有证书-CA、服务器和客户端-提供相同的可区分名称。当服务器从客户端证书中提取颁发者信息时,它会看到颁发者DN与客户端证书DN相同,并得出结论认为客户端证书是自签名的。

尝试重新生成证书,为每个证书提供一个唯一的通用名称(使DN也唯一)。例如,将您的CA证书命名为“Foo-CA”,将服务器证书命名为主机名称(本例中为“localhost”),将您的客户端命名为其他名称(例如“Foo-client 1”)。

 类似资料:
  • 我在使用模块urllib(Python 3.6)时遇到了问题。每次使用该模块时,我都会收到相当于一页的错误。 urllib有什么问题以及如何修复? 这段代码喜欢吐出一口东西: 好像模块本身出了问题。

  • 验证 SSH 服务器证书(客户端) 和 SSH 用户证书 类似,使用客户端机构认证来验证主机。需要一个 SSH 服务器数字证书认证机构签发服务器证书,客户端只需要保存 CA 的公钥。 使用一台处于气隙系统下的计算机来生成服务器数字证书认证机构的根证书: ❯ ssh-keygen -C "SSH Server Certificate Authority" -f sshserver.root.ca 使

  • 我正在练习'Web Scraping with Python'中的代码,我一直遇到这个证书问题: 错误是: 顺便说一句,我也在练习scrapy,但一直遇到问题:command not found:scrapy(我在网上尝试了各种解决方案,但都没有奏效……真令人沮丧)

  • 问题内容: 我正在连接到以前成功使用过的Web服务,但是现在他们已经更改了主机名并向我发送了两个.pem文件。一个是CA,另一个是我的新客户证书。 (我将Java 1.5,Spring + Spring Web Services与Apache httpclient一起使用,但是我怀疑我的问题是证书,密钥和SSL本身。) 我已经导入了.pem文件以及从Firefox导出到cacerts中的主机的.c

  • 执行简单代码后: 我有下一个错误: Traceback(最近一次调用最后一次):文件"F:\Run\Lpror\Phyton\lib\site-包\urllib3\connectionpool.py",第597行,在urlopenf中。_prepare_proxy(conn)文件"F:\Run\Lpror\Phyton\lib\site-包\urllib3\connectionpool.py",第