• 售前

  • 售后

热门帖子
入门百科

nginx设置SSL证书实现https服务的方法

[复制链接]
纵横捭阖804 显示全部楼层 发表于 2021-10-26 12:59:40 |阅读模式 打印 上一主题 下一主题
在前面一篇文章中,使用openssl生成了免费证书后,我们现在使用该证书来实现我们当地node服务的https服务需求。如果我现在node根本架构如下:
  1. |----项目
  2. | |--- static     # 存放html文件
  3. | | |--- index.html  # index.html
  4. | |--- node_modules  # 依赖包
  5. | |--- app.js     # node 入口文件
  6. | |--- package.json
  7. | |--- .babelrc    # 转换es6文件
复制代码
index.html 文件代码如下:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset=utf-8>
  5. <meta name="referrer" content="never">
  6. <title>nginx配置https</title>
  7. </head>
  8. <body>
  9. <div>
  10.   <h2>欢迎使用https来访问页面</h2>
  11. </div>
  12. </body>
  13. </html>
复制代码
app.js 代码如下:
  1. const Koa = require('koa');
  2. const fs = require('fs');
  3. const path = require('path');
  4. const router = require('koa-router')();
  5. const koaBody = require('koa-body');
  6. const static = require('koa-static');
  7. const app = new Koa();
  8. router.get('/', (ctx, next) => {
  9. // 设置头类型, 如果不设置,会直接下载该页面
  10. ctx.type = 'html';
  11. // 读取文件
  12. const pathUrl = path.join(__dirname, '/static/index.html');
  13. ctx.body = fs.createReadStream(pathUrl);
  14. next();
  15. });
  16. app.use(static(path.join(__dirname)));
  17. app.use(router.routes());
  18. app.use(router.allowedMethods());
  19. app.listen(3001, () => {
  20. console.log('server is listen in 3001');
  21. });
复制代码
package.json 代码如下;
  1. {
  2. "name": "uploadandload",
  3. "version": "1.0.0",
  4. "description": "",
  5. "main": "app.js",
  6. "scripts": {
  7.   "dev": "nodemon ./app.js"
  8. },
  9. "author": "",
  10. "license": "ISC",
  11. "dependencies": {
  12.   "fs": "0.0.1-security",
  13.   "koa": "^2.7.0",
  14.   "koa-body": "^4.1.0",
  15.   "koa-router": "^7.4.0",
  16.   "koa-send": "^5.0.0",
  17.   "koa-static": "^5.0.0",
  18.   "nodemon": "^1.19.0",
  19.   "path": "^0.12.7"
  20. }
  21. }
复制代码
然后我在项目的根目录下执行 npm run dev 后,就可以在欣赏器下访问 http://localhost:3001 了,但是为了我想使用域名访问的话,因此我们可以在 hosts文件下绑定下域名,比如叫 xxx.abc.com . hosts文件如下绑定:
  1. 127.0.0.1 xxx.abc.com
复制代码
因此这个时间我们使用 http://xxx.abc.com:3001/ 就可以访问页面了,如下所示:

如上所示,我们就可以访问页面了,但是我们有没有发现,在chrome欣赏器下 显示http哀求是不安全的,因此这个时间我想使用https来访问就好了,网页的安全性就得到了保障,但是这个时间如果我什么都不做,直接使用https去访问的话是不行的,比如地点:https://xxx.abc.com:3001. 如下图所示:


我们知道使用https访问的话,一样寻常是需要安全证书的,因此我们现在的任务是需要使用nginx来配置下安全证书之类的事变,然后使用https能访问网页就能到达目的。

nginx配置https服务
1. 起首进入nginx目录下,使用命令:cd /usr/local/etc/nginx。然后在该目录下创建 cert文件夹,目的是存放证书文件。
使用命令:mkdir cert 如下所示:

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的配置需要加上如下代码:
  1. server {
  2. listen    443 ssl;
  3. server_name  xxx.abc.com;
  4. ssl on; // 该配置项需要去掉
  5. ssl_certificate   cert/server.crt;
  6. ssl_certificate_key cert/server.key;
  7. /*
  8.   设置ssl/tls会话缓存的类型和大小。如果设置了这个参数一般是shared,buildin可能会参数内存碎片,默认是none,和off差不多,停用缓存。如shared:SSL:10m表示我所有的nginx工作进程共享ssl会话缓存,官网介绍说1M可以存放约4000个sessions。
  9. */
  10. ssl_session_cache  shared:SSL:1m;
  11. // 客户端可以重用会话缓存中ssl参数的过期时间,内网系统默认5分钟太短了,可以设成30m即30分钟甚至4h。
  12. ssl_session_timeout 5m;
  13. /*
  14.   选择加密套件,不同的浏览器所支持的套件(和顺序)可能会不同。
  15.   这里指定的是OpenSSL库能够识别的写法,你可以通过 openssl -v cipher 'RC4:HIGH:!aNULL:!MD5'(后面是你所指定的套件加密算法) 来看所支持算法。
  16. */
  17. ssl_ciphers HIGH:!aNULL:!MD5;
  18. // 设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件。
  19. ssl_prefer_server_ciphers on;
  20. location / {
  21.   proxy_pass http://localhost:3001;
  22. }
  23. }
复制代码
注意:如上 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 然后执行下面两句代码即可:
  1. cp server.key server.key.org
  2. openssl rsa -in server.key.org -out server.key
复制代码
如下所示:

可以看百度搜索出来的页面
然后当我继续重启下 nginx, 发现还会报错,报错信息如下:
  1. nginx: [warn] the "ssl" directive is deprecated, use the "listen ... ssl" directive instead
复制代码
然后继续把 ssl on; 这句配置项去掉就可以了,可能和nginx的版本有关系
近来升级到 nginx 1.15,reload之后全部带 ssl 的站点都报这个告诫了,查了很多资料,最后在 github 上面找到了一条相干的英文阐明: ( https://github.com/voxpupuli/puppet-nginx/issues/1224 ) 本人英文不好,大概意思应该是说 nginx 1.15 及以后的版本,不需要再写 ssl on; 了。
去 nginx.conf 删掉 ssl on; 之后,reload,果然没再报警,现在使用没啥标题。
我确实明白错了,应该把 ssl on 改成 listen 443 ssl 如许才对。
现在我继续重启下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服务启动的源码
以上就是本文的全部内容,盼望对各人的学习有所帮助,也盼望各人多多支持草根技术分享。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作