由于在编译中设置的路径是/usr/local/nginx,因此该文件位于/usr/local/nginx/conf 目录下。
打开改文件,在http模块作如下设置:
ssl_certificate /etc/ssl/certs/testcert.crt;
ssl_certificate_key /etc/ssl/certs/testcert.key;
具体的代码:
http { include proxy.conf; include mime.types; default_type application/octet-stream; limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s; server_tokens off; sendfile on; #tcp_nopush on; keepalive_timeout 29; client_body_timeout 10; client_header_timeout 10; send_timeout 10; #gzip on; # mvctest是一个名称,与具体的程序相关 upstream mvctest{ server localhost:5000; } server { listen 80; add_header Strict-Transport-Security max-age=15768000; return 301 https://$host$request_uri; } server { listen *:443 ssl; server_name localhost; ssl_certificate /etc/ssl/certs/testcert.crt; ssl_certificate_key /etc/ssl/certs/testcert.key; ssl_protocols TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; ssl_ecdh_curve secp384r1; ssl_session_cache shared:SSL:10m; ssl_session_tickets off; ssl_stapling on; #ensure your cert is capable ssl_stapling_verify on; #ensure your cert is capable add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"; add_header X-Frame-Options SAMEORIGIN; add_header X-Content-Type-Options nosniff; #Redirects all traffic location / { proxy_pass http://localhost:5000; limit_req zone=one burst=10 nodelay; limit_req_status 503; } } }
上面定义的区域名称为one(zone=one),分配内存大小为10m(如果限制域的存储空间耗尽了,对于后续所有请求,服务器都会返回 503),
同一个ip($binary_remote_addr)平均处理的请求频率不能超过每秒5次(rate=5r/s); 如果超过每秒5次但超过的请求数量小于等于10(burst=10)时,会延迟请求。
如果超过每秒5次的请求数超过10,则立即返回503(limit_req_status 503)给客户端
2、申请证书
常用免费证书:https://letsencrypt.org/
通常来说,将CSR文件(生成方式同上,或者按照CA的要求)就是你需要提交给 SSL 认证机构的,当你的域名或组织通过验证后,认证机构就会颁发给你两个文件:test_com.crt和test_com.ca-bundle
而test_com.key是需要用在 Nginx 配置里和test_com.crt、test_com.ca-bundle配合使用的,需要好好保管。
#使用cat命令生成 cat test_com.crt test_com.ca-bundle > test_com.pem
最终得到两个文件:test_com.key和test_com.pem,为了统一位置,可以把这二个文件都移动到 /etc/ssl/private 目录或者 /etc/ssl/cert 目录。
然后可以修改nginx.conf文件,如下:
server { #... ssl on; ssl_certificate /etc/ssl/private/test_com.pem; ssl_certificate_key /etc/ssl/private/test_com.key; #... }
同使用自生成证书基本一样,只是重新替换为认证机构颁发的证书而已。
3、迪菲-赫尔曼密钥交换
以上这么做并不安全,默认是 SHA-1 形式,而现在主流的方案应该都避免 SHA-1,为了确保更强的安全性,我们可以采取迪菲-赫尔曼密钥交换
首先,进入/etc/ssl/certs目录,执行命令 sudo openssl dhparam -out dhparam.pem 4096 生成一个dhparam.pem
test@test-VirtualBox:/etc/ssl/certs$ sudo openssl dhparam -out dhparam.pem 4096 [sudo] test 的密码: Generating DH parameters, 4096 bit long safe prime, generator 2 This is going to take a long time # ...会等一段时间,与机器性能有关... #完成后可以查看生成的文件 test@test-VirtualBox:~$ cd /etc/ssl/certs/ test@test-VirtualBox:/etc/ssl/certs$ ll dhparam.pem -rw-r--r-- 1 root root 769 9月 27 11:49 dhparam.pem
修改 nginx.conf 文件,添加 ssl_dhparam /etc/ssl/certs/dhparam.pem; 即可