Nginx配置教程:使用OpenSSL实现https

2020年11月23日15:00:39 发表评论 1,747




在未使用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; 
        } 








  

     
    

    发表评论

    :?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: