禁止 IP 访问并设置自签名证书防范泄露域名
更新:自 Nginx 1.19.4 版本开始新增了
ssl_reject_handshake
参数,可以更简单解决文中问题,但要 OpenSSL 高于 1.1.1 版本才能使用。
为防止网络上的恶意扫描,例如通过访问 https://IP
获取 SSL 证书里的域名信息,以穷举匹配方式找出源站 IP。最好禁止 IP 访问 Web 服务器,并且设置一个自签证书避免泄露服务器上的网站域名。
大致设置流程:生成自签名 SSL 证书,修改 Web Server 配置文件限制以 IP 访问。
检查 OpenSSL 安装
# 若未返回结果则表示没安装 openssl version # CentOS & Fedora 安装 yum -y install openssl # Debian & Ubuntu 安装 apt -y install openssl
生成自签 SSL 证书
用下面命令生成自签名证书。它会先生成私钥文件,然后根据给定的信息生成证书并用私钥签名,这样一个自签名证书就生成完成了。解释下其中用到的三个参数(更多介绍请查阅 openssl-req 文档)。
-nodes
表示不设置私钥保护密码(设置会带来麻烦,例如启动或刷新 Nginx & Apache 服务时要求输入密码验证);-subj
设置 CSR 证书签名请求信息(这里只设置了 Common Name),为避免其它几个常见选项使用 OpenSSL 配置文件里缺省值(如果未设置的话),这里设置了空值,这将在生成证书时跳过。如果想在生成证书时询问输入,可以删除这个参数;-days
设置证书有效期,单位/天,这里设置了 10 年有效期;
openssl req -newkey rsa:2048 -nodes -keyout private_key.pem -x509 -subj "/C=/L=/O=/CN=127.0.0.1" -days 3650 -out certificate_crt.pem
将证书和私钥文件写入到相关目录存储,然后清除工作目录下文件。
cat private_key.pem > /etc/pki/tls/private/private_key.pem cat certificate_crt.pem > /etc/pki/tls/certs/certificate_crt.pem rm -f private_key.pem certificate_crt.pem
修改 Web Server 配置文件
以 Nginx 为例,修改 /etc/nginx/nginx.conf
配置文件里监听 80 和 443 端口的 server{...}
块,改为下面这样(对以 IP 访问关闭连接不响应,设置 SSL 证书。其中 default_server
参数别漏了,不然因为顺序问题可能加载其它 server{...}
里的证书)。
server { listen 80 default_server; listen [::]:80 default_server; server_name _; return 444; } server { listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; server_name _; return 444; ssl_certificate "/etc/pki/tls/certs/certificate_crt.pem"; ssl_certificate_key "/etc/pki/tls/private/private_key.pem"; }
之后用 nginx -t
命令测试下语法是否有问题,然后 nginx -s reload
生效,以后再用 https://IP
访问就不会泄露证书域名了。