没有域名,但是又需要https,可以使用OpenSSL生成一个绑定到IP地址的自签名SSL证书,并在Nginx中进行配置。以下是详细的步骤:
大多数Linux发行版默认已安装OpenSSL。如果未安装,可以使用以下命令安装:
Ubuntu/Debian:
sudo apt update
sudo apt install openssl
CentOS/RHEL:
sudo yum install openssl
为了在证书中包含IP地址,需要创建一个自定义的OpenSSL配置文件。假设你的服务器IP是 123.456.789.012
(请替换为你的实际IP地址)。
openssl-ip.cnf
):vim openssl-ip.cnf
[ 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
说明:
CN
表示中国。运行以下命令生成私钥 (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
:使用自定义配置文件。你可以使用以下命令查看证书详细信息,确保IP地址包含在 subjectAltName
中:
openssl x509 -in ip.crt -text -noout
查找类似以下内容:
X509v3 Subject Alternative Name:
IP Address:123.456.789.012
通常,将证书和私钥放在 /etc/ssl/certs/
和 /etc/ssl/private/
目录中。
sudo mv ip.crt /etc/ssl/certs/
sudo mv ip.key /etc/ssl/private/
编辑Nginx的服务器配置文件。假设你要为IP地址 123.456.789.012
配置HTTPS。
配置文件位置可能因系统不同而异,常见位置包括 /etc/nginx/sites-available/default
或 /etc/nginx/conf.d/default.conf
。
sudo nano /etc/nginx/sites-available/default
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;
}
说明:
在重新加载Nginx之前,确保配置文件没有语法错误:
sudo nginx -t
如果输出显示 syntax is ok
和 test is successful
,则可以继续。
sudo systemctl reload nginx
现在,你可以通过浏览器访问 https://123.456.789.012
来验证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;
}
说明:
如果前端使用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配置类似