特别是在配置HPKP标头(或其他一般的长标头)时,将 nginx 配置中的一行拆分为多行会很有用。
这是想要的结果:
pin-sha256="X3pGTSOuJeEVw989IJ/cEtXUEmy52zs1TZQrU06KUKg=";
pin-sha256="MHJYVThihUrJcxW6wcqyOISTXIsInsdj3xK8QrZbHec=";
pin-sha256="isi41AizREkLvvft0IRW4u3XMFR2Yg7bvrF7padyCJg=";
pin-sha256="I/bAACUzdYEFNw2ZKRaypOyYvvOtqBzg21g9a5WVClg=";
pin-sha256="Y4/Gxyck5JLLnC/zWHtSHfNljuMbOJi6dRQuRJTgYdo=";
pin-sha256="/oCVQg3nP3DroGpFdAbaiYzenycUftqrH3LAyaIal2g=";
Run Code Online (Sandbox Code Playgroud)
但是对于浏览器,它应该只有一行:
pin-sha256="X3pGTSOuJeEVw989IJ/cEtXUEmy52zs1TZQrU06KUKg="; pin-sha256="MHJYVThihUrJcxW6wcqyOISTXIsInsdj3xK8QrZbHec="; pin-sha256="isi41AizREkLvvft0IRW4u3XMFR2Yg7bvrF7padyCJg="; pin-sha256="I/bAACUzdYEFNw2ZKRaypOyYvvOtqBzg21g9a5WVClg="; pin-sha256="Y4/Gxyck5JLLnC/zWHtSHfNljuMbOJi6dRQuRJTgYdo="; pin-sha256="/oCVQg3nP3DroGpFdAbaiYzenycUftqrH3LAyaIal2g=";
Run Code Online (Sandbox Code Playgroud)
所以我尝试了一些东西,但我对结果不满意......
add_header Public-Key-Pins '
pin-sha256="X3pGTSOuJeEVw989IJ/cEtXUEmy52zs1TZQrU06KUKg=";
pin-sha256="MHJYVThihUrJcxW6wcqyOISTXIsInsdj3xK8QrZbHec=";
pin-sha256="isi41AizREkLvvft0IRW4u3XMFR2Yg7bvrF7padyCJg=";
pin-sha256="I/bAACUzdYEFNw2ZKRaypOyYvvOtqBzg21g9a5WVClg=";
pin-sha256="Y4/Gxyck5JLLnC/zWHtSHfNljuMbOJi6dRQuRJTgYdo=";
pin-sha256="/oCVQg3nP3DroGpFdAbaiYzenycUftqrH3LAyaIal2g=";
'
Run Code Online (Sandbox Code Playgroud)
这有效,但curl
我可以看到浏览器收到带有所有换行符的标题......
实际上,在已经链接的文章中,Scott Helme 建议这样做:
add_header Public-Key-Pins ' \
pin-sha256="X3pGTSOuJeEVw989IJ/cEtXUEmy52zs1TZQrU06KUKg="; \
pin-sha256="MHJYVThihUrJcxW6wcqyOISTXIsInsdj3xK8QrZbHec="; \
pin-sha256="isi41AizREkLvvft0IRW4u3XMFR2Yg7bvrF7padyCJg="; \
pin-sha256="I/bAACUzdYEFNw2ZKRaypOyYvvOtqBzg21g9a5WVClg="; \
pin-sha256="Y4/Gxyck5JLLnC/zWHtSHfNljuMbOJi6dRQuRJTgYdo="; \
pin-sha256="/oCVQg3nP3DroGpFdAbaiYzenycUftqrH3LAyaIal2g="; \
'
Run Code Online (Sandbox Code Playgroud)
但是在我的情况下,这只是添加了斜杠并将它们返回给浏览器,所以这不起作用。
那么我该怎么做呢?
当然,每一行的注释都是一个很棒的补充:
pin-sha256="X3pGTSOuJeEVw989IJ/cEtXUEmy52zs1TZQrU06KUKg="; # current ECDSA
pin-sha256="MHJYVThihUrJcxW6wcqyOISTXIsInsdj3xK8QrZbHec="; # current RSA (nginx 1.11.0)
pin-sha256="isi41AizREkLvvft0IRW4u3XMFR2Yg7bvrF7padyCJg="; # backup ECDSA 1
pin-sha256="I/bAACUzdYEFNw2ZKRaypOyYvvOtqBzg21g9a5WVClg="; # backup ECDSA 2
pin-sha256="Y4/Gxyck5JLLnC/zWHtSHfNljuMbOJi6dRQuRJTgYdo="; …
Run Code Online (Sandbox Code Playgroud) 与this和this question类似,我想阻止用户使用IP访问我的服务器。
对于 HTTP(端口 80),这可以正常工作,但不适用于 HTTPS。所以用户仍然可以进入https://<myip>
访问webserver,nginx返回默认证书。顺便说一句,我在“常用”服务器块中使用 HTTP2(使用我的域名),所以我使用:
listen 443 ssl http2;
listen [::]:443 ssl http2;
Run Code Online (Sandbox Code Playgroud)
我现在尝试使用它来阻止 HTTPS ip 访问:
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name _;
return 444;
}
Run Code Online (Sandbox Code Playgroud)
然而不幸的是,无论是否使用域,这都会阻止所有 HTTPS 请求。我知道可能有必要阻止非 SNI 客户端,因为这些客户端当然不会将使用的域名传送到服务器,所以我对此表示满意。(我的意思是不支持 SNI 的客户无论如何都是旧的......)
我通常更喜欢在 nginx 中阻止它,但是如果您对在防火墙级别 (iptables) 阻止它有一些想法,我也很高兴看到这些。如果你想争论为什么用 iptables 阻止更好你也可以这样做并说服我也阻止对 IP 的 HTTP [或所有其他] 请求。通常断开连接很好(就像 nginx 状态代码 444 那样)。
但是有一个要求:我不想在配置中明确提及服务器的 IP 地址,因为它是动态 IP 并且服务器使用动态 dns 服务。
简而言之,这就是我想要实现的目标: