4、HTTP和HTTPS的区别HTTPS服务器使用HTTPS协议,HTTP服务器使用HTTP协议。HTTPS服务器需要向证书颁发机构(CertificateAuthority)中心申请证书,一般免费证书需要付费。有些客户有要求在某些情况下,客户也需要使用证书。HTTP服务器在客户端之间传输明文数据,而HTTPS服务器在客户端之间传输经过SSL安全加密的密文数据。HTTP服务器通常使用80或8080端口,HTTPS服务器使用443端口。五、创建HTTPS服务器5.1先决条件——准备创建HTTPS服务器的公钥、私钥和证书。服务器首先需要创建公钥、私钥和证书来创建公钥。你可以使用openssl工具创建私钥opensslgenrsa-outprivatekey.pem1024创建证书签名请求(CertificateSigningRequest)文件opensslreq-new-keyprivatekey.pem-outcertreques.csr来获取证书,证书应该由证书颁发机构中心签署在这个证书文件中,Baolan包含服务器提供的公钥和证书的颁发机构等信息。建立的数字证书标准在客户端与服务器建立连接后,首先会确认证书的合法性。如果服务器中使用了学习或测试用的证书,使用浏览器访问服务器时,首先会在浏览器中出现警告。信息,警告用户该证书不是由证书颁发机构签署的证书。有了证书文件后,就可以使用证书文件创建pfx文件了。所谓pfx文件是指文件内容必须符合公钥加密技术12标准(PublicKeyCryptographyStandards#12,PKCS#12)规定了存储和传输用户或服务器私钥的格式,公开钥匙和证书。+。在openssl工具中,可以在这些文件中创建一个pfx文件opensslpkcs12-export-incertificate.pem-inkeyprivatekey.pem-outcertificate.pfx所有组件都准备好后,就可以使用HTTPS模块中的createServer方法创建HTTPS服务器HTTPS.createServer(options,[requestListener(request,response)])5.2开始创建HTTPS服务器HTTPS.createServer(options)options是一个对象,使用属性和属性值如下pfx:属性值是一个字符串或Buffer对象,用于指定从pfx文件中读取的私钥、公钥、证书。要使用此属性值,您不需要指定键属性值。cert属性值和ca属性值.key:属性值是字符串或Buffer对象,用于指定从后缀为pem的私钥文件中读取的私钥。属性值必须指定属性值。除非指定pfx属性值passphrase:属性值为self-ship,用于指定私钥文件或pfx文件的密码cert:属性值为字符串或Buffer对象,用于指定slave文件带有后缀pem的公钥来自阅读材料,必须指定属性值,除非指定了pfx属性值ca:属性值是一个字符串或一个Buffer对象数组,用于指定一组证书,default属性值是几个知名的Certificateauthority认证中心,比如VerlSigncrl:属性值是字符串或者Buffer对象数组,用于指定证书吊销列表ciphers:属性值是字符串值,其中用于描述需要使用或取消的密码。攻击,recommendedrewardciphers属性与honorCipherOrder属性结合使用,指定非CBC(Cipher-blockchaining,密码块链接)模式下密码的优先级。默认属性值为AES128-GCM-SHA256:RC4:HIGH:!MD5:!aNULL:!EDHhandshakeTimeout:该属性值是一个整数,用于指定如果客户端和服务器之间的握手没有完成多少秒,连接将被放弃。默认属性值为120s。当在指定时间内没有完成握手时,会惩罚HTTPS服务器的clientError事件。honorCipherOrder:属性值为布尔值。当该属性值指定为真时,服务器将密码列表发送给客户端,客户端将选择密码。虽然该属性值默认为false,但还是建议将该属性值设置为true,以防止被BEAST攻击requestCert:属性值为布尔值。当属性值指定为true时,服务器在确认连接时要求客户端提供证书。默认属性值为falserejectUnauthorized:该属性值为布尔值。如果该属性值为真,则服务器拒绝任何不能提供服务器所需证书的客户端。该属性值只有当requestCert属性值指定为true时才有效,默认属性值为false应根据其优先级排序)。NPN(NextProtocolNegotiation)协议是用来指定服务器可以使用多种协议(包括HTTP、SPDY协议等)的协议sessionIdContext:如果属性值指定为true,则默认属性值为一个MD5哈希值。如果将requestCert属性值指定为false,则不提供默认属性值。5.3创建https服务器生成私钥文件opensslgenrsa1024>/root/https/private.pem通过私钥文件生成CSR证书签名opensslreq-new-key/root/https/private.pem-outcsr.pem通过私钥文件生成证书文件opensslx509-req-days365-incsr和CSR证书签名。pem-signkey/root/https/private.pem-out/root/https/file.crtapp.js文件代码letapp=require('express')();constfs=require('fs');consthttp=require('http');consthttps=require('https');constprivateKey=fs.readFileSync('/root/https/private.pem','utf8');constcertificate=fs.readFileSync('/root/https/file.crt','utf8');constcredentials={key:private密钥,证书:证书};consthttpServer=http.createServer(app);consthttpsServer=https.createServer(credentials,app);constPORT=18080;constSSLPORT=18081;httpServer.listen(PORT,function(){控制台.log('HTTP服务器运行于:http://localhost:%s',PORT);});httpsServer.listen(SSLPORT,function(){console.log('HTTPS服务器运行于:https://localhost:%s',SSLPORT);});//Welcomeapp.get('/',function(req,res){if(req.protocol==='https'){res.status(200).send('欢迎来到安全地带!');}else{res.status(200).send('欢迎!');}});6、使用HTTPS向其他网站请求数据在HTTPS模块中,可以使用request方法向其他使用HTTPS协议的网站请求数据。letreq=https.request(options,callback(res){})options是一个对象或字符串,用于指定请求目标的URL地址。如果参数值是一个String,会使用URL模块中的parse方法自动转换成一个对象。在options参数值对象或使用parse方法转换的对象中,可以指定的属性和属性值如下host:用于指定域名或目标主机的IP地址,默认属性为localhost主机名:用于指定目标主机的域名或IP地址,默认属性为localhost,如果同时指定了hostname属性值和host属性值,则hostname属性值为preferredport:指定目标服务器为HTTP单客户端连接的端口号,默认为443method:用于指定HTTP请求方式,默认为GETpath:用于指定请求路径和查询字符串,默认为/headers:用于指定客户端请求头objectauth:用于指定认证信息部分,如user:password`agent:用于指定用户代理。在options参数值对象中使用如下属性和属性值时,不能使用全局https.Agent对象pfx:属性值是字符串或Buffer对象,用于指定私钥、公钥和从pfx文件中读取的证书。要使用该属性值,您不需要指定key属性值、cert属性值和ca属性值。key:属性值为字符串或Buffer对象,用于指定从后缀为pem的私钥文件中读取的私钥。必须指定属性值,除非指定pfx属性值passphrase:属性值是一个字符串,用于指定私钥文件或pfx文件的密码cert:属性值是一个字符串或Buffer对象,用于指定从后缀为pem的文件中读取的公钥。除非指定,否则必须指定属性值pfx属性值ca:属性值是一个字符串或一个Buffer对象数组,用于指定一组证书。默认属性值是几个知名的证书授权认证中心,比如VerlSigncrl:属性值是一个字符串或者BufferObject数组,用于指定证书吊销列表ciphers:属性值是一个字符串值,用于描述需要使用或取消的密码。为了防止BEAST攻击,recommendationawardciphers属性结合honorCipherOrder属性使用,指定非CBC(Cipher-blockchaining,密码块链接)模式密码优先级,默认属性值为AES128-GCM-SHA256:RC4:HIGH:!MD5:!aNULL:!EDHrejectUnauthorized:属性值为布尔值,如果属性值为true,则客户端建立连接后,服务器首先验证客户端提交的证书,然后返回响应.如果验证失败,则触发客户端请求对象的错误事件。7.创建一个HTTPS客户端consthttps=require('https');让选项={主机名:'github.com',端口:443,路径:'/',method:'GET',agent:false}letreq=https.get(options,(res)=>{console.log('statuscode:'+res.statusCode);console.log('responseheader:'+JSON.stringify(res.headers));res.setEncoding('utf8');res.on('data',(chunk)=>{console.log('Responsecontent:'+chunk);});});req.setTimeout(1000,(res)=>{res.abort();});req.on('error',(err)=>{if(err.code==='ECONNRESET'){console.log('socketporttimeout');}else{console.log('请求数据过程中发生错误,错误码为:'+err.code)}});/***状态码:200*响应标头:{“date”:“Sun,2018年2月25日14:24:24GMT”,“content-type”:“text/html;charset=utf-8”,“transfer-encoding”:“chunked","connection":"close","server":"GitHub.com","status":"200OK","cache-control":"no-cache","vary":"X-PJAX,接受编码","x-ua-compatible":"IE=Edge,chrome=1","set-cookie":["logged_in=no;domain=.github.com;path=/;到期=2038年2月25日星期四14:24:24-0000;安全的;HttpOnly","_gh_sess=eyJzZXNzaW9uX2lkIjoiMDY1YjM2ZmU4ZGM5MTFlZTliNjllMDI5ZDg0YzQ0ODUiLCJsYXN0X3JlYWRfZnJvbV9yZXBsaWNhcyI6MTUxOTU2ODY2NDUzMywiX2NzcmZfdG9rZW4iOiJ1ck5qWmZTMkpkeGpxMlN2ZzJhbklJM2pvaTJMVWEzWHcvSXEvTGtzVzBrPSJ9--8b5c0c203b3767a35f046b5ea4e375715e4d95be;路径=/;安全的;HttpOnly"],"x-request-id":"1faefb3e691e8adc7e1a7d727c07236f","x-runtime":"0.050658","expect-ct":"max-age=2592000,report-uri=\"https://api.github.com/_private/browser/errors\"","content-security-policy":"default-src'none';base-uri“自我”;阻止所有混合内容;子源render.githubusercontent.com;connect-src'self'uploads.github.comstatus.github.comcollector.githubapp.comapi.github.comwww.google-analytics.comgithub-cloud.s3.amazonaws.comgithub-production-repository-file-5c1aeb.s3.amazonaws.comgithub-production-upload-manifest-file-7fdce7.s3.amazonaws.comgithub-production-user-asset-6210df.s3.amazonaws.comwss://live.github.com;font-srcassets-cdn.github.com;表单动作“自我”github.comgist.github.com;框架祖先“无”;img-src'self'数据:assets-cdn.github.comidenticons.github.comcollector.githubapp.comgithub-cloud.s3.amazonaws.com*.githubusercontent.com;清单源“自我”;媒体源“无”;脚本-srcassets-cdn.github.com;style-src'unsafe-inline'assets-cdn.github.com;worker-src'self'","strict-transport-security":"max-age=31536000;包括子域;preload","x-content-type-options":"nosniff","x-frame-options":"deny","x-xss-protection":"1;mode=block","x-runtime-rack":"0.058378","x-github-request-id":"1B82:60FF:117094:18A2C0:5A92C717"}*****/
