自建HTTPS证书

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.comwww.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/

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

相关推荐
崔庆才丨静觅13 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby606114 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了14 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅14 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅15 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅15 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment15 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅15 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊15 小时前
jwt介绍
前端
爱敲代码的小鱼15 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax