Nginx使用ssl模块配置HTTPS
HTTPS(Hyper Text Transfer Protocol Secure),是一种基于SSL/TLS的HTTP,所有的HTTP数据都是在SSL/TLS协议封装之上进行传输的。HTTPS协议是在HTTP协议的基础上,添加了SSL/TLS握手以及数据加密传输,也属于应用层协议。
Nginx希望服务器与客户端之间传输内容是加密的,防止中间监听泄露信息,但是去证书服务商申请证书又不合算,所以自己给自己颁发证书,忽略掉浏览器的不信任警报即可。
CentOS系统默认情况下ssl模块并未被安装,如果要使用该模块则需要在编译时指定–with-http_ssl_module参数,安装模块依赖于OpenSSL库和一些引用文件
首先确保机器上安装了openssl和openssl-devel
#yum -y install openssl #yum -y install openssl-devel
然后就是自己颁发证书给自己
#cd /usr/local/nginx/conf #openssl genrsa -des3 -out server.key 2048 // 生成私钥证书 #openssl req -new -key server.key -out server.csr #openssl rsa -in server.key -out server_nopwd.key // 解密后的私钥 #openssl x509 -req -days 3650 -in server.csr -signkey server_nopwd.key -out server.crt // 私钥签名
至此证书已经生成完毕,下面就是配置nginx
server { server_name mimvp.com; listen 443; ssl on; ssl_certificate /usr/local/nginx/conf/server.crt; // 私钥签名; 相对路径也可以 ssl_certificate_key /usr/local/nginx/conf/server_nopwd.key; // 私钥文件; 相对路径也可以 }
然后重启nginx
/etc/init.d/nginx restart
错误与解决
如果出现“[emerg] 10464#0: unknown directive "ssl" in /usr/local/nginx-0.6.32/conf/nginx.conf:74”则说明没有将ssl模块编译进nginx,在configure的时候加上“--with-http_ssl_module”即可^^
至此已经完成了https服务器搭建,但如何让浏览器信任自己颁发的证书呢?
今天终于研究捣鼓出来了,只要将之前生成的server.crt文件导入到系统的证书管理器就行了,具体方法:
控制面板 -> Internet选项 -> 内容 -> 发行者 -> 受信任的根证书颁发机构 -> 导入 -》选择 server.crt
实战操作(推荐)
1. 生成证书
可以通过以下步骤生成一个简单的证书:
首先,进入你想创建证书和私钥的目录,例如:
$ cd /usr/local/nginx/conf/
创建服务器私钥,命令会让你输入一个口令:
$ openssl genrsa -des3 -out server.key 2048
创建签名请求的证书(CSR):
$ openssl req -new -key server.key -out server.csr
在加载SSL支持的Nginx并使用上述私钥时除去必须的口令:
$ cp server.key server.key.org
$ openssl rsa -in server.key.org -out server.key
2. 配置nginx
最后标记证书使用上述私钥和CSR:
$ openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
修改Nginx配置文件,让其包含新标记的证书和私钥:
server {
server_name proxy.mimvp.com;
listen 443;
ssl on;
ssl_certificate /usr/local/nginx/conf/server.crt;
ssl_certificate_key /usr/local/nginx/conf/server.key;
}
3. 重启nginx
/etc/init.d/nginx restart
这样就可以通过以下方式访问:
https://proxy.mimvp.com (不需要添加 443 端口号)
另外,还可以加入如下代码,实现80端口重定向到443
server {
listen 80;
server_name mimvp.com;
rewrite ^(.*) https://$server_name$1 permanent;
}
nginx.conf 实例配置
# HTTPS server server { listen 443 ssl; server_name proxy.mimvp.com; # 域名可以有多个,用空格隔开 ssl_certificate server.crt; ssl_certificate_key server.key; ssl_session_cache shared:SSL:5m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { # root html; # index index.html index.htm; root html/proxy_client/; index index.html index.htm index.php; fastcgi_index index.php; fastcgi_pass 127.0.0.1:9000; include fastcgi.conf; } location ~ \.(php|php5)$ { root html/proxy_client/; index index.html index.htm index.php; fastcgi_index index.php; fastcgi_pass 127.0.0.1:9000; include fastcgi.conf; }
Nginx 启用 http2
Nginx 要启用http2,那么版本要在1.90以上,
然后先配置443端口,最后把http 80端口请求转发到443
# 设置非安全连接永久跳转到安全连接 server{ listen 80; server_name mimvp.com; # 告诉浏览器有效期内只准用 https 访问 add_header Strict-Transport-Security max-age=15768000; # 永久重定向到 https 站点 return 301 https://$server_name$request_uri; } server { # 启用 https, 使用 http/2 协议, nginx 1.9.11 启用 http/2 会有bug, 已在 1.9.12 版本中修复. listen 443 ssl http2 fastopen=3 reuseport; server_name mimvp.com www.mimvp.com; # 告诉浏览器不要猜测mime类型 add_header X-Content-Type-Options nosniff; ssl on; # 证书路径 ssl_certificate 证书路径; # 私钥路径 ssl_certificate_key # 安全链接可选的加密协议 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 可选的加密算法,顺序很重要,越靠前的优先级越高. ssl_ciphers 'CHACHA20:EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:ECDHE-RSA-AES128-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA128:DHE-RSA-AES128-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA128:ECDHE-RSA-AES128-SHA384:ECDHE-RSA-AES128-SHA128:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA128:DHE-RSA-AES128-SHA128:DHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA384:AES128-GCM-SHA128:AES128-SHA128:AES128-SHA128:AES128-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4;'; # 在 SSLv3 或 TLSv1 握手过程一般使用客户端的首选算法,如果启用下面的配置,则会使用服务器端的首选算法. ssl_prefer_server_ciphers on; # 储存SSL会话的缓存类型和大小 ssl_session_cache shared:SSL:10m; # 缓存有效期 ssl_session_timeout 60m; location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://127.0.0.1:9000; } }
参考推荐:
https 免费证书申请与安装 (推荐)
https SSL 免费证书服务申请 (推荐)
Mac 安装Nginx with-http_ssl_module
LNMP(linux+nginx+mysql+php)服务器环境配置
CentOS安装Nginx (推荐)
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2017-09-23 19:03:01
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!