OpenSSL 生成免费ip证书以及nginx前后端配置

没有域名,但是又需要https,可以使用OpenSSL生成一个绑定到IP地址的自签名SSL证书,并在Nginx中进行配置。以下是详细的步骤:

1. 生成自签名IP SSL证书

步骤1:安装OpenSSL

大多数Linux发行版默认已安装OpenSSL。如果未安装,可以使用以下命令安装:

Ubuntu/Debian:

sudo apt update
sudo apt install openssl

CentOS/RHEL:

sudo yum install openssl

步骤2:创建OpenSSL配置文件

为了在证书中包含IP地址,需要创建一个自定义的OpenSSL配置文件。假设你的服务器IP是 123.456.789.012(请替换为你的实际IP地址)。

  1. 创建配置文件(例如 openssl-ip.cnf):
vim openssl-ip.cnf
  1. 添加以下内容
[ req ]
default_bits       = 2048
prompt             = no
default_md         = sha256
req_extensions     = req_ext
distinguished_name = dn

[ dn ]
C  = CN
ST = YourState
L  = YourCity
O  = YourOrganization
OU = YourUnit
CN = 123.456.789.012

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
IP.1 = 123.456.789.012

说明:

  • C:国家代码,例如 CN 表示中国。
  • ST:省份或州。
  • L:城市。
  • O:组织名称。
  • OU:组织单位。
  • CN:Common Name,设置为你的IP地址。
  • subjectAltName:包含IP地址,确保浏览器识别为合法。

步骤3:生成私钥和证书

运行以下命令生成私钥 (ip.key) 和自签名证书 (ip.crt):

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ip.key -out ip.crt -config openssl-ip.cnf

参数说明:

  • -x509:生成自签名证书。
  • -nodes:不加密私钥。
  • -days 365:证书有效期为365天。
  • -newkey rsa:2048:生成2048位RSA密钥。
  • -keyout:输出私钥文件。
  • -out:输出证书文件。
  • -config:使用自定义配置文件。

步骤4:验证证书

你可以使用以下命令查看证书详细信息,确保IP地址包含在 subjectAltName 中:

openssl x509 -in ip.crt -text -noout

查找类似以下内容:

X509v3 Subject Alternative Name:
    IP Address:123.456.789.012

2. 配置Nginx使用自签名IP SSL证书

步骤1:将证书和私钥移动到适当的目录

通常,将证书和私钥放在 /etc/ssl/certs//etc/ssl/private/ 目录中。

sudo mv ip.crt /etc/ssl/certs/
sudo mv ip.key /etc/ssl/private/

步骤2:配置Nginx

编辑Nginx的服务器配置文件。假设你要为IP地址 123.456.789.012 配置HTTPS。

  1. 打开Nginx配置文件

配置文件位置可能因系统不同而异,常见位置包括 /etc/nginx/sites-available/default/etc/nginx/conf.d/default.conf

sudo nano /etc/nginx/sites-available/default
  1. 添加或修改服务器块
server {
    listen 443 ssl;
    server_name 123.456.789.012;

    ssl_certificate     /etc/ssl/certs/ip.crt;
    ssl_certificate_key /etc/ssl/private/ip.key;

    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         HIGH:!aNULL:!MD5;

    location / {
        root   /var/www/html;
        index  index.html index.htm;
    }
}

# 可选:重定向HTTP到HTTPS
server {
    listen 80;
    server_name 123.456.789.012;

    return 301 https://$host$request_uri;
}

说明:

  • listen 443 ssl;:监听443端口并启用SSL。
  • server_name:设置为你的IP地址。
  • ssl_certificatessl_certificate_key:指向你的证书和私钥文件。
  • ssl_protocolsssl_ciphers:建议的SSL协议和加密套件,提高安全性。
  • location /:配置你的站点内容根目录。

步骤3:测试Nginx配置

在重新加载Nginx之前,确保配置文件没有语法错误:

sudo nginx -t

如果输出显示 syntax is oktest is successful,则可以继续。

步骤4:重新加载Nginx

sudo systemctl reload nginx

3. 访问和验证

现在,你可以通过浏览器访问 https://123.456.789.012 来验证SSL证书是否配置正确。

注意:

  • 浏览器警告:由于这是一个自签名证书,浏览器会显示安全警告,提示证书不受信任。你需要手动忽略警告才能继续访问。
  • 生产环境建议:自签名证书不适用于公开生产环境,因为用户会看到警告。建议使用域名并通过受信任的证书颁发机构(如Let’s Encrypt)获取SSL证书。

4. 附加:优化Nginx的SSL配置

为了提高安全性和性能,建议进一步优化Nginx的SSL配置。以下是一个推荐的配置示例:

server {
    listen 443 ssl http2;
    server_name 123.456.789.012;

    ssl_certificate     /etc/ssl/certs/ip.crt;
    ssl_certificate_key /etc/ssl/private/ip.key;

    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers         ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:
                        ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:
                        ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_session_timeout 1d;
    ssl_session_cache   shared:SSL:10m;
    ssl_session_tickets off;

    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" always;

    location / {
        root   /var/www/html;
        index  index.html index.htm;
    }
}

server {
    listen 80;
    server_name 123.456.789.012;

    return 301 https://$host$request_uri;
}

说明:

  • http2:启用HTTP/2,提高性能。
  • ssl_prefer_server_ciphersssl_ciphers:确保使用强加密套件。
  • Strict-Transport-Security (HSTS):强制浏览器仅通过HTTPS访问,提高安全性。

5. nginx后端配置

如果前端使用HTTPS,而后端使用HTTP,浏览器可能会阻止混合内容请求。建议为后端也配置HTTPS。
使用Nginx作为反向代理并配置SSL
假设你已经为Nginx配置了SSL证书,可以通过Nginx将HTTPS请求转发到Spring Boot(http://123.456.789.012:8080)应用。

示例Nginx配置

server {
    listen 8443 ssl;
    server_name 123.456.789.012;

    ssl_certificate /path/to/your/cert.crt;
    ssl_certificate_key /path/to/your/cert.key;

    location / {
        proxy_pass http://123.456.789.012:8080;
        proxy_set_header Host $host;
        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;
    }
}

前端请求接口地址改成https://123.456.789.012:8443

请注意,这样直接访问api地址是没问题的,但前端访问会报跨域错误CORS error,就算后端配置了跨域处理也会报错,不知道为啥,不知道是不是配置问题,知道的伙伴能告知下吗

优化配置:修改步骤2 的nginx代理配置:

server {
    listen 443 ssl http2;
    server_name 123.456.789.012;

    ssl_certificate     /etc/ssl/certs/ip.crt;
    ssl_certificate_key /etc/ssl/private/ip.key;

    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers         ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:
                        ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:
                        ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_session_timeout 1d;
    ssl_session_cache   shared:SSL:10m;
    ssl_session_tickets off;

    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" always;

    location / {
        root   /var/www/html;
        index  index.html index.htm;
    }
 	# 增加的
     location /dtb-api/ {
        proxy_pass http://123.456.789.012:8080/;
        proxy_set_header Host $host;
        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_set_header Authorization $http_authorization;
     }
}

前端请求接口地址改成https://123.456.789.012/dtb-api,这样就解决了跨域问题。
域名的nginx配置类似

6. 进一步建议

  • 使用域名:如前所述,自签名证书适用于测试和内部使用。对于公开访问,建议注册一个域名,并使用Let’s Encrypt等免费CA获取受信任的SSL证书。
  • 自动化证书管理:自签名证书需要手动更新。使用受信任的CA可以通过工具(如Certbot)实现自动续期,简化管理。
  • 安全性:定期检查和更新你的SSL配置,确保使用最新的协议和加密技术,防止潜在的安全漏洞。

你可能感兴趣的:(运维,tcp/ip,nginx,网络协议)