摘要:和的區別服務器使用協議服務器使用協議服務器需要向證書授權中心申請證書一般免費證書何紹需要交費在少許讀客戶端有要求的情況下也會要求客戶端使用證書服務器于客戶端之間傳輸的是明文數據而服務器于客戶端之間傳輸的是經過安全加密后的密文數據服務器通常使
4. HTTP和HTTPS的區別
HTTPS服務器使用HTTPS協議,HTTP服務器使用HTTP協議.
HTTPS服務器需要向證書授權(Certificate Authority)中心申請證書,一般免費證書何紹需要交費.在少許讀客戶端有要求的情況下,也會要求客戶端使用證書.
HTTP服務器于客戶端之間傳輸的是明文數據,而HTTPS服務器于客戶端之間傳輸的是經過SSL安全加密后的密文數據.
HTTP服務器通常使用80或8080端口,HTTPS服務器使用443端口.
5. 創建HTTPS服務器 5.1 前提條件——準備公鑰私鑰和證書創建HTTPS服務器之間,服務器端首先需要創建公鑰,私鑰及證書
創建公鑰,可以使用openssl工具創建私鑰openssl genrsa -out privatekey.pem 1024
創建證書簽名請求(Certificate Signing Request)文件openssl req -new -key privatekey.pem -out certreques.csr
獲取證書,證書應該是一個經過證書授權中心簽名的文件,該證書文件內寶藍了服務器端提供的公鑰以及證書的頒發機構等信息openssl x509 -req -in certrequest.csr -signkey privatekey.pem -out certificate.pem,x509代表該證書如何國際電信聯盟制定的數字證書標準
在客戶端與服務器端建立連接后,將首先確認證書的合法性,如果在服務器中使用學習或測試用證書,使用瀏覽器訪問該服務器時,瀏覽器中將先顯示一個警告信息,警告用戶該證書不是一個經過證書授權中心簽名的證書.
在具備了證書文件之后,可以使用該證書文件創建一個pfx文件,所謂的pfx文件,是指該文件內容必須符合公鑰加密技術12號標準(Public Key Cryptography Standards #12, PKCS#12)為存儲和傳輸用戶或服務器私鑰,公鑰和證書而指定的格式.
+. 在openssl工具中,可以創建pfx文件openssl pkcs12 -export -in certificate.pem -inkey privatekey.pem -out certificate.pfx
在這些文件都具備了之后,可以使用HTTPS模塊中的createServer方法創建一個HTTPS服務器HTTPS.createServer(options, [requestListener(request, response)])
HTTPS.createServer(options)
options為一個對象,使用的屬性及屬性值如下所示
pfx: 屬性值為一個字符串或一個Buffer對象,用于指定從pfx文件讀取出的私鑰,公鑰及證書,使用該屬性值不需要指定key屬性值,cert屬性值以及ca屬性值.
key: 屬性值為一個字符串或一個Buffer對象,用于指定從后綴名為pem的私鑰文件中讀取出來的私鑰,該屬性值為必須指定屬性值,除非指定了pfx屬性值
passphrase: 屬性值為一個自飛船,用于為私鑰文件或pfx文件指定密碼
cert: 屬性值為一個字符串或一個Buffer對象,用于指定從后綴名為pem的文件中讀物出來的公鑰,該屬性值為必須指定屬性值,除非指定了pfx屬性值
ca: 屬性值為一個字符串或一個Buffer對象數組,用于指定一組證書,默認屬性值為幾個著名的證書授權認證中心,比如VerlSign
crl: 屬性值為一個字符串或一個Buffer對象數組,用于指定證書吊銷列表
ciphers: 屬性值為一個字符串值,用于描述需要使用或取消使用的密碼.為了阻擋BEAST攻擊,推薦獎ciphers屬性與honorCipherOrder屬性結合使用,以指定非CBC(Cipher-block chaining,密碼分組鏈接)模式的密碼優先級,默認屬性值為AES128-GCM-SHA256: RC4: HIGH: !MD5: !aNULL: !EDH
handshakeTimeout: 屬性值為一個整數,用于指定多少秒內如果沒有完成客戶端與服務器之間的握手,則放棄本次連接,默認屬性值為120s.當在指定時間內沒有完成握手時,將處罰HTTPS服務器的clientError事件.
honorCipherOrder: 屬性值為一個布爾值,當屬性值指定為true時,服務器將密碼列表發送給客戶端,有客戶端選擇密碼,盡管該屬性值默認為false,但是仍推薦獎該屬性值設置為true,以阻止BEAST攻擊
requestCert: 屬性值為一個布爾值,當屬性值指定為true時,服務器在確認連接時要求客戶端提供證書,默認屬性值為false
rejectUnauthorized:屬性值為一個布爾值,如果屬性值為true,那么服務器拒絕任何不能提供服務器端所要求的證書的客戶端.只有當requestCert屬性值指定為true時,該屬性值才有效,默認屬性值為false
NPNProtocols: 屬性值為一個數組或一個Buffer對象,用于指定服務器端所需使用的NPN協議(這些協議應該按照其優先級排序).NPN(Next Protocol Negotiation)協議是一種用于指定服務器可以使用多種協議(包括HTTP,SPDY協議等)的協議
sessionIdContext: 屬性值指定為true,那么默認屬性值為一個MD5散列值,如果requestCert屬性值指定為false,不提供默認屬性值
5.3 創建https服務器生成私鑰key文件openssl genrsa 1024 > /root/https/private.pem
通過私鑰文件生成CSR證書簽名openssl req -new -key /root/https/private.pem -out csr.pem
通過私鑰文件和CSR證書簽名生成證書文件openssl x509 -req -days 365 -in csr.pem -signkey /root/https/private.pem -out /root/https/file.crt
app.js文件代碼
let app = require("express")(); const fs = require("fs"); const http = require("http"); const https = require("https"); const privateKey = fs.readFileSync("/root/https/private.pem", "utf8"); const certificate = fs.readFileSync("/root/https/file.crt", "utf8"); const credentials = {key: privateKey, cert: certificate}; const httpServer = http.createServer(app); const httpsServer = https.createServer(credentials, app); const PORT = 18080; const SSLPORT = 18081; httpServer.listen(PORT, function() { console.log("HTTP Server is running on: http://localhost:%s", PORT); }); httpsServer.listen(SSLPORT, function() { console.log("HTTPS Server is running on: https://localhost:%s", SSLPORT); }); // Welcome app.get("/", function(req, res) { if(req.protocol === "https") { res.status(200).send("Welcome to Safety Land!"); } else { res.status(200).send("Welcome!"); } });6. 使用HTTPS向其他網站請求數據
在HTTPS模塊中,可以使用request方法向其他使用HTTPS協議的網站請求數據
let req = https.request(options, callback(res){})
options為一個對象或字符串,用于指定請求的目標的URL地址,如果該參數值為一個字符串,將自動使用URL模塊中的parse方法轉換為一個對象.在options參數值對象或使用parse方法轉換后對象中,可以指定的屬性及屬性值如下所示
host: 用于指定域名或目標主機的IP地址,默認屬性為localhost
hostname: 用于指定域名或目標主機的IP地址,默認屬性為localhost, 如果hostname屬性值與host屬性值都被指定,優先使用hostname屬性值
port: 指定目標服務器用于HTTP客戶單連接的端口號,默認為443
method: 用于指定HTTP請求方式,默認為GET
path: 用于指定請求路徑及查詢字符串,默認為/
headers: 用于指定客戶端請求頭對象
auth: 用于指定認證信息部分,例如user:password
`agent: 用于指定用戶代理
當在options參數值對象中使用如下所示的屬性及屬性值時,不能使用全局https.Agent對象
pfx: 屬性值為一個字符串或一個Buffer對象,用于指定從pfx文件讀取出的私鑰,公鑰及證書,使用該屬性值不需要指定key屬性值,cert屬性值以及ca屬性值.
key: 屬性值為一個字符串或一個Buffer對象,用于指定從后綴名為pem的私鑰文件中讀取出來的私鑰,該屬性值為必須指定屬性值,除非指定了pfx屬性值
passphrase: 屬性值為一個字符串,用于為私鑰文件或pfx文件指定密碼
cert: 屬性值為一個字符串或一個Buffer對象,用于指定從后綴名為pem的文件中讀物出來的公鑰,該屬性值為必須指定屬性值,除非指定了pfx屬性值
ca: 屬性值為一個字符串或一個Buffer對象數組,用于指定一組證書,默認屬性值為幾個著名的證書授權認證中心,比如VerlSign
crl: 屬性值為一個字符串或一個Buffer對象數組,用于指定證書吊銷列表
ciphers: 屬性值為一個字符串值,用于描述需要使用或取消使用的密碼.為了阻擋BEAST攻擊,推薦獎ciphers屬性與honorCipherOrder屬性結合使用,以指定非CBC(Cipher-block chaining,密碼分組鏈接)模式的密碼優先級,默認屬性值為AES128-GCM-SHA256: RC4: HIGH: !MD5: !aNULL: !EDH
rejectUnauthorized:屬性值為一個布爾值,如果屬性值為true,那么服務器在客戶端建立連接后,返回響應前首先驗證客戶端提交的證書,如果驗證失敗,觸發客戶端請求對象的error事件.
7. 創建HTTPS客戶端const https = require("https"); let options = { hostname: "github.com", port: 443, path: "/", method: "GET", agent: false } let req = https.get(options, (res) => { console.log("狀態碼:" + res.statusCode); console.log("響應頭:" + JSON.stringify(res.headers)); res.setEncoding("utf8"); res.on("data", (chunk) => { console.log("響應內容:" + chunk); }); }); req.setTimeout(1000, (res) => { res.abort(); }); req.on("error", (err) => { if (err.code === "ECONNRESET") { console.log("socket端口超時"); } else { console.log("在請求數據過程中發生錯誤,錯誤代碼為:" + err.code) } }); /** * 狀態碼:200 * 響應頭:{ "date": "Sun, 25 Feb 2018 14:24:24 GMT", "content-type": "text/html; charset=utf-8", "transfer-encoding": "chunked", "connection": "close", "server": "GitHub.com", "status": "200 OK", "cache-control": "no-cache", "vary": "X-PJAX, Accept-Encoding", "x-ua-compatible": "IE=Edge,chrome=1", "set-cookie": ["logged_in=no; domain=.github.com; path=/; expires=Thu, 25 Feb 2038 14:24:24 -0000; secure; HttpOnly", "_gh_sess=eyJzZXNzaW9uX2lkIjoiMDY1YjM2ZmU4ZGM5MTFlZTliNjllMDI5ZDg0YzQ0ODUiLCJsYXN0X3JlYWRfZnJvbV9yZXBsaWNhcyI6MTUxOTU2ODY2NDUzMywiX2NzcmZfdG9rZW4iOiJ1ck5qWmZTMkpkeGpxMlN2ZzJhbklJM2pvaTJMVWEzWHcvSXEvTGtzVzBrPSJ9--8b5c0c203b3767a35f046b5ea4e375715e4d95be; path=/; secure; HttpOnly"], "x-request-id": "1faefb3e691e8adc7e1a7d727c07236f", "x-runtime": "0.050658", "expect-ct": "max-age=2592000, report-uri="https://api.github.com/_private/browser/errors"", "content-security-policy": "default-src "none"; base-uri "self"; block-all-mixed-content; child-src render.githubusercontent.com; connect-src "self" uploads.github.com status.github.com collector.githubapp.com api.github.com www.google-analytics.com github-cloud.s3.amazonaws.com github-production-repository-file-5c1aeb.s3.amazonaws.com github-production-upload-manifest-file-7fdce7.s3.amazonaws.com github-production-user-asset-6210df.s3.amazonaws.com wss://live.github.com; font-src assets-cdn.github.com; form-action "self" github.com gist.github.com; frame-ancestors "none"; img-src "self" data: assets-cdn.github.com identicons.github.com collector.githubapp.com github-cloud.s3.amazonaws.com *.githubusercontent.com; manifest-src "self"; media-src "none"; script-src assets-cdn.github.com; style-src "unsafe-inline" assets-cdn.github.com; worker-src "self"", "strict-transport-security": "max-age=31536000; includeSubdomains; preload", "x-content-type-options": "nosniff", "x-frame-options": "deny", "x-xss-protection": "1; mode=block", "x-runtime-rack": "0.058378", "x-github-request-id": "1B82:60FF:117094:18A2C0:5A92C717" } * ****/
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/92900.html
摘要:如果包含字符則將設置為。添加字段到不同的響應頭將該字段添加到不同的響應標頭如果它尚未存在。 3. response對象 3.1 是否發送了響應頭 res.headersSent布爾屬性,app是否發送了httpheaders const express = require(express); const bodyParser = require(body-parser); cons...
摘要:前端日報精選中的垃圾收集,圖文指南十個免費的前端開發工具專題之遞歸如何在鏈中共享變量基于的爬蟲框架中文譯十六進制顏色揭秘掘金掘金小書基本環境安裝小書教程中間件對閉包的一個巧妙使用簡書源碼分析掘金組件開發練習焦點圖切換前端學 2017-09-13 前端日報 精選 V8 中的垃圾收集(GC),圖文指南十個免費的web前端開發工具JavaScript專題之遞歸 · Issue #49 · m...
摘要:前端日報點關注,不迷路精選前端團隊工作流遷移記譯新語法私有屬性知乎專欄前端每周清單大前端技術生命周期模型發布面向生產環境的前端性能優化模塊實現入門淺析知乎專欄中文一個線下沙龍中國最大的前端技術社區單頁面博客從前端到后端基于 2017-06-13 前端日報 點關注,不迷路:-P 精選 ESLint v4.0.0 released - ESLint - Pluggable JavaScri...
摘要:基本介紹這是一個基本的環境搭建不同的操作系統可以選擇不同的安裝方式如果不需要太多的安裝步驟就直接在官網下載最新版安裝包進行安裝即可環境配置必須安裝的軟件更改源與更新系統首先備份下載的源配置文件運行生成緩存更新系統安裝使用安裝命 基本介紹 這是一個基本的Node.js環境搭建,不同的操作系統可以選擇不同的安裝方式 如果不需要太多的安裝步驟,就直接在Node.js官網下載最新版安裝包進行...
閱讀 3699·2021-11-11 16:55
閱讀 1646·2021-10-08 10:04
閱讀 3581·2021-09-27 13:36
閱讀 2761·2019-08-30 15:53
閱讀 1855·2019-08-30 11:17
閱讀 1259·2019-08-29 16:55
閱讀 2098·2019-08-29 13:57
閱讀 2513·2019-08-29 13:13