HTTPS服务器配置指南
很多时候,许多场合需要用到HTTPS的网页或者API,而且场景越来越多,本文主要介绍如何自建一个HTTPS的证书
1. SSL证书生成
1.1 SSL证书基础知识
SSL(Secure Sockets Layer)证书是一种数字证书,用于在网络通信中建立安全加密连接。证书包含:
- 公钥:用于加密通信数据
- 私钥:用于解密通信数据
- 证书持有者信息:确认网站身份
- 证书颁发机构(CA)信息:验证证书的合法性
在本配置中,我们将使用自签名SSL证书,这是由服务器自己签发的证书,而非由权威CA机构签发。自签名证书适用于测试环境或内部网络,但在生产环境中,建议使用受信任的CA签发的证书。
1.2 生成自签名SSL证书
以下方法同样适用于为域名生成SSL证书,只需在填写Common Name时指定域名而非IP地址。
在服务器上执行以下命令生成自签名SSL证书:
bash
# 创建SSL证书目录
mkdir -p /etc/nginx/ssl
cd /etc/nginx/ssl
# 生成私钥和证书
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt
注意:此方法完全适用于为域名生成证书。生成过程相同,唯一的区别在于填写证书信息时,将Common Name (CN) 设置为您的域名而非IP地址。
命令参数解释:
openssl:开源的SSL/TLS工具包req:创建和处理证书签名请求-x509:生成自签名证书而非证书请求-nodes:不加密私钥文件-days 365:证书有效期为365天-newkey rsa:2048:同时生成新的RSA私钥,密钥长度为2048位-keyout server.key:指定私钥文件名-out server.crt:指定证书文件名
1.3 证书生成时的注意事项
执行上述命令后,系统会提示输入一系列信息,请按照以下要求填写:
- Country Name (2 letter code) : 输入国家代码,如
CN(中国) - State or Province Name (full name) : 输入省份名称,如
Beijing - Locality Name (eg, city) : 输入城市名称,如
Beijing - Organization Name (eg, company): 输入组织或公司名称
- Organizational Unit Name (eg, section): 输入部门名称
- Common Name (e.g. server FQDN or YOUR name) : 非常重要 ,请输入您的服务器IP地址,即
你的IP - Email Address: 输入联系邮箱
注意:Common Name (CN) 必须设置为您的服务器IP地址,否则浏览器会认为证书无效
对于域名SSL证书配置:如果您是为域名(而不是IP地址)配置SSL证书,则Common Name (CN) 应填写为您的完整域名,例如example.com或www.example.com。如果需要支持多个子域名,可以使用通配符证书(如*.example.com),但这需要特定的证书生成方式。
重要:证书的CN必须与访问时使用的地址完全匹配,否则浏览器将显示证书错误警告。
1.4 证书权限设置
生成证书后,需要设置正确的权限:
bash
# 设置证书文件权限
chmod 600 server.key
chmod 644 server.crt
# 确保Nginx用户可以访问
chown nginx:nginx server.key server.crt
2. Nginx配置
2.1 基本HTTPS服务器配置
编辑Nginx配置文件,添加HTTPS服务器块:
nginx
# HTTPS服务器配置
server {
listen 443 ssl;
server_name 你的IP;
root /html;
# SSL证书配置
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
# SSL优化配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384;
ssl_session_timeout 10m;
location / {
try_files $uri $uri/ =404;
}
}
2.2 HTTP服务器配置
为了同时支持HTTP和HTTPS访问,保留80端口的独立服务器配置(不进行重定向):
nginx
server {
listen 80;
listen [::]:80;
server_name _;
root /html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}```
## 3. Nginx反向代理实例
### 3.1 端口222映射到百度示例
以下是将HTTPS 222端口映射到百度网站的配置示例:
```nginx
# HTTPS 222端口反向代理到百度
server {
listen 222 ssl;
server_name 你的IP;
# SSL证书配置(复用现有的证书)
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
# SSL优化配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384;
ssl_session_timeout 10m;
# 反向代理配置 - 将请求转发到百度
location / {
proxy_pass https://www.baidu.com/;
proxy_set_header Host www.baidu.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 处理重定向,确保重定向后仍通过代理
proxy_redirect https://www.baidu.com/ /;
# 缓存配置(可选)
proxy_cache_bypass $http_upgrade;
proxy_http_version 1.1;
proxy_set_header Connection "upgrade";
}
}
3.2 端口333映射到百度IP示例
以下是将HTTPS 333端口映射到百度IP地址的配置示例:
nginx
# HTTPS 333端口反向代理到百度IP的80端口
server {
listen 333 ssl;
server_name 你的IP;
# SSL证书配置(复用现有的证书)
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
# SSL优化配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384;
ssl_session_timeout 10m;
# 反向代理配置 - 将请求转发到百度IP的80端口
location / {
proxy_pass http://220.181.38.148:80;
proxy_set_header Host 220.181.38.148;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 处理重定向,确保重定向后仍通过代理
proxy_redirect http://220.181.38.148/ /;
# 缓存配置(可选)
proxy_cache_bypass $http_upgrade;
proxy_http_version 1.1;
proxy_set_header Connection "upgrade";
}
}
4. 完整的Nginx配置
以下是包含所有功能的完整Nginx配置:
nginx
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
# HTTPS服务器配置
server {
listen 443 ssl;
server_name 你的IP;
root /html;
# SSL证书配置
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
# SSL优化配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384;
ssl_session_timeout 10m;
location / {
try_files $uri $uri/ =404;
}
}
# HTTP服务器配置(独立配置,不重定向)
server {
listen 80;
listen [::]:80;
server_name _;
root /html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
# HTTPS 222端口反向代理到百度
server {
listen 222 ssl;
server_name 你的IP;
# SSL证书配置(复用现有的证书)
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
# SSL优化配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384;
ssl_session_timeout 10m;
# 反向代理配置 - 将请求转发到百度
location / {
proxy_pass https://www.baidu.com/;
proxy_set_header Host www.baidu.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 处理重定向,确保重定向后仍通过代理
proxy_redirect https://www.baidu.com/ /;
# 缓存配置(可选)
proxy_cache_bypass $http_upgrade;
proxy_http_version 1.1;
proxy_set_header Connection "upgrade";
}
}
# HTTPS 333端口反向代理到百度IP的80端口
server {
listen 333 ssl;
server_name 你的IP;
# SSL证书配置(复用现有的证书)
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
# SSL优化配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384;
ssl_session_timeout 10m;
# 反向代理配置 - 将请求转发到百度IP的80端口
location / {
proxy_pass http://220.181.38.148:80;
proxy_set_header Host 220.181.38.148;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 处理重定向,确保重定向后仍通过代理
proxy_redirect http://220.181.38.148/ /;
# 缓存配置(可选)
proxy_cache_bypass $http_upgrade;
proxy_http_version 1.1;
proxy_set_header Connection "upgrade";
}
}
}
5. 配置验证与重启
5.1 验证Nginx配置
bash
nginx -t
如果输出显示配置有效,则可以继续重启Nginx服务。
5.2 重启Nginx服务
bash
nginx -s reload
5.3 防火墙配置
确保防火墙开放了443、222和333端口:
bash
# 开放HTTPS端口
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --permanent --add-port=222/tcp
firewall-cmd --permanent --add-port=333/tcp
firewall-cmd --reload
6. 访问验证
配置完成后,可以通过以下URL访问服务器:
- 主站点:
https://你的IP/ - 百度反向代理(域名):
https://你的IP:222/ - 百度反向代理(IP):
https://你的IP:333/
注意:由于使用的是自签名证书,浏览器会显示安全警告,这是正常现象,点击继续访问即可。