最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Nodejs多站點切換Htpps協(xié)議詳解及簡單實例

 更新時間:2017年02月23日 09:00:59   投稿:lqh  
這篇文章主要介紹了Nodejs多站點切換Htpps協(xié)議詳解及簡單實例的相關(guān)資料,需要的朋友可以參考下

Nodejs多站點切換Htpps協(xié)議詳解

純屬趕個時髦,折騰了兩天終于將個人小站的全部服務(wù)由http協(xié)議切換到了https,整個過程雖然也不算太麻煩,但也不得不承認(rèn),個人對互聯(lián)網(wǎng)安全這方面的知識確認(rèn)比較欠缺;

Letsencrypt是由Mozilla、思科和EFF等組織發(fā)起的,免費向廣大互聯(lián)網(wǎng)網(wǎng)站提供SSL證書,目的在于加速推進(jìn)互聯(lián)網(wǎng)由Http過渡到Https,很高興周末能夠與其不期而遇,這對于一個互聯(lián)網(wǎng)散戶來說,絕對是大大的福利,所以決定乘周末折騰一番:先搞到證書,再改程序;

獲取letsencrypt頒發(fā)的免費的SSL證書也是相對比較簡單的,我還是個windows服務(wù)器,目前沒能耐去折騰Linux,所以要下載letsencrypt-win-simple的安裝包,運行l(wèi)etsencrypt.exe就開始了:第一步輸入郵箱,如果不是第一次申請會跳過前兩步,然后有5個選項供你選擇,一般選M,輸入M,Enter就到了讓你輸入需要證書的域,接著輸入這個域?qū)?yīng)的站點的根目錄,輸入一個線上運行的域即可,指定的根目錄需要是能夠直接訪問的,因為他會訪問你輸入的域以及根目錄下的某個文件,我很納悶他是怎么在我站點新建的那些目錄和驗證文件,也就是說,他會在你指定的目錄下新建兩層目錄和一個他需要訪問的驗證文件,準(zhǔn)確的說他要知道這個亂碼文件里的一段亂碼內(nèi)容來完成認(rèn)證;完成認(rèn)證后就會在C:\Users\Administrator\AppData\Roaming\letsencrypt-win-simple\httpsacme-v01.api.letsencrypt.org目錄下生成證書文件;接下來的步驟就相對可以隨意些了;

如果你就一個主域和一個站點,那么就可以拿證書去改程序了;

如果真的這樣就完事了,那么是否感覺太快了,以致于沒啥體驗了;按照上面的步驟一個域下面可以生成一次證書,那么重復(fù)這些步驟,生成多個域下面的多個證書自然也是可以的了,問題在于必要性,或許折騰就是在為你的天真弱知買單;

Ok,我很天真;我為主域和兩個二級域各生成了一次證書,接下來改程序咯!

我的站點是用Nodejs搭建的,內(nèi)部由http-proxy代理來串起來的3個小站點,沒有使用Nginx完全是為了以業(yè)余的玩性多去理解一點Nodejs;接下來主站監(jiān)聽443端口,二級站點由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訪問一點問題沒有,問題在于二級站點的訪問瀏覽器始終會提示網(wǎng)站的證書不受信任,沒辦法,只好這樣訪問二級站點:https://cdn.famanoder.com:4000/,是的,帶端口訪問當(dāng)然沒問題,這樣的話就沒走代理了,可始終感覺不太方便,別扭,只能重想辦法了;

又是一個機緣巧合,準(zhǔn)備起身下班時看到了一篇文章,除了標(biāo)題,全英文的,但直覺告訴了我,內(nèi)容有我想要的東西;一臉懵逼的走馬觀花的看了一遍,果然豁然開朗了:在命令行里啟動letsencrypt加--san參數(shù)來申請證書,可以為一個域綁定多個附帶的域,也就說多個域可以共用同一套證書,那么代理的問題自然就解開了;輸入主域后,再輸入多個域用逗號隔開,然后他會依次去每個域驗證,最后生成共用的一套證書;于是我決定了:今晚加餐!

Letsencrypt的驗證方式為訪問這個格式的地址:

http://cdn.famanoder.com/.well-known/acme-challenge/RHha4Dx3YaUzi7tu_C6p9mPk-TNpuLVN5hMQro2N1_Q

他會依次訪問每個域的這個亂碼文件,估計這個文件里有他想要的另一段亂碼內(nèi)容,打開看看就知道了;主站用的Express,cdn站點使用的原生Nodejs,兩個站點的訪問結(jié)果都是直接下載了文件,可能MIME頭要改改,因為現(xiàn)在是多個域要訪問同一個目錄下的文件,索性在填寫根目錄時別填真正的根目錄,而是填一個多個根目錄共同所屬的目錄,比如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;

  這樣,多個域依次驗證通過了,生成了同一套證書,有效期3個月,有效期內(nèi)系統(tǒng)正常的話,3個月后會自動續(xù)期;那么就可以繼續(xù)走h(yuǎn)ttp-proxy代理了,二級站點的https訪問也不需要帶端口了;接下來就是替換所有的http為https了,或者直接去掉協(xié)議,//www.famanoder.com格式也可以,瀏覽器會自動識別采用相應(yīng)的協(xié)議;

由于Letsencrypt的驗證域必須是線上可訪問的,所以本地開發(fā)要另外配置,比如用Git自帶的openssl生成一套證書作為開發(fā)調(diào)試時用也是可以的,只是瀏覽器會提示證書不受信用;

總之,說復(fù)雜也不復(fù)雜,說簡單也不是那么簡單,事情就是那么個事情,折騰就是為天真弱知買單嘛!

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • 基于游標(biāo)的分頁接口實現(xiàn)代碼示例

    基于游標(biāo)的分頁接口實現(xiàn)代碼示例

    這篇文章主要給大家介紹了關(guān)于基于游標(biāo)的分頁接口實現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • node.js中的path.basename方法使用說明

    node.js中的path.basename方法使用說明

    這篇文章主要介紹了node.js中的path.basename方法使用說明,本文介紹了path.basename的方法說明、語法、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • pnpm workspace管理monorepo項目使用過程詳解

    pnpm workspace管理monorepo項目使用過程詳解

    這篇文章主要為大家介紹了pnpm workspace管理monorepo項目使用過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • 基于NodeJS開發(fā)釘釘回調(diào)接口實現(xiàn)AES-CBC加解密

    基于NodeJS開發(fā)釘釘回調(diào)接口實現(xiàn)AES-CBC加解密

    這篇文章主要介紹了基于NodeJS開發(fā)釘釘回調(diào)接口 實現(xiàn)AES-CBC加解密,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Node.js使用SQLite數(shù)據(jù)庫方法大全

    Node.js使用SQLite數(shù)據(jù)庫方法大全

    Node.js是一種流行的JavaScript運行時,提供了許多有用的模塊和庫來構(gòu)建Web應(yīng)用程序,而SQLite是一種嵌入式關(guān)系型數(shù)據(jù)庫,它可以運行在各種操作系統(tǒng)上,包括Windows、Linux和Mac OS X等,在Node.js中,可以通過安裝sqlite3模塊來訪問SQLite數(shù)據(jù)庫
    2023-10-10
  • 詳解用node.js實現(xiàn)簡單的反向代理

    詳解用node.js實現(xiàn)簡單的反向代理

    本篇文章主要介紹了詳解用node.js實現(xiàn)簡單的反向代理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • node.js中的console.assert方法使用說明

    node.js中的console.assert方法使用說明

    這篇文章主要介紹了node.js中的console.assert方法使用說明,本文介紹了console.assert的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 使用NestJS開發(fā)Node.js應(yīng)用的方法

    使用NestJS開發(fā)Node.js應(yīng)用的方法

    這篇文章主要介紹了使用NestJS開發(fā)Node.js應(yīng)用的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • Node.js使用supervisor進(jìn)行開發(fā)中調(diào)試的方法

    Node.js使用supervisor進(jìn)行開發(fā)中調(diào)試的方法

    今天小編就為大家分享一篇關(guān)于Node.js使用supervisor進(jìn)行開發(fā)中調(diào)試的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • 手把手教你實現(xiàn) Promise的使用方法

    手把手教你實現(xiàn) Promise的使用方法

    這篇文章主要介紹了手把手教你實現(xiàn) Promise的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09

最新評論

荆州市| 如东县| 湖州市| 游戏| 梁河县| 抚松县| 密山市| 农安县| 泰州市| 济源市| 松溪县| 汉川市| 凤翔县| 霍林郭勒市| 高邑县| 牡丹江市| 浦东新区| 八宿县| 英德市| 白水县| 鄂州市| 登封市| 彭泽县| 晋州市| 巴青县| 瑞金市| 桑植县| 静海县| 盐津县| 木兰县| 泽库县| 安岳县| 庆云县| 长顺县| 贵溪市| 瑞金市| 枣阳市| 巍山| 河东区| 隆子县| 梅州市|