Nodejs多站點(diǎn)切換Htpps協(xié)議詳解及簡(jiǎn)單實(shí)例
Nodejs多站點(diǎn)切換Htpps協(xié)議詳解
純屬趕個(gè)時(shí)髦,折騰了兩天終于將個(gè)人小站的全部服務(wù)由http協(xié)議切換到了https,整個(gè)過(guò)程雖然也不算太麻煩,但也不得不承認(rèn),個(gè)人對(duì)互聯(lián)網(wǎng)安全這方面的知識(shí)確認(rèn)比較欠缺;
Letsencrypt是由Mozilla、思科和EFF等組織發(fā)起的,免費(fèi)向廣大互聯(lián)網(wǎng)網(wǎng)站提供SSL證書(shū),目的在于加速推進(jìn)互聯(lián)網(wǎng)由Http過(guò)渡到Https,很高興周末能夠與其不期而遇,這對(duì)于一個(gè)互聯(lián)網(wǎng)散戶(hù)來(lái)說(shuō),絕對(duì)是大大的福利,所以決定乘周末折騰一番:先搞到證書(shū),再改程序;
獲取letsencrypt頒發(fā)的免費(fèi)的SSL證書(shū)也是相對(duì)比較簡(jiǎn)單的,我還是個(gè)windows服務(wù)器,目前沒(méi)能耐去折騰Linux,所以要下載letsencrypt-win-simple的安裝包,運(yùn)行l(wèi)etsencrypt.exe就開(kāi)始了:第一步輸入郵箱,如果不是第一次申請(qǐng)會(huì)跳過(guò)前兩步,然后有5個(gè)選項(xiàng)供你選擇,一般選M,輸入M,Enter就到了讓你輸入需要證書(shū)的域,接著輸入這個(gè)域?qū)?yīng)的站點(diǎn)的根目錄,輸入一個(gè)線(xiàn)上運(yùn)行的域即可,指定的根目錄需要是能夠直接訪(fǎng)問(wèn)的,因?yàn)樗麜?huì)訪(fǎng)問(wèn)你輸入的域以及根目錄下的某個(gè)文件,我很納悶他是怎么在我站點(diǎn)新建的那些目錄和驗(yàn)證文件,也就是說(shuō),他會(huì)在你指定的目錄下新建兩層目錄和一個(gè)他需要訪(fǎng)問(wèn)的驗(yàn)證文件,準(zhǔn)確的說(shuō)他要知道這個(gè)亂碼文件里的一段亂碼內(nèi)容來(lái)完成認(rèn)證;完成認(rèn)證后就會(huì)在C:\Users\Administrator\AppData\Roaming\letsencrypt-win-simple\httpsacme-v01.api.letsencrypt.org目錄下生成證書(shū)文件;接下來(lái)的步驟就相對(duì)可以隨意些了;
如果你就一個(gè)主域和一個(gè)站點(diǎn),那么就可以拿證書(shū)去改程序了;
如果真的這樣就完事了,那么是否感覺(jué)太快了,以致于沒(méi)啥體驗(yàn)了;按照上面的步驟一個(gè)域下面可以生成一次證書(shū),那么重復(fù)這些步驟,生成多個(gè)域下面的多個(gè)證書(shū)自然也是可以的了,問(wèn)題在于必要性,或許折騰就是在為你的天真弱知買(mǎi)單;
Ok,我很天真;我為主域和兩個(gè)二級(jí)域各生成了一次證書(shū),接下來(lái)改程序咯!
我的站點(diǎn)是用Nodejs搭建的,內(nèi)部由http-proxy代理來(lái)串起來(lái)的3個(gè)小站點(diǎn),沒(méi)有使用Nginx完全是為了以業(yè)余的玩性多去理解一點(diǎn)Nodejs;接下來(lái)主站監(jiān)聽(tīng)443端口,二級(jí)站點(diǎn)由http-proxy代理分發(fā);
var https=require('https'); var http=require('http'); var fs=require('fs'); var server = http.createServer(app); var httpsServer=https.createServer({ key: fs.readFileSync('./privatekey.pem'), cert: fs.readFileSync('./certificate.pem') },app); httpsServer.listen(443); server.listen(80);
代理中間件大概的樣子:
app.use(function(req,res,next){ var proxy = httpProxy.createProxyServer({ headers:{ 'x-forward-ip':req.ip.match(/([\w\.]+)/g)[1] } }); proxy.on('error', function (err, req, res) { res.writeHead(500, { 'Content-Type': 'text/plain' }); res.end('Something went wrong.'); }); switch (req.headers.host){ case 'm.famanoder.cn': proxy.web(req, res, { target: 'https://localhost:2333' }); break; case 'cdn.famanoder.cn': proxy.web(req, res, { target: 'https://localhost:3222' }); break; default: next(); } });
這樣主域用https訪(fǎng)問(wèn)一點(diǎn)問(wèn)題沒(méi)有,問(wèn)題在于二級(jí)站點(diǎn)的訪(fǎng)問(wèn)瀏覽器始終會(huì)提示網(wǎng)站的證書(shū)不受信任,沒(méi)辦法,只好這樣訪(fǎng)問(wèn)二級(jí)站點(diǎn):https://cdn.famanoder.com:4000/,是的,帶端口訪(fǎng)問(wèn)當(dāng)然沒(méi)問(wèn)題,這樣的話(huà)就沒(méi)走代理了,可始終感覺(jué)不太方便,別扭,只能重想辦法了;
又是一個(gè)機(jī)緣巧合,準(zhǔn)備起身下班時(shí)看到了一篇文章,除了標(biāo)題,全英文的,但直覺(jué)告訴了我,內(nèi)容有我想要的東西;一臉懵逼的走馬觀(guān)花的看了一遍,果然豁然開(kāi)朗了:在命令行里啟動(dòng)letsencrypt加--san參數(shù)來(lái)申請(qǐng)證書(shū),可以為一個(gè)域綁定多個(gè)附帶的域,也就說(shuō)多個(gè)域可以共用同一套證書(shū),那么代理的問(wèn)題自然就解開(kāi)了;輸入主域后,再輸入多個(gè)域用逗號(hào)隔開(kāi),然后他會(huì)依次去每個(gè)域驗(yàn)證,最后生成共用的一套證書(shū);于是我決定了:今晚加餐!
Letsencrypt的驗(yàn)證方式為訪(fǎng)問(wèn)這個(gè)格式的地址:
http://cdn.famanoder.com/.well-known/acme-challenge/RHha4Dx3YaUzi7tu_C6p9mPk-TNpuLVN5hMQro2N1_Q
他會(huì)依次訪(fǎng)問(wèn)每個(gè)域的這個(gè)亂碼文件,估計(jì)這個(gè)文件里有他想要的另一段亂碼內(nèi)容,打開(kāi)看看就知道了;主站用的Express,cdn站點(diǎn)使用的原生Nodejs,兩個(gè)站點(diǎn)的訪(fǎng)問(wèn)結(jié)果都是直接下載了文件,可能MIME頭要改改,因?yàn)楝F(xiàn)在是多個(gè)域要訪(fǎng)問(wèn)同一個(gè)目錄下的文件,索性在填寫(xiě)根目錄時(shí)別填真正的根目錄,而是填一個(gè)多個(gè)根目錄共同所屬的目錄,比如D:\,修改路由文件如下:
// www(Express) app.get('/.well-known/acme-challenge/:ids',function(req,res,next){ require('fs').readFile('D:/.well-known/acme-challenge/'+req.params.ids,function(err,data){ err&&console.log(err); res.end(data); }); }); // www(Koa2) router.get('/.well-known/acme-challenge/:ids',async (cx,next)=>{ await next(); let data=await fs.readFileSync('D:'+cx.request.url); cx.response.body=data; }); // cdn if (req.url.indexOf('acme-challenge')!=-1) { var pathname=url.parse(req.url).pathname; fs.readFile('D:'+pathname,function(err,data){ err&&console.log(err); res.writeHead(200,{ 'content-type':'text/html' }); res.end(data); return false; }); } return false;
這樣,多個(gè)域依次驗(yàn)證通過(guò)了,生成了同一套證書(shū),有效期3個(gè)月,有效期內(nèi)系統(tǒng)正常的話(huà),3個(gè)月后會(huì)自動(dòng)續(xù)期;那么就可以繼續(xù)走h(yuǎn)ttp-proxy代理了,二級(jí)站點(diǎn)的https訪(fǎng)問(wèn)也不需要帶端口了;接下來(lái)就是替換所有的http為https了,或者直接去掉協(xié)議,//www.famanoder.com格式也可以,瀏覽器會(huì)自動(dòng)識(shí)別采用相應(yīng)的協(xié)議;
由于Letsencrypt的驗(yàn)證域必須是線(xiàn)上可訪(fǎng)問(wèn)的,所以本地開(kāi)發(fā)要另外配置,比如用Git自帶的openssl生成一套證書(shū)作為開(kāi)發(fā)調(diào)試時(shí)用也是可以的,只是瀏覽器會(huì)提示證書(shū)不受信用;
總之,說(shuō)復(fù)雜也不復(fù)雜,說(shuō)簡(jiǎn)單也不是那么簡(jiǎn)單,事情就是那么個(gè)事情,折騰就是為天真弱知買(mǎi)單嘛!
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
nodeJS(express4.x)+vue(vue-cli)構(gòu)建前后端分離實(shí)例(帶跨域)
這篇文章主要介紹了nodeJS(express4.x)+vue(vue-cli)構(gòu)建前后端分離實(shí)例(帶跨域) ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07在Node.js中使用Express框架和Mongoose庫(kù)實(shí)現(xiàn)視頻評(píng)論功能
本文我們將詳細(xì)介紹如何在Node.js應(yīng)用中使用Express框架和Mongoose庫(kù)來(lái)實(shí)現(xiàn)一個(gè)視頻評(píng)論功能,這個(gè)功能允許用戶(hù)對(duì)視頻內(nèi)容添加評(píng)論,并將評(píng)論數(shù)實(shí)時(shí)更新,以下是逐步的實(shí)現(xiàn)過(guò)程,包括代碼示例和說(shuō)明,需要的朋友可以參考下2024-04-04node.js中的http.request.end方法使用說(shuō)明
這篇文章主要介紹了node.js中的http.request.end方法使用說(shuō)明,本文介紹了http.request.end的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下2014-12-12node命令行工具之實(shí)現(xiàn)項(xiàng)目工程自動(dòng)初始化的標(biāo)準(zhǔn)流程
這篇文章主要介紹了node命令行工具之實(shí)現(xiàn)項(xiàng)目工程自動(dòng)初始化的標(biāo)準(zhǔn)流程 ,本文分步驟給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08DevEco?Studio設(shè)置Nodejs提示路徑只能包含英文、數(shù)字、下劃線(xiàn)等解決辦法
這篇文章主要給大家介紹了關(guān)于DevEco?Studio設(shè)置Nodejs提示路徑只能包含英文、數(shù)字、下劃線(xiàn)等的解決辦法,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-01-01Egret引擎開(kāi)發(fā)指南之創(chuàng)建項(xiàng)目
Egret Engine(白鷺引擎)是一款使用TypeScript語(yǔ)言構(gòu)建的開(kāi)源免費(fèi)的移動(dòng)游戲引擎。白鷺引擎的核心定位是開(kāi)放,高效,優(yōu)雅。通過(guò)它,你可以快速地創(chuàng)建HTML5類(lèi)型的移動(dòng)游戲,也可以將游戲項(xiàng)目編譯輸出成為目標(biāo)移動(dòng)平臺(tái)的原生游戲應(yīng)用。2014-09-09關(guān)于Mac下安裝nodejs、npm和cnpm的教程
本文通過(guò)圖文并茂的形式給大家介紹了Mac下安裝nodejs、npm和cnpm的教程,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2018-04-04一次NodeJS內(nèi)存泄漏排查的實(shí)戰(zhàn)記錄
這篇文章主要給大家介紹了一次NodeJS內(nèi)存泄漏排查的實(shí)戰(zhàn)記錄,文中給出了詳細(xì)的排查過(guò)程以及內(nèi)存泄漏的解決方法,大家可以學(xué)習(xí)一下以備不時(shí)之需,需要的朋友可以參考下2022-03-03