126
搜狐
散戶福利!Nodejs多站點切換Htpps協議
作者:花滿樓
記錄一些要點,以便於常記起時有據可循!
純屬趕個時髦,折騰了兩天終於將個人小站的全部服務由http協議切換到了https,整個過程雖然也不算太麻煩,但也不得不承認,個人對互聯網安全這方麵的知識確認比較欠缺;
Letsencrypt是由Mozilla、思科和EFF等組織發起的,免費向廣大互聯網網站提供SSL證書,目的在於加速推進互聯網由Http過渡到Https,很高興周末能夠與其不期而遇,這對於一個互聯網散戶來說,絕對是大大的福利,所以決定乘周末折騰一番:先搞到證書,再改程序;
獲取letsencrypt頒發的免費的SSL證書也是相對比較簡單的,我還是個windows服務器,目前沒能耐去折騰Linux,所以要下載letsencrypt-win-simple的安裝包,運行letsencrypt.exe就開始了:第一步輸入郵箱,如果不是第一次申請會跳過前兩步,然後有5個選項供你選擇,一般選M,輸入M,Enter就到了讓你輸入需要證書的域,接著輸入這個域對應的站點的根目錄,輸入一個線上運行的域即可,指定的根目錄需要是能夠直接訪問的,因為他會訪問你輸入的域以及根目錄下的某個文件,我很納悶他是怎麼在我站點新建的那些目錄和驗證文件,也就是說,他會在你指定的目錄下新建兩層目錄和一個他需要訪問的驗證文件,準確的說他要知道這個亂碼文件裏的一段亂碼內容來完成認證;完成認證後就會在C:\Users\Administrator\AppData\Roaming\letsencrypt-win-simple\httpsacme-v01.api.letsencrypt.org目錄下生成證書文件;接下來的步驟就相對可以隨意些了;
如果你就一個主域和一個站點,那麼就可以拿證書去改程序了;
如果真的這樣就完事了,那麼是否感覺太快了,以致於沒啥體驗了;按照上麵的步驟一個域下麵可以生成一次證書,那麼重複這些步驟,生成多個域下麵的多個證書自然也是可以的了,問題在於必要性,或許折騰就是在為你的天真弱知買單;
Ok,我很天真;我為主域和兩個二級域各生成了一次證書,接下來改程序咯!
我的站點是用Nodejs搭建的,內部由http-proxy代理來串起來的3個小站點,沒有使用Nginx完全是為了以業餘的玩性多去理解一點Nodejs;接下來主站監聽443端口,二級站點由http-proxy代理分發;
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訪問一點問題沒有,問題在於二級站點的訪問瀏覽器始終會提示網站的證書不受信任,沒辦法,隻好這樣訪問二級站點:https://cdn.famanoder.com:4000/,是的,帶端口訪問當然沒問題,這樣的話就沒走代理了,可始終感覺不太方便,別扭,隻能重想辦法了;
又是一個機緣巧合,準備起身下班時看到了一篇文章,除了標題,全英文的,但直覺告訴了我,內容有我想要的東西;一臉懵逼的走馬觀花的看了一遍,果然豁然開朗了:在命令行裏啟動letsencrypt加--san參數來申請證書,可以為一個域綁定多個附帶的域,也就說多個域可以共用同一套證書,那麼代理的問題自然就解開了;輸入主域後,再輸入多個域用逗號隔開,然後他會依次去每個域驗證,最後生成共用的一套證書;於是我決定了:今晚加餐!
Letsencrypt的驗證方式為訪問這個格式的地址:
https://cdn.famanoder.com/.well-known/acme-challenge/RHha4Dx3YaUzi7tu_C6p9mPk-TNpuLVN5hMQro2N1_Q
他會依次訪問每個域的這個亂碼文件,估計這個文件裏有他想要的另一段亂碼內容,打開看看就知道了;主站用的Express,cdn站點使用的原生Nodejs,兩個站點的訪問結果都是直接下載了文件,可能MIME頭要改改,因為現在是多個域要訪問同一個目錄下的文件,索性在填寫根目錄時別填真正的根目錄,而是填一個多個根目錄共同所屬的目錄,比如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個月,有效期內係統正常的話,3個月後會自動續期;那麼就可以繼續走http-proxy代理了,二級站點的https訪問也不需要帶端口了;接下來就是替換所有的http為https了,或者直接去掉協議,//www.famanoder.com格式也可以,瀏覽器會自動識別采用相應的協議;
由於Letsencrypt的驗證域必須是線上可訪問的,所以本地開發要另外配置,比如用Git自帶的openssl生成一套證書作為開發調試時用也是可以的,隻是瀏覽器會提示證書不受信用;
總之,說複雜也不複雜,說簡單也不是那麼簡單,事情就是那麼個事情,折騰就是為天真弱知買單嘛!
如果你已在路上,就勇敢的向前吧!
最後更新:2017-10-08 02:24:12
上一篇:
老股民不外傳主力吸籌的三大秘訣,散戶看完不在被套
下一篇:
一個頂尖私募自曝捕捉黑馬的3大要訣,散戶這樣操作就穩贏了!
就在剛剛10:35,A股平地兩聲驚雷引千股爆漲:同洲電子
就在剛剛10:37,A股平地兩聲驚雷引千股爆漲:中遠海科
就在剛剛10:38,A股平地兩聲驚雷引千股爆漲:中孚信息
就在剛剛10:39,A股平地兩聲驚雷引千股爆漲:上港集團
剛剛11:34分,A股五雷轟頂炸開牛市漲停潮:龍頭股份
剛剛11:39分,A股五雷轟頂炸開牛市漲停潮:泰嘉股份
剛剛11:40分,A股五雷轟頂炸開牛市漲停潮:同洲電子
剛剛11:35分,A股五雷轟頂炸開牛市漲停潮:旭升股份
A股大事突發!周末深夜A股爆出罕見大動作,下周大盤必定突破3800點?
周末晚間!A股爆出罕見大動作,下周上證指數必須突破3800點?