禁止 IP 访问并设置自签名证书防范泄露域名

Anson 教程 860 次浏览 评论已关闭

更新:自 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 访问就不会泄露证书域名了。