# Node JS與Apache2設定Http與Https ###### tags: `Linux` `Ubuntu` `SSL` `Node JS` `Apache` ## Node Js 配置 HTTPS ### 編輯index.js ```javascript= const express = require('express'); const app = express(); const fs = require('fs'); const https = require('https'); const ipfilter = require('express-ipfilter').IpFilter; const ips = ['::ffff:127.0.0.1']; app.use(ipfilter(ips, { mode: 'allow' })); const server = https.createServer({ key: fs.readFileSync([path_of_private.key], 'utf8'), cert: fs.readFileSync([path_of_certificate.crt], 'utf8') }, app); server.listen(3001, function() { console.log('listening HTTPS on 3001 port'); }); app.listen(3000, function () { //reqLogger.info('NCDR_AI listening on port 3000!'); console.log('listening HTTP on 3000 port'); }); ``` ## 整合 Node Js 與 Systemd ### 1.參考自訂服務教學,自己建立一個 Systemd 服務設定檔 ```shell= sudo vim /etc/systemd/system/[ServiceName].service ``` ```shell= [Unit] After=network.target Description=[ServiceName] [Service] Type=simple Environment=[environment_variable] # 執行服務的使用者 User=[user_who_execute_this_service] # 啟動服務指令 ExecStart=[path_of_nodejs_index.js] # 不正常停止時重新啟動 Restart=on-failure [Install] WantedBy=multi-user.target ``` ### 2.變更權限 ```shell= sudo chmod 644 /etc/systemd/system/[ServiceName].service ``` ### 3.重新載入 Systemd 設定檔 ```shell= sudo systemctl daemon-reload ``` ### 4.啟動自訂的 伺服器 ```shell= sudo systemctl start [ServiceName] ``` ### 5.查看伺服器狀態 ```shell= sudo systemctl status [ServiceName] ``` ## Apache2 Proxy HTTPS ### 1.將Apache2的 proxy & proxy_http模組啟用 ```shell= sudo a2enmod proxy sudo a2enmod proxy_http sudo a2enmod ssl ``` ### 2.重新啟動 apache以完成設定 ```shell= sudo service apache2 restart ``` ### 3.編輯 /etc/apache2/sites-enabled/000-default.conf轉發Node Js的port ``` <VirtualHost *:443> ServerName [web.domain.com] ServerAlias [domain.com] #其他網址也可以連到同一個目錄 SSLEngine On SSLProxyEngine on SSLProxyVerify none SSLProxyCheckPeerCN off SSLProxyCheckPeerName off SSLProxyCheckPeerExpire off SSLCertificateFile [path_of_certificate.crt] SSLCertificateKeyFile [path_of_private.key] SSLCertificateChainFile [path_of_ca_bundle.crt] ProxyPass / https://localhost:3001/ ProxyPassReverse / https://localhost:3001/ <Proxy *> Order deny,allow Deny from all Allow from [ip] </Proxy> </VirtualHost> <VirtualHost *:80> ServerName www.example.com ServerAlias example.com #其他網址也可以連到同一個目錄 ProxyPass http://localhost:3000/ ProxyPassReverse http://localhost:3000/ <Proxy *> Order deny,allow Deny from all Allow from [ip] </Proxy> </VirtualHost> ``` ### 4.不顯示server的詳細資料 編輯/etc/apache2/apache2.conf 在最後面加上 ``` ServerTokens ProductOnly ServerSignature Off ``` ## Nodejs cipher(待補充) https://ciphersuite.info/ https://node-security.com/posts/express-https-server/ ```javascript= const https = require('https'); var options = { key: fs.readFileSync('./ssl/gistw/server.key'), cert: fs.readFileSync('./ssl/gistw/server.crt'), maxVersion: 'TLSv1.3', minVersion: 'TLSv1.2', ciphers: 'TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256', }; https.createServer(options,function(req,res){}).listen(443) ``` ## Apache2 Headers安全性 ### 1. 啟用header 修改模組 ``` sudo a2enmod headers ``` ### 2. 編輯 /etc/apache2/sites-enabled/000-default.conf ``` <VirtualHost *:443> ServerName [web.domain.com] Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" Header always set X-Content-Type-Options "nosniff" Header always set Content-Security-Policy "default-src 'self';" Header always set X-Frame-Options "SAMEORIGIN" Header always set Referrer-Policy "strict-origin" Header always set Permissions-Policy "geolocation=(),midi=(),sync-xhr=(),microphone=(),camera=(),magnetometer=(),gyroscope=(),fullscreen=(self),payment=()" <Proxy *> Order deny,allow Deny from all Allow from [ip] </Proxy> </VirtualHost> ```