您好!
欢迎来到京东云开发者社区
登录
首页
博文
课程
大赛
工具
用户中心
开源
首页
博文
课程
大赛
工具
开源
更多
用户中心
开发者社区
>
博文
>
Https在各种Web服务器下配置
分享
打开微信扫码分享
点击前往QQ分享
点击前往微博分享
点击复制链接
Https在各种Web服务器下配置
京东ZERO团队
2021-01-08
IP归属:未知
49040浏览
前端
### 前言 前端很多情况需要用启动web服务器,而为了保证数据的安全性,都需要用`Https`对传输的数据进行加密传输,而且有些`web-view`只允许`https`通过访问,所以学习怎么配置`https`也成为大前端不可以少的功课之一。下面本妹子将先简单介绍下 `Https`,再依次介绍怎么在`Node`、`webpack-dev-server`和`nginx`这三个最常见的前端web服务器下配置`Https`,以及关于证书的扩展干货。 ### Https简介 `Https`协议的主要作用可以分为两点: 1.建立一个信息安全通道,来保证数据传输的安全; 2.确认网站的真实性; 而`https`的加密方式主要是非对称加密,所以会有一对密钥,分别是一个公钥(证书)和私钥。 ![image.png](https://raoenhui.github.io/images/190604/1.jpg) 浏览器allen访问的时候,客户端会接受这个证书,并利用这个证书里的公钥对数据加密,加密后,服务端tony用自己的私钥解密就行了。 Web服务一般使用`OpenSSL`工具提供的密码库,生成PEM、KEY、CRT等格式的证书文件。 其中`.crt`后缀一般存放证书,`.key`后缀一般存放私钥,`.pem`后缀的可以同时存放把CA证书和密钥。 ### 生成证书和密钥 可以直接用命令生成 ```bash #使用以下命令生成一个证书密钥对 key.pem 和 cert.pem,它将有效期约10年(准确地说是3650天) openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.key -out cert.crt #或者直接生成到一个pem文件中 openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout all.pem -out all.pem ``` 可以用`selfsigned`插件生成 ```javascript const selfsigned = require('selfsigned'); var selfsigned = require('selfsigned'); var attrs = [{ name: 'commonName', value: 'contoso.com' }]; //有效期约10年 var pems = selfsigned.generate(attrs, { days: 3650 }); fs.writeFileSync('all.pem', pems.private + pems.cert, { encoding: 'utf-8' }); ``` ### node配置https 用openssl生成all.pem ```bash openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout all.pem -out all.pem ``` 在同目录编写`app.js`,并运行`node app.js`,启动`node`服务监听`88`端口 ```javascript var https = require('https'); const fs = require('fs'); const path = require('path'); const options = { key: fs.readFileSync(path.resolve(__dirname, './all.pem')),//密钥 cert: fs.readFileSync(path.resolve(__dirname, './all.pem'))//证书 }; https.createServer(options, (request, response)=> { // 发送 HTTP 头部 // HTTP 状态值: 200 : OK // 内容类型: text/plain response.writeHead(200, {'Content-Type': 'text/plain'}); // 发送响应数据 "Hello World" response.end('Hello World\n'); }).listen(88); // 终端打印如下信息 console.log('Server running at https://127.0.0.1:88/'); ``` ![browser.png](https://raoenhui.github.io/images/190604/2.jpg) 具体代码可查看[https://github.com/raoenhui/node-https.git](https://github.com/raoenhui/node-https.git) ### web-dev-server 配置https web-dev-server配置很简单,只要将`https`选项设成`true`即可。 ```javascript module.exports = { devServer: { https: true } }; ``` web-dev-server原理 server.js里面判断如果没有证书和密钥,则用`selfsigned`生成,并放在ssl目录中的`server.pem`文件下,默认生成有效期为`30`天。 ```javascript const certPath = path.join(__dirname, '../ssl/server.pem'); let certExists = fs.existsSync(certPath); ... if (!certExists) { log('Generating SSL Certificate'); const attrs = [{ name: 'commonName', value: 'localhost' }]; const pems = selfsigned.generate(attrs, { algorithm: 'sha256', days: 30, keySize: 2048, extensions: [...] }); fs.writeFileSync(certPath, pems.private + pems.cert, { encoding: 'utf-8' }); } fakeCert = fs.readFileSync(certPath); ``` 启动服务的时候引用证书和密钥 ```javascript options.https.key = options.https.key || fakeCert; options.https.cert = options.https.cert || fakeCert; ... this.listeningApp = spdy.createServer(options.https, app); ``` ### Nginx 配置https ```bash # 进入nginx目录 cd nginx # 在key文件夹中用openssl生成 mkdir key && cd key && openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout all.pem -out all.pem ``` ``` # HTTPS server # server { listen 443 ssl; server_name localhost; #证书路径 ssl_certificate key/all.pem; ssl_certificate_key key/all.pem; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root /HD/mycode/test; index index.html index.htm; } } ``` ### 知识扩展 #### 其他证书格式 上面本妹子所讲的是对于前端比较常见的web服务器,而其实还有很多种服务器它们的证书格式是不一样的,而且可以互相转换,具体如下图所示 ![2.png](https://raoenhui.github.io/images/190604/3.jpg) #### CA CA全称为Certificate Authority 证书授权中心。上面本妹子是自己生成证书,这个证书在互联网上是认为不安全的。只有通过CA机构下发的证书,浏览器和电脑才会认为是可靠安全的。 其中证书也有很多分类,可以向CA申请不同类型的证书。下面举例几种常见证书类型的区别 ![3.png](https://raoenhui.github.io/images/190604/4.jpg) > 我们国内一般常见的CA有阿里云,如果申请个人免费证书是申请DV ssl,为1年的有效期。免费证书下载后有两个文件。一个是扩展名为.pem的文件,一个是扩展名为.key的文件。.pem文件中已经包含服务器证书和CA中间证书,第一段为服务器证书,第二段为CA中间证书,可以使用文本编辑器自行提取。.key文件是证书私钥。 #### SSL证书在线检测工具 还可以用SSL证书在线检测工具,检测网站证书详细信息。 [https://www.chinassl.net/ssltools/ssl-checker.html](https://www.chinassl.net/ssltools/ssl-checker.html) 如www.jd.com ![image.png](https://raoenhui.github.io/images/190604/5.jpg) ![image.png](https://raoenhui.github.io/images/190604/6.jpg) ### 相关链接 >* [Https网络安全架构设计与实践视频教程](https://study.163.com/course/courseLearn.htm?courseId=1209189811#/learn/live?lessonId=1278788317&courseId=1209189811) >* [selfsigned说明文档](https://www.npmjs.com/package/selfsigned) >* [数字证书](https://www.jianshu.com/p/42bf7c4d6ab8) >* [CA证书](https://help.aliyun.com/KnowledgeDetail.htm?spm=5176.2020520129.113.4.34f546aekABdeF&knowledgeId=88447) Happy coding .. :)
原创文章,需联系作者,授权转载
上一篇:gulp插件解决浏览器缓存问题
下一篇:微信小程序开发注意指南和优化实践
相关文章
前端十年回顾 | 漫画前端的前世今生
Taro小程序跨端开发入门实战
【技术干货】企业级扫描平台EOS关于JS扫描落地与实践!
京东ZERO团队
文章数
39
阅读量
91750
作者其他文章
01
webpack打包组件配置(React版本)
这篇文章是以打包react插件的形式,介绍webpack的一些配置信息。如果写简单插件的话还是推荐使用rollup,但是可以用写插件的形式去学习一下webpack的一些东西。(适用于初中级webpack学者)
01
webpack核心概念与基本实现
webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。**
01
Typescript合成Webpack中
TypeScript是JavaScript类型的超集,它可以编译成纯JavaScript,简称ts。相对于ES6,TypeScript最大的改善是增加了类型系统,国内外很多大型工程都用它,如AngularJs,白鹭引擎、Antd。
01
小程序加载svg图片
小程序的[组件](https://developers.weixin.qq.com/miniprogram/dev/component/)中是没有支持`SVG`标签的。 但是在前端小伙伴的实际开发中,UED经常提供SVG图片过来,如果不想用引入`iconfont`的话,那么妹子我将介绍个很好用的方法。
最新回复
丨
点赞排行
共0条评论
京东ZERO团队
文章数
39
阅读量
91750
作者其他文章
01
webpack打包组件配置(React版本)
01
webpack核心概念与基本实现
01
Typescript合成Webpack中
01
小程序加载svg图片
添加企业微信
获取1V1专业服务
扫码关注
京东云开发者公众号