nginx配置SSL證書(shū)實(shí)現(xiàn)https服務(wù)的方法
在前面一篇文章中,使用openssl生成了免費(fèi)證書(shū)后,我們現(xiàn)在使用該證書(shū)來(lái)實(shí)現(xiàn)我們本地node服務(wù)的https服務(wù)需求。假如我現(xiàn)在node基本架構(gòu)如下:
|----項(xiàng)目 | |--- static # 存放html文件 | | |--- index.html # index.html | |--- node_modules # 依賴(lài)包 | |--- app.js # node 入口文件 | |--- package.json | |--- .babelrc # 轉(zhuǎn)換es6文件
index.html 文件代碼如下:
<!DOCTYPE html> <html> <head> <meta charset=utf-8> <meta name="referrer" content="never"> <title>nginx配置https</title> </head> <body> <div> <h2>歡迎使用https來(lái)訪(fǎng)問(wèn)頁(yè)面</h2> </div> </body> </html>
app.js 代碼如下:
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) => { // 設(shè)置頭類(lèi)型, 如果不設(shè)置,會(huì)直接下載該頁(yè)面 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 代碼如下;
{ "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" } }
然后我在項(xiàng)目的根目錄下執(zhí)行 npm run dev 后,就可以在瀏覽器下訪(fǎng)問(wèn) http://localhost:3001 了,但是為了我想使用域名訪(fǎng)問(wèn)的話(huà),因此我們可以在 hosts文件下綁定下域名,比如叫 xxx.abc.com . hosts文件如下綁定:
127.0.0.1 xxx.abc.com
因此這個(gè)時(shí)候我們使用 http://xxx.abc.com:3001/ 就可以訪(fǎng)問(wèn)頁(yè)面了,如下所示:
如上所示,我們就可以訪(fǎng)問(wèn)頁(yè)面了,但是我們有沒(méi)有發(fā)現(xiàn),在chrome瀏覽器下 顯示http請(qǐng)求是不安全的,因此這個(gè)時(shí)候我想使用https來(lái)訪(fǎng)問(wèn)就好了,網(wǎng)頁(yè)的安全性就得到了保障,但是這個(gè)時(shí)候如果我什么都不做,直接使用https去訪(fǎng)問(wèn)的話(huà)是不行的,比如地址:https://xxx.abc.com:3001. 如下圖所示:
我們知道使用https訪(fǎng)問(wèn)的話(huà),一般是需要安全證書(shū)的,因此我們現(xiàn)在的任務(wù)是需要使用nginx來(lái)配置下安全證書(shū)之類(lèi)的事情,然后使用https能訪(fǎng)問(wèn)網(wǎng)頁(yè)就能達(dá)到目標(biāo)。
nginx配置https服務(wù)
1. 首先進(jìn)入nginx目錄下,使用命令:cd /usr/local/etc/nginx。然后在該目錄下創(chuàng)建 cert文件夾,目的是存放證書(shū)文件。
使用命令:mkdir cert 如下所示:
2. 然后我們需要把證書(shū)相關(guān)的文件,比如server.crt 和 server.key 文件復(fù)制到該 cert目錄下。比如如下證書(shū)文件:
至于如上證書(shū)是如何生存的,可以請(qǐng)看我上篇文字 使用openssl 生存免費(fèi)證書(shū)
移動(dòng)命令:mv server.key /usr/local/etc/nginx/cert, 比如把server.key 和 server.crt文件都移動(dòng)到 /usr/local/etc/nginx/cert目錄下。如下圖所示:
然后我們?cè)俨榭聪?/usr/local/etc/nginx/cert 目錄下,有如下文件,如下所示:
3. nginx的配置
nginx的配置需要加上如下代碼:
server { listen 443 ssl; server_name xxx.abc.com; ssl on; // 該配置項(xiàng)需要去掉 ssl_certificate cert/server.crt; ssl_certificate_key cert/server.key; /* 設(shè)置ssl/tls會(huì)話(huà)緩存的類(lèi)型和大小。如果設(shè)置了這個(gè)參數(shù)一般是shared,buildin可能會(huì)參數(shù)內(nèi)存碎片,默認(rèn)是none,和off差不多,停用緩存。如shared:SSL:10m表示我所有的nginx工作進(jìn)程共享ssl會(huì)話(huà)緩存,官網(wǎng)介紹說(shuō)1M可以存放約4000個(gè)sessions。 */ ssl_session_cache shared:SSL:1m; // 客戶(hù)端可以重用會(huì)話(huà)緩存中ssl參數(shù)的過(guò)期時(shí)間,內(nèi)網(wǎng)系統(tǒng)默認(rèn)5分鐘太短了,可以設(shè)成30m即30分鐘甚至4h。 ssl_session_timeout 5m; /* 選擇加密套件,不同的瀏覽器所支持的套件(和順序)可能會(huì)不同。 這里指定的是OpenSSL庫(kù)能夠識(shí)別的寫(xiě)法,你可以通過(guò) openssl -v cipher 'RC4:HIGH:!aNULL:!MD5'(后面是你所指定的套件加密算法) 來(lái)看所支持算法。 */ ssl_ciphers HIGH:!aNULL:!MD5; // 設(shè)置協(xié)商加密算法時(shí),優(yōu)先使用我們服務(wù)端的加密套件,而不是客戶(hù)端瀏覽器的加密套件。 ssl_prefer_server_ciphers on; location / { proxy_pass http://localhost:3001; } }
注意:如上 ssl on; 這個(gè)配置項(xiàng)需要去掉。假如是如上的配置后,我重新啟動(dòng)下nginx命令會(huì)報(bào)錯(cuò),如下所示:
SSL: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt error:0906A065:PEM routines:PEM_do_header:bad decrypt 類(lèi)似這樣的錯(cuò),然后通過(guò)百度搜索這個(gè)錯(cuò)誤,通過(guò)如下方法可以解決:
進(jìn)入到該目錄下:cd /usr/local/etc/nginx/cert 然后執(zhí)行下面兩句代碼即可:
cp server.key server.key.org openssl rsa -in server.key.org -out server.key
如下所示:
可以看百度搜索出來(lái)的頁(yè)面
然后當(dāng)我繼續(xù)重啟下 nginx, 發(fā)現(xiàn)還會(huì)報(bào)錯(cuò),報(bào)錯(cuò)信息如下:
nginx: [warn] the "ssl" directive is deprecated, use the "listen ... ssl" directive instead
然后繼續(xù)把 ssl on; 這句配置項(xiàng)去掉就可以了,可能和nginx的版本有關(guān)系
最近升級(jí)到 nginx 1.15,reload之后所有帶 ssl 的站點(diǎn)都報(bào)這個(gè)警告了,查了很多資料,最后在 github 上面找到了一條相關(guān)的英文說(shuō)明: ( https://github.com/voxpupuli/puppet-nginx/issues/1224 ) 本人英文不好,大概意思應(yīng)該是說(shuō) nginx 1.15 及以后的版本,不需要再寫(xiě) ssl on; 了。
去 nginx.conf 刪掉 ssl on; 之后,reload,果然沒(méi)再報(bào)警,目前使用沒(méi)啥問(wèn)題。
我確實(shí)理解錯(cuò)了,應(yīng)該把 ssl on 改成 listen 443 ssl 這樣才對(duì)。
現(xiàn)在我繼續(xù)重啟下nginx就ok了,如下所示:
但是如上配置后,我們還不能直接 使用 域名 https://xxx.abc.com/ 訪(fǎng)問(wèn)了,我們還需要在瀏覽器下把自己之前生成的client.crt 證書(shū)安裝上去,在mac系統(tǒng)下操作步驟如下:
1. 點(diǎn)擊如下啟動(dòng)臺(tái)。如下所示:
2. 搜索鑰匙串訪(fǎng)問(wèn),點(diǎn)擊進(jìn)去,如下所示
3. 進(jìn)入到證書(shū)頁(yè)面,把我們之前的client.crt證書(shū)拖進(jìn)到證書(shū)里面去即可,比如我之前生成的 client.crt證書(shū),如下所示:
4. 右鍵點(diǎn)擊我的證書(shū),然后點(diǎn)擊 "顯示簡(jiǎn)介", 進(jìn)入到證書(shū)詳情頁(yè)面后。如下圖所示:
5. 進(jìn)入頁(yè)面后,使用證書(shū)時(shí),選擇始終信任后,如下圖所示:
6. 然后退出,可能需要輸入電腦開(kāi)機(jī)密碼,輸入完成,會(huì)自動(dòng)保存。然后我們?cè)跒g覽器訪(fǎng)問(wèn)該 https://xxx.abc.com/ 頁(yè)面后就可以訪(fǎng)問(wèn)的到了。如下所示:
然后我們點(diǎn)擊繼續(xù)訪(fǎng)問(wèn)即可看到頁(yè)面了,如下所示:
如上就是使用 nginx + 證書(shū) 實(shí)現(xiàn) 本地node https服務(wù)了。
但是如上https雖然可以訪(fǎng)問(wèn),但是https前面還是顯示不安全的文案; 如下圖所示:
可能的原因該證書(shū)是自己生成的證書(shū),不是購(gòu)買(mǎi)第三方的證書(shū)導(dǎo)致的吧。具體啥原因,目前我也不知道,至少現(xiàn)在我們可以使用https來(lái)訪(fǎng)問(wèn)我們的項(xiàng)目了。
github上簡(jiǎn)單node服務(wù)啟動(dòng)的源碼
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Nginx 域名SSL證書(shū)配置(網(wǎng)站 http 升級(jí)為 https)
- Nginx配置SSL證書(shū)出錯(cuò)解決方案
- Nginx下SSL證書(shū)安裝部署步驟介紹
- Nginx使用自簽ssl證書(shū)實(shí)現(xiàn)https連接的方法
- Nginx部署SSL證書(shū)的過(guò)程
- Nginx配置ssl證書(shū)(https)的全過(guò)程
- 阿里云ssl證書(shū)如何通過(guò)Nginx部署到服務(wù)器
- 關(guān)于Nginx配置ssl證書(shū)實(shí)現(xiàn)https安全訪(fǎng)問(wèn)
- Nginx實(shí)現(xiàn)自簽名SSL證書(shū)生成與配置實(shí)現(xiàn)
- Nginx配置SSL證書(shū)的方法步驟
- Nginx配置SSL證書(shū)的實(shí)現(xiàn)步驟
相關(guān)文章
nginx 負(fù)載均衡的三種參數(shù)設(shè)置
這篇文章主要介紹了nginx 負(fù)載均衡的三種參數(shù)設(shè)置,需要的朋友可以參考下2017-07-07使用nginx部署前端項(xiàng)目的實(shí)現(xiàn)
前端項(xiàng)目的部署以前一直是把靜態(tài)資源放到后端工程中,隨后端部署一起部署,本文主要介紹了使用nginx部署前端項(xiàng)目的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10nginx配置后訪(fǎng)問(wèn)出現(xiàn)白屏的問(wèn)題解決
本文主要介紹了nginx配置后訪(fǎng)問(wèn)出現(xiàn)白屏2024-06-06Nginx Rewrite規(guī)則與使用介紹和技巧實(shí)例
這篇文章主要介紹了Nginx Rewrite規(guī)則與使用介紹和技巧實(shí)例,本文講解了正則表達(dá)式匹配、文件及目錄匹配、flag標(biāo)記、Nginx Rewrite相關(guān)指令等內(nèi)容,需要的朋友可以參考下2015-01-01Nginx中配置過(guò)濾爬蟲(chóng)的User-Agent的簡(jiǎn)單方法
這篇文章主要介紹了Nginx中配置過(guò)濾爬蟲(chóng)的User-Agent的簡(jiǎn)單方法,文中羅列了一些常用搜索引擎的爬蟲(chóng)名稱(chēng)以免造成不必要的過(guò)濾,需要的朋友可以參考下2016-01-01Nginx 如何部署指定文件夾下的項(xiàng)目(本地測(cè)試)
這篇文章主要介紹了Nginx 如何部署指定文件夾下的項(xiàng)目(本地測(cè)試),分為配置vue.config.js,指定生成環(huán)境的包,配置路由模式為hash(history模式刷新后,找不到頁(yè)面),本文講解的非常詳細(xì),需要的朋友可以參考下2024-01-01