CA (证书颁发机构)签发证书,需要有域名,也就是说:证书本身也是绑定到域名。
那么怎么在只有公网 IP 而没有域名的情况下使用 HTTPS 呢?
自签名证书就是干这个的!
自签名证书跟CA证书有什么区别?
本质区别:谁给你担保,又或者谁给你盖章。
-
**CA证书:**相当于公安局签发的身份证,浏览器一看,盖章的是公安局,立刻信任,显示小锁。
-
**自签名证书:**相当于自己给自己印章,浏览器不信任你,会弹警告:"此连接不安全"。


**重点:**自签名证书只适合在内网中使用,不要在公网上对外服务。因为没有权威机构背书,任何黑客都可以伪造一个跟你一模一样的自签名证书。浏览器无法区分 "你的假证书" 和 "黑客的假证书" ,因为两者都不在信任列表里。
技术上区别:加密强度
很多人误认为"自签名加密弱,CA签发加密强",其实这完全是错误的。
-
**加密算法:**同样都是 RSA/AES/ECC(256位)
-
**通信加密强度:**同样都是银行级
**结论:**自签名证书的"加密能力"和机构签发的没有任何区别,区别只在于"谁来担保这个证书是真的"。
自签名证书怎么搞到手?
需要使用 OpenSSL
什么是OpenSSL:
OpenSSL 是一个开源、免费的密码学工具库 + 命令行工具 ,专门用来做加密、解密、签名、证书、HTTPS 安全通信,是互联网安全的基础软件。
简单说:它就是一套用来给数据加锁、验身份的工具,几乎所有网站、服务器、设备都会用到。
安装OpenSSL:
windows:
winget install ShiningLight.OpenSSL.Light
Ubuntu:
sudo apt install openssl -y
Centos:
sudo dnf install openssl -y
使用OpenSSL+Nginx实现HTTPS
下面是Centos/Ubuntu示例:
bash
cd /etc/nginx/
mkdir certs
vim cert.cnf
# 将下面内容粘贴进去
# 将47.123.123.123换为自己的服务器IP
[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
x509_extensions = v3_req
[dn]
C=CN
ST=Beijing
L=Beijing
O=MarkitDown
CN=47.123.123.123
[v3_req]
subjectAltName=@alt_names
[alt_names]
IP.1=47.123.123.123
# 接下来运行这段代码生成证书
openssl req \
-x509 \
-nodes \
-days 3650 \
-newkey rsa:2048 \
-keyout server.key \
-out server.crt \
-config cert.cnf
ls # 能看到server.crt、server.key
接下来配置nginx
bash
vim /etc/nginx/conf.d/xxx.conf
# 这里给出一个示例,具体的可以让ai根据自己的项目生成
# HTTP 自动跳转 HTTPS
server {
listen 80;
server_name 60.205.184.232;
return 301 https://$host$request_uri;
}
# HTTPS
server {
listen 443 ssl;
server_name 60.205.184.232;
client_max_body_size 20m;
ssl_certificate /etc/aa_nginx/certs/server.crt;
ssl_certificate_key /etc/aa_nginx/certs/server.key;
ssl_protocols TLSv1.2 TLSv1.3;
# 前端 Vue
location / {
root /home/rfh/personalBlog/vue/dist;
index index.html;
try_files $uri $uri/ /index.html;
}
# 后端 API
location /api/ {
proxy_pass http://127.0.0.1:8082;
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_http_version 1.1;
proxy_set_header Connection "";
proxy_request_buffering off;
}
# 上传文件
location /uploads/ {
proxy_pass http://127.0.0.1:8082;
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;
}
}
# 最后重新加载nginx
nginx -t
nginx -s reload
验证:
**注意:**服务器一定要开放 443 端口,不然访问不了
然后启动项目,在浏览器中输入IP+端口验证
如果出现:

证明HTTPS 已配置成功,但是因为不是 CA证书,所以不被信任。
如果是自用,或者是用在内网中,无伤大雅,点击高级,继续访问即可。

千万千万千万将自签名证书用于对外服务!!!
千万千万千万将自签名证书用于对外服务!!!
千万千万千万将自签名证书用于对外服务!!!