nodejs学习笔记4

用户数据报

构建数据报服务器:

var dgram = require('dgram');
var server = dgram.createSocket('udp4');//或者传udp6

监听消息:

server.on('message',function(message){
    console.log('server got message:'+message);
})

绑定到一个特定的UDP端口:

var port = 4000;
server.on('listening',function(){
    var address = server.address();
    console.log('peer listening on'+address.address+":"+address.port);
});
server.bind(port);

查看附加的消息信息:除了发送消息本身外,message事件还会将远程发送端的一些信息传入回调函数,作为其第二个参数。

server.on('message',function(message,rinfo){
    console.log('server got message:%s from %s:%d',message,rinfo.address,rinfo.port);
    //将消息发回发送端
    server.send(message,0,message.length,rinfo.port,rinfo.address);
});

构建数据报客户端

var dgram = require('dgram');
var client = dgram.createSocket('dup4');
client.bind(4001);
var message = new Buffer('this is a message');
client.send(message,0,messge.length,4000,'localhost',function(err,bytes){
    if(err){throw err;}
    console.log('has send'+bytes+'byte');
    client.close();//关闭套接字
});

接收多播消息:要连接像230.1.2.3这样的多播地址

var server = require('dgram').createSocket('udp4');
server.on('message',function(message,rinfo){
    console.log('server got message:%s from %s:%d',message,rinfo.address,rinfo.port);
});
server.bind(4000);
server.addMembership('230,1.2.3');

发送多播消息:

client.bind(4000);
//设置多播存活时间为10,数据报每经过一次路由器,存活计数器减一
client.setMulticastTTL(10);
client.send(message,0,message.length,4000,'230,1.2.3');
client.close();

TLS/SSL保证服务器的安全性

Node中的TLS是基于openSSL库实现的。TLS依赖于公钥/私钥结构,每个客户端和服务器都必须有一个私钥对消息签名。openssl可以在命令行上创建私钥

$ openssl genrsa -out my_key.pem 1024

服务器和客户端在彼此验证时必须具有一个证书,证书是由认证中心签名或者自签名的公钥。获取证书的第一步是创建一个证书签发请求(Certificate Signing Request CSR)文件:

$ openssl req -new -key my_key.pem -out my_csr.pem

上述命令创建了一个自签名的csr文件my_csr.pem。可以使用csr文件创建自签名的证书:

$ openssl x509 -req -in my_csr.pem -signkey my_key.pem -out my_cert.pem

另一种方法是将CSR文件发送到认证中心进行签名。

构建TLS服务器

TLS服务器是net.Server的子集。
初始化服务器:

var tls = require('tls');
var fs = require('fs');
var serverOptions= {
    key:fs.readFileSync('./my_key.pem'),
    cert:fs.readFileSync('./my_cert.pem');
};
var server = tls.createServer(serverOptions);

除了key和cert选项外,tls.createServer还支持一下选项:
requestCert:如果为true,服务器就会请求连接到其上的客户端的证书,并且会尝试对该证书进行验证,默认值是false。
rejectUnauthorized:如果为true,服务器会使用一个认证中心的列表来拒绝任何未经授权的连接。默认为false.只用在requestCert为true时起作用。

监听连接:当有客户端连接时,服务器会发送secureConnection事件,并将tls.ClearTextStream类的实例传入回调函数。该实例与net.Socket对象很相似,实现了一个双向流接口。

server.listen(4001);
function connectionListener(clientStream){
    clientStream.on('data'function(data){
        console.log('got some data from client',data);
    });
    clientStream.write('hello\n');//发送数据
    clientStream.end('bye bye');//终止连接
}
server.on('secureConnection',connectionListener);

构建TLS客户端

//初始化客户端
var fs = require('fs');
var tls = require('tls');
var options = {
    key:fs.readFileSync('./my_key.pem'),
    cert:fs.readFileSync('./my_cert.pem');
};
var client = tls.connect(4001,localhost,options,function(){
    console.log('connected');
});

验证服务器证书:服务器发送它的身份信息,而TLS客户端验证身份信息的签名,如果证书得到认可,ClearTextStream实例(将其值赋给client变量)会将authorized设置成true,否则为false且抛出错误的原因authorizationError。

var client = tls.connect(port,host,options,function(){
    if(!client.authorized){
        console.log('client denied access:',client.authorizationError);
    }else{
        client.write('hello server');//发送数据
    }
    //从服务器读取数据
    client.on('data',function(data){
        console.log('got some data form server',data);
    });
    //终止连接
    client.end('bye bye');
});

TLS聊天服务器:(要先生成密钥和证书)


var tls = require('tls');
var fs = require('fs');
var port = 4001;

var clients = [];

var serverOptions= {
    key:fs.readFileSync('server_key.pem'),
    cert:fs.readFileSync('server_cert.pem'),
    ca:{fs.readFileSync('fake_cs.pem')},//改写服务器上的认证中心选项
    requestCert:true    //验证客户端连接
};
function distribute(from,data){
    var socket = from.socket;
    clients.forEach(function(client){
        if(client !== from){
            client.write(socket.remoteAddress+':'+socket.remotePort+' said:'+data);

        }
    });
}
var server = tls.createServer(serverOptions,function(client){
    clients.push(client);
    client.on('data',function(data){
        distribute(client,data);
    });
    client.on('close',function(){
        console.log('closed connection');
        clients.splice(clients.indexOf(client),1);
    });
});
server.listen(port,function(){
    console.log('listening on port',server.address().port);
})

TLS聊天客户端:

var tls = require('tls');
var fs = require('fs');
var port = 4001;
var host = 'localhost';
var options= {
    key:fs.readFileSync('client_key.pem'),
    cert:fs.readFileSync('client_cert.pem');
};
process.stdin.resume();
var client = tls.connect(port,host,options,function(){
    console.log('connected');
    process.stdin.pipe(client,{end:false});
    client.pipe(process.stdout);
});
//openssl genrsa -out client_key.pem 1024
//openssl req -new -key client_key.pem -out client_csr.pem
// openssl x509 -req -in client_csr.pem -signkey client_key.pem -out client_cert.pem

HTTPS

HTTPS node核心模块扩展了http模块,并将tls模块作为传输机制。它用实例化TLS连接来代替实例化普通的TCP连接。

创建服务器:

var fs = require('fs');
var https = require('https');
var options = {
    key:fs.readFileSync('server_key.pem'),
    cert:fs.readFileSync("server_cert.pem")
};
var server = https.createServer(options,function(req,res){
    res.writeHead(200,{'Content-Type:'text/plain'});
    res.end('hello world');
});
var port = 4001;
server.listen(port);
//server.listen(port,address);也可以指定要监听的地址,也可以再传入一个回调函数

验证HTTPS客户端证书:

var options{
    ...
    requestCert:true,//要求客户端发送证书
    rejectUnauthroized:true //拒绝未通过认证中心链验证的证书
};
var server = https.createServer(options,function(req,res){
    console.log('是否通过验证:'+req.socket.authorized);
    console.log('客户端证书:',req.socket.getPeerCerttificate());
});

创建HTTPS客户端

var fs = require('fs');
var https = require('https');
var options = {
    host:'0.0.0.0',
    port:4001,
    method:'GET',
    path:'/',
};
var request = https.request(options,function(response){
    console.log('response.statusCode:',response.statusCode);
    response.on('data',function(data){
        console.log('got some data back form server:',data);
    });
});
request.write('hey');
request.end();

验证HTTPS服务器证书:当获得response对象后,就可调用response对象的stream对象(一个TLS流)的getPeerCertificate函数来获取服务器证书:

var request = https.request(options,function(response){
    console.log('是否通过验证:',response.socket.authorized);
    console.log('peer certificate:',res.socket.getPeerCertificate());
});
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值