看了下nginx
的访问日志,发现很多试探性的请求,路径是各种后台地址之类的。这种请求有个特点,就是直接通过ip
访问,所以我决定禁止通过ip
直接访问的请求访问我的服务器。
访问服务器的443端口时,无论nginx
是否允许通过ip
访问,它都会返回服务器的证书用于建立连接。由于证书中包含域名等信息,会导致源站暴露,这也是我们需要禁止通过ip
访问的原因之一。怎么解决这个问题呢?
方案一:配置空白证书到默认站点
其实随意配置个证书就行,只要不是真实的就行。
先在任意目录下建立ssl.crt
和ssl.key
两个文件,内容如下(这是一份长期有效的空白证书):
ssl.crt
1 2 3 4 5 6 7 8 9 10 11
| -----BEGIN CERTIFICATE----- MIIBkjCB/AIJAI3bCYqa39hiMA0GCSqGSIb3DQEBBQUAMA0xCzAJBgNVBAYTAiAg MCAXDTE4MTEyNDA5MDMzOFoYDzIwOTkxMjMxMDkwMzM4WjANMQswCQYDVQQGEwIg IDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA18hepvNcznqDj735Opxircn3 M0Ruv8nkpHHPuurxr6tLPKAe1XAsy5dWHDbK7t4sXpT0ds9c74yqmvfwKofPk7z9 ZBhmyw/5sp454/JftL1c2fr58wB9ETfX6as5aR5hQR0M0NuQLSAB/KVzi9eeNWDd EzT0QN5B1Ai9BR/ApMMCAwEAATANBgkqhkiG9w0BAQUFAAOBgQBiqHZsuVP09ubT GzBSlAFEoqbM63sU51nwQpzkVObgGm9v9nnxS8Atid4be0THsz8nVjWcDym3Tydp lznrhoSrHyqAAlK3/WSMwyuPnDCNM5g1RdsV40TjZXk9/md8xWxGJ6n1MoBdlK8T H6h2ROkf59bb096TttB8lxXiT0uiDQ== -----END CERTIFICATE-----
|
ssl.key
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| -----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQDXyF6m81zOeoOPvfk6nGKtyfczRG6/yeSkcc+66vGvq0s8oB7V cCzLl1YcNsru3ixelPR2z1zvjKqa9/Aqh8+TvP1kGGbLD/mynjnj8l+0vVzZ+vnz AH0RN9fpqzlpHmFBHQzQ25AtIAH8pXOL1541YN0TNPRA3kHUCL0FH8CkwwIDAQAB AoGAQ4ejh6AV5VCWJ8AOZXdXsofIYzUBa+glNAmiNx8b8BwteZWq0KVAf56nBkFn lQXW4OrA7wXKUfW11rXNZaIHJePJXv1swkN9+Em18Hon6BrtcqnKAwzAbhok3SzY IVjI/zrgOABH6+ii77xCRBzI1itVPNN88DAUHC7PYLYiaaECQQD7PSoij37+kMc/ wPeEkl9r3vzU0OrsCsjU8Ev714OaoL/SIuAh6nsiRh9rcbUrrpGSSzIcmsk9HMDa hXBNkNl5AkEA298yQvssaUc4tbEWxAVfd9DsHJdCdbXfgf9Dy5/tpCzYncY7T0du VVHqKu3jXWoMc5XlesiCOerU/DIlMM8dGwJBANQn7GLO5iC1xWvS2bF7oVSIMtzL pvW4jaszWBbNAPccc59RkA9T4LMqn/GtTZ4bhhYRpbl+BB21IC3nrNPzU5ECQG8T Ln0QDruQs2F2eR3F6RjKfr1i3LxCiQtPPZycypzp2vS5tDS0zVRk8XuGehoy/N9X lnqU2NURgU92tbsWpokCQQDdc9tU3B/OM/YfzUNwvOLmUVwrJX6PFSFsOn+XHrCC q9LcGEAHyzaf5GEWje84ee4rkv5oaZcwll3dg4IioBnC -----END RSA PRIVATE KEY-----
|
我们在nginx
的配置文件中新建一个server
,填入以下内容并适当修改
1 2 3 4 5 6 7 8 9 10 11 12 13
| server { listen 80 default; listen 443 ssl default_server; server_name _; ssl_certificate /xxx/ssl.crt; ssl_certificate_key /xxx/ssl.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; return 444; }
|
经过上面的配置后只能通过域名来访问80和443端口,直接通过ip
访问会直接断开连接(返回HTTP 444),一定程度上避免了潜在的安全风险。
方案二:配置ssl_reject_handshake
这个配置项用于拒绝握手,也不会提供显示证书,需要nginx
版本号在1.19.4以上,无需创建假证书
1 2 3 4 5 6 7
| server { listen 80 default_server; listen 443 ssl default_server; server_name _; ssl_reject_handshake on; return 444; }
|
文档链接: http://nginx.org/en/docs/http/ngx_http_ssl_module.html