使用openSSL構造一個支援https的nodejs伺服器
下載完畢後,執行openssl進入互動式介面:
使用命令生成privatekey.pem 1024意思是1024位長度。
openssl genrsa -out privatekey.pem 1024
生成的privatekey.pem,開啟看一看長啥樣:
什麼是pem檔案?
.pem - Defined in RFCs 1421 through 1424, this is a container format that may include just the public certificate (such as with Apache installs, and CA certificate files /etc/ssl/certs), or may include an entire certificate chain including public key, private key, and root certificates. Confusingly, it may also encode a CSR (e.g. as used here) as the PKCS10 format can be translated into PEM. The name is from Privacy Enhanced Mail (PEM), a failed method for secure email but the container format it used lives on, and is a base64 translation of the x509 ASN.1 keys.
簡單的說,就是一個金鑰檔案。
第二步,基於第一步生成的金鑰檔案生成一個證照請求:
openssl req -new -key privatekey.pem -out certrequest.csr
如果懶得維護證照明細,直接敲回車,會自動填入預設值:
最後基於第一步生成的金鑰和證照請求生成一個數字證照:當然頒發機構就是自己了,僅用於測試目的。
openssl x509 -req -in certrequest.csr -signkey privatekey.pem -out certificate.pem
至此我們有了privatekey.pem和Certificate.pem兩個證照了。
下面是我https伺服器的程式碼,很簡單,只有50幾行:
var app = require('express')();var fs = require('fs');var https = require('https');var httpOptions = { key: fs.readFileSync("keys/privatekey.pem"), cert: fs.readFileSync("keys/certificate.pem") }var server = https.createServer(httpOptions, app);var io = require('socket.io')(server);console.log("https server listens on port 8080..."); server.listen(8080);function print_env(){ console.log(process.env); } app.get('/', function (req, res) { var response = "Hello World"; res.send(response); }); app.get('/env', function (req, res) { print_env(); // res.sendFile(__dirname + '/index.html'); var response = JSON.stringify(process.env); res.send(response); }); app.get('/redis', function (req, res) { var redisClient = require("./redisClient"); function callback(response){ // var response = "ok";//JSON.stringify(process.env); res.send(response); } redisClient.test(callback); }); io.on('connection', function (socket) { console.log("connect comming from client: " + socket.id); socket.emit('messages_jerry', { hello: 'world greeting from Server!' }); socket.on('messages', function (data) { console.log("data received from Client:" + JSON.stringify(data,2,2)); }); });
從程式碼裡不難理解這兩個pem檔案是如何用在https伺服器裡的。
最後在瀏覽器裡測試。因為是自己頒發的證照,沒有經過CA驗證,所以瀏覽器會顯示一個警告。
要獲取更多Jerry的原創文章,請關注公眾號"汪子熙":
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2643505/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用OpenSSL自建一個HTTPS服務HTTP
- QT支援https及編譯OpenSSLQTHTTP編譯
- 編譯支援iOS的libcurl+OpenSSL庫(支援https IPv6)編譯iOSHTTP
- [譯] 使用 NodeJS 建立一個 GraphQL 伺服器NodeJS伺服器
- 基於OpenSSL實現C/S架構中的https會話架構HTTP會話
- 又造了一個輪子—session庫!使用簡單!支援多儲存!Session
- 一個簡單的爬蟲 頭部構造爬蟲
- NET Core Kestrel部署HTTPS 一個伺服器綁一個證書 一個伺服器綁多個證書HTTP伺服器
- oracle等待事件3構造一個Direct Path write等待事件和構造一個Log File Sync等待事件Oracle事件
- nginx使用ssl模組配置HTTPS支援NginxHTTP
- 構建一個 Javascript 多維陣列構造器JavaScript陣列
- 使用OpenSSL生成自簽名證書(IIS)搭建Https站點HTTP
- 使用nodeJS寫一個簡單的小爬蟲NodeJS爬蟲
- 機器學習:如何構造一個簡單的決策樹機器學習
- 手工構造一個超微型的 PE 檔案 (轉)
- Node.js: 一個剛剛夠用的 HTTPS 伺服器Node.jsHTTP伺服器
- oracle等待事件2構造一個DB File Sequential Read等待事件和構造一個Direct Path ReadOracle事件
- import,export的支援[nodejs]ImportExportNodeJS
- .NetCore+OpenSSL實現HttpsNetCoreHTTP
- 使用TreeSet構造排序的集合排序
- 使用openssl在windows 10下本地xampp配置https開發環境WindowsHTTP開發環境
- OpenSSL學習筆記:openssl命令列的使用筆記命令列
- 轉一篇OpenSSL的例子:簡單的TLS伺服器TLS伺服器
- 基於OpenSSL的HTTPS通訊C++實現HTTPC++
- 使用Express搭建https伺服器ExpressHTTP伺服器
- OpenSSL支援TLS1.3特性前瞻TLS
- 使用Netty構建一個帶註解的Http伺服器框架NettyHTTP伺服器框架
- 伺服器 升級OpenSSL伺服器
- 使用 openssl 命令列構建 CA 及證書命令列
- SpringBoot使用教程【2】支援Https以及Http重定向HttpsSpring BootHTTP
- Nginx學習筆記(一)如何配置一個安全的HTTPS網站伺服器Nginx筆記HTTP網站伺服器
- openssl命令使用
- 寫一個“特殊”的查詢構造器 – (二、第一條語句)
- centos下 openssl 生成區域網ip的https證書CentOSHTTP
- [How HTTPS works Part 1 — Building Blocks] HTTPS 的工作方式第 1 部分-基本構造塊HTTPUIBloC
- 探索使用 Golang 和 Webassembly 構建一個多人遊戲伺服器GolangWeb遊戲伺服器
- 密碼學系列之:使用openssl檢測網站是否支援ocsp密碼學網站
- 一個html5+nodejs的遊戲HTMLNodeJS遊戲