一、介绍Http与Https
概念
- HTTP: 超文本传输协议(Hypertext transfer protocol) 是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。
- HTTPS: 是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司进行,提供了身份验证与加密通讯方法,现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。
区别
- https协议需要到ca申请证书,一般免费证书很少,需要交费。
- http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
- http和https使用的是完全不同的连接方式,默认用的端口也不一样,前者是80,后者是443。
- http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
二、 构建Https服务器
新建工程
$ cd /home
$ express -e ExpressServer
$ cd ExpressServer
$ sudo npm install
生成证书文件
# 创建一个文件夹存放证书
$ mkdir cert
$ cd cert
#生成私钥key文件:
$ openssl genrsa -out privatekey.pem 1024
#通过私钥生成CSR证书签名
$ openssl req -new -key privatekey.pem -out certsign.csr
# 通过私钥和证书签名生成证书文件
$ openssl x509 -req -in certsign.csr -signkey privatekey.pem -out certificate.crt
生成了三个文件:
- privatekey.pem (私钥)
- certsign.csr (CSR证书签名)
- certificate.crt (证书文件)
Express服务端代码
var app = require('express')();
var fs = require('fs');
var http = require('http');
var https = require('https');
var httpServer = http.createServer(app);
var httpsServer = https.createServer({
key: fs.readFileSync('./cert/privatekey.pem', 'utf8'),
cert: fs.readFileSync('./cert/certificate.crt', 'utf8')
}, app);
var PORT = 80;
var SSLPORT = 443;
httpServer.listen(PORT, function() {
console.log('HTTP Server is running on: http://localhost:%s', PORT);
});
httpsServer.listen(SSLPORT, function() {
console.log('HTTPS Server is running on: https://localhost:%s', SSLPORT);
});
// 访问路径
app.get('/:name', function(req, res) {
if(req.protocol === 'https') {
res.send('https:' + req.params.name);
} else {
res.send('http:' + req.params.name);
}
});
启动服务器
$ node app.js
HTTP Server is running on: http://localhost:80
https Server is running on: https://localhost:443
由于我们证书是自己创建的,没有经过第三方机构的验证,因此会出现警告的提示。可以去有资质的网络运营商,去申请自己的证书。