在未使用SSL证书对服务器数据进行加密认证的情况下,用户的数据将会以明文的形式进行传输,这样一来使用抓包工具是可以获取到用户密码信息的,非常危险。而且也无法验证数据一致性和完整性,不能确保数据在传输过程中没被改变。所以网站如果有涉及用户账户等重要信息的情况下通常要配置使用SSL证书,实现https协议。 在生产环境中的SSL证书都需要通过第三方认证机构购买,分为专业版OV证书(浏览器地址栏上不显示企业名称)和高级版EV(可以显示企业名称)证书,证书所保护的域名数不同也会影响价格(比如只对www认证和通配*认证,价格是不一样的),且不支持三级域名。测试中可以自己作为证书颁发机构来制作证书,浏览器会显示为红色,代表证书过期或者无效,如果是黄色的话代表网站有部分连接使用的仍然是http协议。 不管使用哪种方法,在拿到证书后对Nginx的配置都是一样的,所以这里以搭建OpenSSL并制作证书来进行完整说明: 一、配置OpenSSL生成证书 1、由于是实验,所以要自己安装OpenSSL(官方地址https://www.openssl.org)生成证书,其版本号分为1.1和1.0两个大分支,Centos 7开始使用1.0.2k版本,如果配置的SSL需要达到苹果要求也需要1.0.2版本。1.1依赖的libssl也是1.1版本的,而系统默认的libsso库是1.0版本(ls /usr/lib64/libssl.so.10),所以还是尽量使用1.0版本,如果要用1.1的话可以自行编译安装 wget https://www.openssl.org/source/openssl-1.1.0h.tar.gz tar zxf openssl-1.1.0h.tar.gz ./config --prefix=/usr/local/openssl #虽然安装包里还有一个configure脚本,但是正确安装方式是使用config脚本 make && make install openssl version #查看版本 2、OpenSSL安装完成后我们主要用到的就是bin下的openssl命令,该命令用于生成证书文件 3、执行命令生成证书的申请文件和私钥文件 openssl req -nodes -newkey rsa:1024 -out myreq.pem -keyout privatekey.pem #req:request的简写,代表发出一个申请数字证书的请求 #-nodes:不生成pin码,简化流程 #-newkey:生成新证书并指明加密算法和长度,也可以写成2048 #-out:输出一个请求文件,非密码文件 #-keyout:生成私钥 如果执行该命令提示“error while loading shared libraries: libssl.so.1.1”这种报错,是因为1.1版本的OpenSSL依赖了libssl.so.1.1的库,而系统里默认是没有这个库文件的。好在安装好OpenSSL后再lib目录中提供了该文件,做软连接就可以解决问题 ln -s /usr/local/openssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1 ln -s /usr/local/openssl/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1 4、运行命令后会要求填写相关信息,然后会在当前目录下生成申请文件和私钥文件 5、使用申请文件和私钥进行证书的申请,自己给自己颁发证书,命令运行后会在当前目录生成证书文件(申请文件以后没用了,可以删除掉了) openssl req -in myreq.pem -x509 -key privatekey.pem -out mycert.pem -days 365 -in:用之前的申请文件作为输入 -x509:证书格式 -key:私钥文件 -out:产出的证书文件 -days:证书有效期 二、配置Nginx https 要让Nginx支持SSL证书的话需要在编译Nginx的时候开启--with-http_ssl_module,然后在Nginx配置文件中做以下修改: #三个选项都配置在http或者server标签内 ssl on; ssl_certificate file; ssl_certificate_key file; Nginx配置https示例: # HTTPS server server { listen 443 ssl; server_name test.com; ssl on; ssl_certificate /usr/local/nginx/ssl/cert.pem; #指定数字证书文件 ssl_certificate_key /usr/local/nginx/ssl/cert.key; #指定数字证书私钥文件 ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; } } server { listen 80; server_name test.com; rewrite (.*) https://$server_name$request_uri redirect; } 2、启动Nginx服务,查看443端口是否监听,然后在浏览器使用https://IP进行访问测试即可。如果站点是动态页面(比如PHP),那么还需要在ssl所属的server标签内做PHP的配置才可以使用https协议 三、HTTPS服务优化方向 1、激活keepalive长连接,减少客户端请求次数 2、设置SSL session缓存,减少CPU资源消耗 配置示例: server { listen 443 ssl; server_name test.com; keepalive_timeout 100; #开启keepalive ssl on; ssl_certificate /usr/local/nginx/ssl/cert.pem; #指定数字证书文件 ssl_certificate_key /usr/local/nginx/ssl/cert.key; #指定数字证书私钥文件 ssl_session_cache shared:SSL:10m; #缓存session会话 ssl_session_timeout 10m; #session 10分钟过期 ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; }