Nginx使用ssl模块配置https
场景:使服务器与客户端之间传输内容是加密的,防止中间监听泄露信息,如果不想去证书服务商那边申请证书,那么就自己给自己颁发证书,忽略掉浏览器的不信任警报即可。
默认情况下ssl模块并未被安装,如果要使用该模块则需要在编译时指定–with-http_ssl_module参数,安装模块依赖于OpenSSL库和一些引用文件,通常这些文件并不在同一个软件包中。
确保机器上安装了openssl和openssl-devel
配置过程:
# useradd -s /sbin/nologin www
# yum install -y gcc gcc-c++
# tar zxvf pcre-8.12.tar.gz -C /usr/local/src/
# ./configure
# make && make install
# tar zxvf nginx-1.8.0.tar.gz -C /usr/local/src/
# yum install -y openssl openssl-devel
#./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module
(注:--with-http_ssl_module:启用ssl支持
--with-http_stub_status_module:这个模块可以用来启用nginx的NginxStatus功能,以监控Nginx的当前状态。
--with-http_gzip_static_module 压缩传输 )
# make && make install
# /etc/init.d/nginx restart //这里写了一个nginx的启动脚本,所以可以这么启动
# chkconfig --add nginx
# chkconfig nginx on
创建服务器有密码私钥(密码不小于4位):
# cd /usr/local/nginx/cert/
# openssl genrsa -des3 -out server.key 2048 //生成2048位加密的服务器有密码私钥,(-des3 不加这个选项就是生成无密码私钥)
Enter pass phrase for nginx_server.key: #此处输入私钥密码不小于4位(隐藏的)
Verifying - Enter pass phrase for nginx_server.key: #确认输入私钥密码
创建签名请求的证书(CSR):
# openssl req -new -key server.key -out nginx_server.csr
Country Name (2 letter code) [XX]:CN 国家
State or Province Name (full name) []:liaoning 省
Locality Name (eg, city) [Default City]:shenyang 市
Organization Name (eg, company) [Default Company Ltd]: niuX 公司
Organizational Unit Name (eg, section) []:TD 部门
Common Name (eg, your name or your server's hostname) []:www.dou.com 服务器名
//一定要写网站的完整域名,浏览器会验证证书中这个服务器名称和访问的服务器URL是否匹配
Email Address []:1234567@sina.com 邮箱//管理员,负责人邮件地址
Please enter the following 'extra' attributes
to be sent with your certificate request
//这里的提示是说如果你想通过第三方权威证书签名机构给你签名这张证书,则需要认真回答下面问题。做自签名(自己给自己压个钢印)则不要这么严格,后面两个问题直接回车跳过。
A challenge password []: 没有密码,直接回车
An optional company name []:
拷贝一个不需要输入密码的密钥文件 :
# openssl rsa -in server.key -out server_nopwd.key
###如果此步不做 那么在之后重新启动nginx时就要每次都输入秘钥
自己给自己签发证书:
#openssl x509 -req -days 365 -in nginx_server.csr -signkey server_nopwd.key -out nginx.crt
-days 365 证书的有效期,自己给自己颁发证书,想有多久有效期,就弄多久;
-in nginx_server.csr 指定CSR文件
-signkey nginx_server.key 指定服务器的私钥key文件
-out nginx.crt 设置生成好的证书文件名
PS:这里生成的只是一张RootCA,并不是严格意义上的服务器证书 ServerCA,真正的ServerCA是需要利用这张RootCA再给服务器签署办法出来的证书才算;不过这里只讲如何实现网页的SSL加密,所以就直接使用RootCA了,也是能正常实现加密功能的!
修改Nginx虚拟主机配置文件,让其包含新生成的证书和私钥:
server {
listen 443;
server_name localhost;
index index.html;
root /data/htdocs/html; ##虚拟主机根目录
ssl on; ##启动SSL加密
ssl_certificate /usr/local/nginx/cert/nginx.crt;
##服务器证书crt文件
ssl_certificate_key /usr/local/nginx/cert/server_nopwd.key;
##服务器私钥key文件
# ssl_session_cache shared:SSL:10m;
##设置ssl/tls会话缓存的类型和大小。如果设置了这个参数一般是shared,buildin可能会参数内存碎片,默认是none,和off差不多, 停用缓存。如shared:SSL:10m表示我所有的nginx工作进程共享ssl会话缓存,官网介绍说1M可以存放约4000个sessions。
# ssl_session_timeout 5m;
##客户端可以重用会话缓存中ssl参数的过期时间,内网系统默认5分钟太短了,可以设成30m即30分钟甚至4h。
# ssl_ciphers RC4:HIGH:!aNULL:!MD5
##选择加密套件,不同的浏览器所支持的套件(和顺序)可能会不同。这里指定的是OpenSSL库能够识别的写法
# ssl_prefer_server_ciphers on;
##设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件。
# /etc/init.d/nginx restart
https://IP:端口号 跳过,继续访问