首頁 >運維 >Nginx >nginx如何設定SSL憑證實現https服務

nginx如何設定SSL憑證實現https服務

WBOY
WBOY轉載
2023-05-15 15:25:061781瀏覽

假如我現在node基本架構如下:

|----项目
| |--- static     # 存放html文件
| | |--- index.html  # index.html
| |--- node_modules  # 依赖包
| |--- app.js     # node 入口文件
| |--- package.json 
| |--- .babelrc    # 转换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来访问页面</h2>
 </div>
</body>
</html>

app.js 程式碼如下:

const koa = require(&#39;koa&#39;);
const fs = require(&#39;fs&#39;);
const path = require(&#39;path&#39;);
const router = require(&#39;koa-router&#39;)();
const koabody = require(&#39;koa-body&#39;);
const static = require(&#39;koa-static&#39;);

const app = new koa();

router.get(&#39;/&#39;, (ctx, next) => {
 // 设置头类型, 如果不设置,会直接下载该页面
 ctx.type = &#39;html&#39;;
 // 读取文件
 const pathurl = path.join(__dirname, &#39;/static/index.html&#39;);
 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(&#39;server is listen in 3001&#39;);
});

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"
 }
}

然後我在專案的根目錄下執行npm run dev 後,就可以在瀏覽器下訪問http://localhost:3001 了,但是為了我想使用網域存取的話,因此我們可以在hosts檔案下綁定下域名,例如叫xxx.abc.com . hosts檔案如下綁定:

127.0.0.1 xxx.abc.com

因此這個時候我們使用http://xxx.abc.com:3001/ 就可以訪問頁面了,如下所示:

nginx如何設定SSL憑證實現https服務

如上所示,我們就可以訪問頁面了,但是我們有沒有發現,在chrome瀏覽器下顯示http請求是不安全的,因此這個時候我想使用https來訪問就好了,網頁的安全性就得到了保障,但是這個時候如果我什麼都不做,直接使用https去訪問的話是不行的,比如地址:https:/ /xxx.abc.com:3001. 如下圖所示:

nginx如何設定SSL憑證實現https服務

#我們知道使用https存取的話,一般是需要安全性憑證的,因此我們現在的任務是需要使用nginx來設定下安全憑證之類的事情,然後使用https能存取網頁就能達到目標。

nginx設定https服務

1. 首先進入nginx目錄下,使用指令:cd /usr/local/etc/nginx。然後在該目錄下建立 cert資料夾,目的是存放憑證檔案。
使用指令:mkdir cert 如下所示:

nginx如何設定SSL憑證實現https服務

2. 然後我們需要把憑證相關的文件,例如server.crt 和server.key 檔案複製到該cert目錄下。例如如下憑證檔案:

nginx如何設定SSL憑證實現https服務

至於如上憑證是如何生存的,可以請看我上篇文字

移動指令:mv server.key /usr /local/etc/nginx/cert, 例如把server.key 和server.crt檔案都移到/usr/local/etc/nginx/cert目錄下。如下圖所示:

nginx如何設定SSL憑證實現https服務

然後我們再查看下/usr/local/etc/nginx/cert 目錄下,有​​如下文件,如下所示:

nginx如何設定SSL憑證實現https服務

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 &#39;rc4:high:!anull:!md5&#39;(后面是你所指定的套件加密算法) 来看所支持算法。
 */
 ssl_ciphers high:!anull:!md5;

 // 设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件。
 ssl_prefer_server_ciphers on;

 location / {
  proxy_pass http://localhost:3001;
 }
}

注意:如上ssl on; 這個設定項需要去掉。假如是如上的配置後,我重新啟動下nginx指令會報錯,如下所示:

nginx如何設定SSL憑證實現https服務

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

如下:

nginx如何設定SSL憑證實現https服務

#可以看百度搜尋出來的頁面

然後當我繼續重啟下nginx, 發現還會報錯,報錯訊息如下:

nginx: [warn] the "ssl" directive is deprecated, use the "listen ... ssl" directive instead

然後繼續把ssl on; 這句配置項目去掉就可以了,可能和nginx的版本有關係

#最近升級到 nginx 1.15,reload之後所有帶ssl 的站點都報這個警告了,查了很多資料,最後在github 上面找到了一條相關的英文說明: ( ) 本人英文不好,大概意思應該是說 nginx 1.15 及以後的版本,不需要再寫 ssl on; 了。

去 nginx.conf 刪除 ssl on; 之後,reload,果然沒再報警,目前使用沒啥問題。

我確實理解錯了,應該把 ssl on 改成 listen 443 ssl 這樣才對。

現在我繼續重啟下nginx就ok了,如下圖:

nginx如何設定SSL憑證實現https服務

#但是如上配置後,我們還不能直接使用網域https:// xxx.abc.com/ 訪問了,我們還需要在瀏覽器下把自己之前生成的client.crt 證書安裝上去,在mac系統下操作步驟如下:

#1. 點擊如下啟動台。如下圖所示:

nginx如何設定SSL憑證實現https服務

2. 搜尋鑰匙圈訪問,點擊進去,如下所示

nginx如何設定SSL憑證實現https服務

3. 進入到憑證頁面,把我們之前的client.crt證書會拖進去即可,例如我之前產生的client.crt證書,如下:

nginx如何設定SSL憑證實現https服務

4. 右鍵點選我的證書,然後點選"顯示簡介", 進入到證書詳情頁面後。如下圖所示:

nginx如何設定SSL憑證實現https服務

5. 進入頁面後,使用憑證時,選擇始終信任後,如下圖所示:

nginx如何設定SSL憑證實現https服務

6. 然後退出,可能需要輸入電腦開機密碼,輸入完成,會自動儲存。然後我們在瀏覽器造訪該 https://xxx.abc.com/ 頁面後就可以造訪的到了。如下所示:

nginx如何設定SSL憑證實現https服務

然後我們點擊繼續造訪即可看到頁面了,如下所示:

nginx如何設定SSL憑證實現https服務

如上就是使用nginx 憑證實作本機node https服務了。

但是如上https雖然可以訪問,但是https前面還是顯示不安全的文案; 如下圖所示:

nginx如何設定SSL憑證實現https服務

#

以上是nginx如何設定SSL憑證實現https服務的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除