Nginx 配置客户端证书认证

最近,有个内部服务需要使用公网上,担心被暴力刷API破解。

正好看到有个双向证书认证的方案,挺符合需求,踩了不少坑,简单记录下

生成证书

info:仅需要生成自签名客户端证书即可,服务端证书就用免费的在线申请的即可,不会有信任问题

可以参考微软官方文档:

生成自签名客户端证书

这里我就用openssl,来生成客户端证书

启用CDN后Nginx获取真实IP地址

启用CDN后,网站日志记录的全是CDN的回源ip,而阿里云CDN日志是一小时一分割的,下载合并太麻烦了。

后来发现在Nginx配置文件中添加下面的内容,就可以正常获取访问者真实ip了。

#获取cdn真实ip
set_real_ip_from 0.0.0.0/0;
real_ip_header X-Forwarded-For;

Nginx配置文件Nginx配置文件

info:原理:CDN会把用户的ip放到回源的HTTP请求头中的X-Forwarded-ForX-Real-IP 字段里。
Error:由于HTTP请求头可以伪造,所以获取的ip不一定是真正的访问者ip。请保护好源站ip!

HTTP的八种请求方法

HTTP 使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。

HTTP 请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。

HTTP1.0 定义了三种请求方法: GET , POSTHEAD 方法。
HTTP1.1 新增了五种请求方法:OPTIONS , PUT , DELETE , TRACE CONNECT 方法。
  • GET:请求指定的页面信息,并返回实体主体。
  • HEAD:类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
  • POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
  • PUT:从客户端向服务器传送的数据取代指定的文档的内容。
  • DELETE:请求服务器删除指定的页面。
  • CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
  • OPTIONS:允许客户端查看服务器的性能。
  • TRACE:回显服务器收到的请求,主要用于测试或诊断。

Nginx只允许Get/Post请求,快速响应Head请求

最近网站开始有一些奇怪的请求

出于安全考虑,决定只允许Get/Post请求。

在Nginx配置文件中添加任意一个即可:

#方法一
if ($request_method !~ ^(GET|POST)$ ){
    return 403;
}

#方法二
if ($request_method !~* GET|POST) {
    return 403;
}
#快速响应Head请求
if ($request_method ~ ^(HEAD)$ ) {
    return 200 "All OK";
}

Nginx配置网站HTTPS(ssl)

下面是在Nginx配置网站HTTPS(ssl)的参数

请酌情修改使用。

注意:TLS 1.1 协议预计将2020年3月份正式“退役”,详情点击 这里
server
{
    #监听443端口、ssl、http2
    listen 443 ssl http2 ;
    
    #启用ssl
    ssl on;
    
    #证书配置
    ssl_certificate    /idzd.top.pem;
    ssl_certificate_key    /idzd.top.pem;
    
    #支持的协议
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    
    #支持的加密套件
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    
    #依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码
    ssl_prefer_server_ciphers on;
    
    #设置储存SSL会话的缓存类型和大小
    ssl_session_cache shared:SSL:10m;
    
    #客户端能够反复使用储存在缓存中的会话参数时间
    ssl_session_timeout 10m;

}