TLS初探(5)TLS示例与证书互认证(Node.js)

(一)代码分析


本章旨在通过实际Node.JS代码进行之前所说的证书与TLS简单内容的确认,废话不多直接上代码,首先看服务器端代码:

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

const options = {
    key: fs.readFileSync('./certs/server.key'),
    cert: fs.readFileSync('./certs/server.crt'),
    ca: [fs.readFileSync('./certs/ca.crt')],
    requestCert: true,
    rejectUnauthorized: false
};

https.createServer(options, (req, resp) => {
   if(req.client.authorized) {
       console.log('Authorized Client:', req.client.getPeerCertificate().subject.CN);
       resp.writeHead(200, {'Content-Type':'text/plain'});
       resp.end('Hello world')
   } else {
       console.log('Denied Client:', req.client.getPeerCertificate().subject.CN);
       resp.writeHead(401, {'Content-Type':'text/plain'});
       resp.end('Denied')
   }
}).listen(8888);

       有了之前证书的基础,代码相对比较好理解,服务器端首先指定的自身的证书和私钥文件(cert&key),同时,也将签发的CA证书一并包含,CA证书的主要目的有两个:

    1. 在TLS协商下发证书时,连同CA证书一并下发,从而保证证书链,在本例中其实不必下发,因为需要在客户端实现配置好该CA证书,而且该CA证书就是根证书,不会存在客户端无法找到完整的证书链的情况;

    2. 本例中使用了requestCert,要求客户端也上传证书,从而进行双向认证,此时CA证书将用来验证客户端证书的有效性。

       后面就比较容易理解了,认证成功或失败都会输出相应的日志,并且答应出客户端证书中的Common Name,一般是客户端用户名。

       接下来看一下客户端代码:

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

const options = {
    host: 'www.example.com',
    port: 8888,
    path: '/',
    method: 'GET',
    key: fs.readFileSync('./certs/client.key'),
    cert: fs.readFileSync('./certs/client.crt'),
    rejectUnauthorized: true,
    ca: [fs.readFileSync('./certs/ca.crt')],
    agent: false
};

const req = https.request(options, resp => console.log('server authorization status:' + resp.connection.authorized));

req.end();
req.on('error', error => console.log(error));

      客户端同样设置了使用CA证书签发的客户端证书与私钥(cert&key),并且设置了CA证书来校验服务器端的证书。 如果证书配置正确,将会有如下输出,显示服务器端认证通过用户的证书,客户端认证服务器也成功。


(二)抓包分析

      下图中可以看出,服务器端给客户端下发了证书,同时客户端也给服务器端上传了自身证书:

      分析服务下发包内容可以发现,首先包含了两个证书,和之前说的一样,服务器将配置的CA证书也一并下发,顺序是先放服务器证书,在依照证书链的顺序一次放置后续的CA证书

       其次,服务器端也发送了Certificate Request,并指示需要客户端上传CA证书所签发的客户端证书,从而进行双向认证:


       有关证书的验证与配置就到这儿,其实在实际使用过程中,一般很少在服务器中直接配置TLS链接,在真实部署时一般情况下都会使用HTTP代理服务器(Nginx等)作为入口,并不会将实际服务器映射到公网地址并暴露出去;而一般都在代理服务器和客户端之前配置HTTPS链接,而代理服务器与后台服务器一般处于同一私网内,不会再配置TLS链路。

        后面有时间将会研究并介绍一下Nginx配置和客户端间的TLS配置,并且该场景下双向认证如何实现的问题。

发布了42 篇原创文章 · 获赞 9 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/jjxojm/article/details/81369406
TLS
今日推荐