在前面一篇文章中,使用openssl生成了免费证书 后,咱们如今使用该证书来实现咱们本地node服务的https服务需求。假如我如今node基本架构以下:html
|----项目 | |--- static # 存放html文件 | | |--- index.html # index.html | |--- node_modules # 依赖包 | |--- app.js # node 入口文件 | |--- package.json | |--- .babelrc # 转换es6文件
index.html 文件代码以下:node
<!DOCTYPE html> <html> <head> <meta charset=utf-8> <meta name="referrer" content="never"> <title>nginx配置https</title> </head> <body> <div> <h2>欢迎使用https来访问页面</h2> </div> </body> </html>
app.js 代码以下:nginx
const Koa = require('koa'); const fs = require('fs'); const path = require('path'); const router = require('koa-router')(); const koaBody = require('koa-body'); const static = require('koa-static'); const app = new Koa(); router.get('/', (ctx, next) => { // 设置头类型, 若是不设置,会直接下载该页面 ctx.type = 'html'; // 读取文件 const pathUrl = path.join(__dirname, '/static/index.html'); ctx.body = fs.createReadStream(pathUrl); next(); }); app.use(static(path.join(__dirname))); app.use(router.routes()); app.use(router.allowedMethods()); app.listen(3001, () => { console.log('server is listen in 3001'); });
package.json 代码以下;git
{ "name": "uploadandload", "version": "1.0.0", "description": "", "main": "app.js", "scripts": { "dev": "nodemon ./app.js" }, "author": "", "license": "ISC", "dependencies": { "fs": "0.0.1-security", "koa": "^2.7.0", "koa-body": "^4.1.0", "koa-router": "^7.4.0", "koa-send": "^5.0.0", "koa-static": "^5.0.0", "nodemon": "^1.19.0", "path": "^0.12.7" } }
而后我在项目的根目录下执行 npm run dev 后,就能够在浏览器下访问 http://localhost:3001 了,可是为了我想使用域名访问的话,所以咱们能够在 hosts文件下绑定下域名,好比叫 xxx.abc.com . hosts文件以下绑定:es6
127.0.0.1 xxx.abc.com
所以这个时候咱们使用 http://xxx.abc.com:3001/ 就能够访问页面了,以下所示:github
如上所示,咱们就能够访问页面了,可是咱们有没有发现,在chrome浏览器下 显示http请求是不安全的,所以这个时候我想使用https来访问就行了,网页的安全性就获得了保障,可是这个时候若是我什么都不作,直接使用https去访问的话是不行的,好比地址:https://xxx.abc.com:3001. 以下图所示:web
咱们知道使用https访问的话,通常是须要安全证书的,所以咱们如今的任务是须要使用nginx来配置下安全证书之类的事情,而后使用https能访问网页就能达到目标。
若是想要学习nginx基本安装及基本知识点,请看我以前的这篇文章算法
nginx配置https服务 chrome
1. 首先进入nginx目录下,使用命令:cd /usr/local/etc/nginx。而后在该目录下建立 cert文件夹,目的是存放证书文件。
使用命令:mkdir cert 以下所示:npm
2. 而后咱们须要把证书相关的文件,好比server.crt 和 server.key 文件复制到该 cert目录下。好比以下证书文件:
至于如上证书是如何生存的,能够请看我上篇文字 使用openssl 生存免费证书
移动命令:mv server.key /usr/local/etc/nginx/cert, 好比把server.key 和 server.crt文件都移动到 /usr/local/etc/nginx/cert目录下。以下图所示:
而后咱们再查看下 /usr/local/etc/nginx/cert 目录下,有以下文件,以下所示:
3. nginx的配置
nginx的配置须要加上以下代码:
server { listen 443 ssl; server_name xxx.abc.com; ssl on; // 该配置项须要去掉 ssl_certificate cert/server.crt; ssl_certificate_key cert/server.key; /* 设置ssl/tls会话缓存的类型和大小。若是设置了这个参数通常是shared,buildin可能会参数内存碎片,默认是none,和off差很少,停用缓存。如shared:SSL:10m表示我全部的nginx工做进程共享ssl会话缓存,官网介绍说1M能够存放约4000个sessions。 */ ssl_session_cache shared:SSL:1m; // 客户端能够重用会话缓存中ssl参数的过时时间,内网系统默认5分钟过短了,能够设成30m即30分钟甚至4h。 ssl_session_timeout 5m; /* 选择加密套件,不一样的浏览器所支持的套件(和顺序)可能会不一样。 这里指定的是OpenSSL库可以识别的写法,你能够经过 openssl -v cipher 'RC4:HIGH:!aNULL:!MD5'(后面是你所指定的套件加密算法) 来看所支持算法。 */ ssl_ciphers HIGH:!aNULL:!MD5; // 设置协商加密算法时,优先使用咱们服务端的加密套件,而不是客户端浏览器的加密套件。 ssl_prefer_server_ciphers on; location / { proxy_pass http://localhost:3001; } }
注意:如上 ssl on; 这个配置项须要去掉。假如是如上的配置后,我从新启动下nginx命令会报错,以下所示:
SSL: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt error:0906A065:PEM routines:PEM_do_header:bad decrypt 相似这样的错,而后经过百度搜索这个错误,经过以下方法能够解决:
进入到该目录下:cd /usr/local/etc/nginx/cert 而后执行下面两句代码便可:
cp server.key server.key.org openssl rsa -in server.key.org -out server.key
以下所示:
能够看百度搜索出来的页面(http://ju.outofmemory.cn/entry/17732)
而后当我继续重启下 nginx, 发现还会报错,报错信息以下:
nginx: [warn] the "ssl" directive is deprecated, use the "listen ... ssl" directive instead
而后继续把 ssl on; 这句配置项去掉就能够了,可能和nginx的版本有关系,请看这篇文章(https://blog.csdn.net/ootw/article/details/81059677).
如今我继续重启下nginx就ok了,以下所示:
可是如上配置后,咱们还不能直接 使用 域名 https://xxx.abc.com/ 访问了,咱们还须要在浏览器下把本身以前生成的client.crt 证书安装上去,在mac系统下操做步骤以下:
1. 点击以下启动台。以下所示:
2. 搜索钥匙串访问,点击进去,以下所示
3. 进入到证书页面,把咱们以前的client.crt证书拖进到证书里面去便可,好比我以前生成的 client.crt证书,以下所示:
4. 右键点击个人证书,而后点击 "显示简介", 进入到证书详情页面后。以下图所示:
5. 进入页面后,使用证书时,选择始终信任后,以下图所示:
6. 而后退出,可能须要输入电脑开机密码,输入完成,会自动保存。而后咱们在浏览器访问该 https://xxx.abc.com/ 页面后就能够访问的到了。以下所示:
而后咱们点击继续访问便可看到页面了,以下所示:
如上就是使用 nginx + 证书 实现 本地node https服务了。
可是如上https虽然能够访问,可是https前面仍是显示不安全的文案; 以下图所示:
可能的缘由该证书是本身生成的证书,不是购买第三方的证书致使的吧。具体啥缘由,目前我也不知道,至少如今咱们可使用https来访问咱们的项目了。
github上简单node服务启动的源码