在CentOS系統下為Node.js應用程序配置SSL證書,可以按照以下步驟進行操作。本文將介紹如何生成自簽名證書以及如何使用Let’s Encrypt免費獲取受信任的SSL證書。
如果尚未安裝Node.js,可以使用以下命令通過NodeSource倉庫安裝最新版本:
# 導入NodeSource倉庫的GPG密鑰
curl -sL https://rpm.nodesource.com/setup_16.x | sudo bash -
# 安裝Node.js
sudo yum install -y nodejs
注意:將setup_16.x中的版本號替換為你需要的Node.js版本,例如setup_14.x或setup_18.x。
使用OpenSSL生成自簽名證書和私鑰:
# 創建一個目錄用于存放證書文件
sudo mkdir /etc/ssl/certs/myapp
# 進入目錄
cd /etc/ssl/certs/myapp
# 生成私鑰(2048位)
sudo openssl genrsa -out myapp.key 2048
# 生成證書簽名請求(CSR)
sudo openssl req -new -key myapp.key -out myapp.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/CN=localhost"
# 生成自簽名證書
sudo openssl x509 -req -days 365 -in myapp.csr -signkey myapp.key -out myapp.crt
說明:
/C=CN/ST=Beijing/L=Beijing/O=MyCompany/CN=localhost中的信息根據實際情況修改,尤其是CN(Common Name)應與你的域名或服務器地址匹配。假設你有一個使用Express框架的Node.js應用,可以按照以下方式配置SSL:
const fs = require('fs');
const https = require('https');
const express = require('express');
const app = express();
// 讀取證書文件
const options = {
key: fs.readFileSync('/etc/ssl/certs/myapp/myapp.key', 'utf8'),
cert: fs.readFileSync('/etc/ssl/certs/myapp/myapp.crt', 'utf8')
};
// 定義路由
app.get('/', (req, res) => {
res.send('Hello, SSL!');
});
// 啟動HTTPS服務器
https.createServer(options, app).listen(443, () => {
console.log('HTTPS Server running on port 443');
});
說明:
在瀏覽器中訪問https://your_server_ip_or_domain,你應該會看到安全警告,因為使用的是自簽名證書。繼續訪問以確認應用正常運行。
Let’s Encrypt提供免費的SSL/TLS證書,適用于生產環境??梢允褂肅ertbot工具來自動化證書的申請和續期過程。
首先,確保已安裝EPEL倉庫:
sudo yum install epel-release
然后,安裝Certbot及其Node.js插件:
sudo yum install certbot python3-certbot-nodejs
運行Certbot以獲取證書。假設你的Node.js應用運行在localhost的443端口:
sudo certbot --nodejs --http-01-port 80 -d localhost
說明:
--http-01-port 80:Certbot將通過HTTP-01挑戰驗證域名所有權,需要訪問80端口。-d localhost:指定要申請證書的域名。按照提示完成驗證過程。Certbot會自動配置Nginx或Apache來處理HTTP-01挑戰。如果你使用的是Node.js直接處理HTTP請求,可以考慮使用certbot的HTTP-01插件或手動配置。
Certbot會將證書和私鑰文件存放在/etc/letsencrypt/live/localhost/目錄下。配置Node.js應用使用這些文件:
const fs = require('fs');
const https = require('https');
const express = require('express');
const app = express();
// 讀取Certbot生成的證書文件
const options = {
key: fs.readFileSync('/etc/letsencrypt/live/localhost/privkey.pem', 'utf8'),
cert: fs.readFileSync('/etc/letsencrypt/live/localhost/fullchain.pem', 'utf8')
};
// 定義路由
app.get('/', (req, res) => {
res.send('Hello, Let\'s Encrypt SSL!');
});
// 啟動HTTPS服務器
https.createServer(options, app).listen(443, () => {
console.log('HTTPS Server running on port 443');
});
Let’s Encrypt證書有效期為90天,Certbot可以自動續期。確保設置定時任務以自動執行續期:
sudo crontab -e
添加以下行以每天檢查并續期證書:
0 0,12 * * * certbot renew --post-hook "systemctl reload nginx"
注意:如果使用的是Node.js直接處理HTTP請求,而不是反向代理(如Nginx或Apache),需要確保在續期后重新加載Node.js應用??梢允褂?code>systemd服務來實現這一點。
在瀏覽器中訪問https://localhost,應該能夠正常訪問且沒有安全警告(因為localhost被視為受信任的)。
在生產環境中,通常建議使用Nginx或Apache作為反向代理來處理SSL終端,而不是讓Node.js應用直接處理HTTPS連接。這不僅提高了安全性,還提升了性能和可維護性。
sudo yum install nginx
編輯Nginx配置文件(例如/etc/nginx/nginx.conf或創建一個新的站點配置文件 /etc/nginx/conf.d/myapp.conf):
server {
listen 80;
server_name your_server_ip_or_domain;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
proxy_pass http://localhost:3000; # Node.js應用監聽的端口
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
sudo systemctl start nginx
sudo systemctl enable nginx
使用Certbot通過Nginx獲取證書:
sudo certbot --nginx -d your_server_ip_or_domain
Certbot會自動修改Nginx配置文件以處理SSL,并重新加載Nginx服務。
確保Node.js應用監聽在非SSL端口(例如3000):
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello via Nginx and Let\'s Encrypt SSL!');
});
app.listen(3000, () => {
console.log('Node.js app running on port 3000');
});
Certbot會自動處理Nginx配置的SSL證書續期。確保/etc/letsencrypt/renewal/your_server_ip_or_domain.conf文件中包含重新加載Nginx的指令。
以上介紹了在CentOS系統下為Node.js應用配置SSL證書的幾種方法:
根據你的具體需求和環境選擇合適的方法進行配置。