c语言实现tcp 服务器设计_Node.JS实战19:实现加密的tcp、https服务器

本文将使用Nodejs的TLS模块、用net.createServer()可法,创建一个加密通讯的TCP服务器(https服务器)

SSL证书

进行SSL通信,SSL公钥、私钥证书是必备的。

当前,免费ssl证书的获取方法已经很多,不过一般只能获取独立网站的证书。泛域名、多域名证书一般还是付费的。

如下例,网站从synmatec获取了免费证书。从域名的证书管理中下载它。

eddb0425daea3142919ef480f792d973.png

下载会得到两个文件,一个key、一个pem。

key文件是服务器私钥文件,pem文件是服务器证书key。

编程时,会用到这两个文件。

程序

服务器程序如下:

var tls = require('tls');var fs = require('fs');var options = {    key: fs.readFileSync('./jshaman.com.key'),    cert: fs.readFileSync('./jshaman.com.pem'),};var server = tls.createServer(options, function(cleartextStream){    console.log("connected")    cleartextStream.write("welcome");    cleartextStream.setEncoding("utf8");    cleartextStream.pipe(cleartextStream);});server.listen(8000,function(){    console.log("server listening");});

代码很简单,看过之前文章的话,应该对这类代码很熟悉。差异之处在于options,这个参数中包含了私钥和证书内容,在创建服务器时会将这个参数传入。

运行

用nodejs启动,即在本机8000端口建立监听。

用浏览器访问效果如下:

111ea3761a69c37e02a4453eddff7de4.png

注意:需要用https访问,不是http了。

本例中使用的是火狐,访问时有警告信息,因为证书并不是针对127.0.0.1的,属于证书不匹配警告。

选择接受风险就可以访问了:

7260a521a7462fa4f2d433b78570ccbb.png

SSL客户端

再进一步,写一个ssl客户端对上面的服务器进行访问。

代码如下:

var tls = require('tls');var fs = require('fs');var options = {    key: fs.readFileSync('./jshaman.com.key'),    cert: fs.readFileSync('./jshaman.com.pem'),    servername:"www.sharewaf.com"};var cleartextStream = tls.connect(8000,options, function(){    console.log("connected to server")    process.stdin.pipe(cleartextStream);});cleartextStream.setEncoding("utf8");cleartextStream.on("data",function(data){    console.log(data);});

代码解读:

客户端用tls.connect()方法去连接服务器。

参数options中除了包含刚才用到的key、pem文件内容,还加了一个参数:

servername,这个名称必须与服务器端的证书名称相对。

解释:

本文用的证书,是www.sharewaf.com这个网站的,所以key和pem文件中都是这个域名的信息。那么在这里,servername名称也必须用这个。否则连接会不成功。

执行效果:

4eff985081006ea44657d104b32ed7b3.png

如果把上面代码中域名改为www.123.com,运行效果将会是:

fff334fcc3bed4cdce31995abd35f498.png

https服务器

上面的例子中,是用tls创建了一个tcp加密服务器。

接下来,再讲一段,如何用https创建https服务器。

疑问:tcp加密服务器、https服务器,一回事吗?

这样理解:ssl加密通信服务器,可以有多种。比如可以是web服务器,也可能是邮件服务器。

且看代码:

var fs = require('fs');var https = require("https");var options = {    key: fs.readFileSync('./jshaman.com.key'),    cert: fs.readFileSync('./jshaman.com.pem'),};var server = https.createServer(options, function(req,res){    console.log("connected")    res.write("welcome");    res.end();});server.listen(8000,function(){    console.log("server listening");});

执行效果:

1ce363ea67f833c06e7a5874b8fe93ae.png

更多本系列文章:

Node.JS实战18:创建DNS请求、查询域名IP

Node.JS实战17:开发一个正向代理服务器

Node.js实战16:用http模块创建web服务器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值