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/ 
注意:由于使用的是自签名证书,浏览器会显示安全警告,这是正常现象,点击继续访问即可。