青蛙学Linux—Nginx提供HTTPS服务

传统的HTTP协议传输的是明文信息,这就导致了一定的安全风险。而HTTPS则解决了这一问题,HTTPS在HTTP协议的基础上增加了SSL/TLS,用于通过证书来验证服务器的身份,并且为客户端和服务器之间的通信提供加密服务。现在大部分的网站都开始使用HTTPS协议提供服务。

使用HTTPS协议需要先向CA申请一个SSL证书,其使用的端口号为443而不是HTTP的80端口。

1、CA和SSL证书类型

CA,Certificate Authority,证书颁发机构,负责发放和管理数字证书的权威机构,并做为受信任的第三方,承担公钥体系中公钥的合法性验证。CA制定政策和具体步骤来验证、识别用户身份,并对用户证书进行签名,以确保证书持有者的身份和公钥的拥有权。

根据使用环境的不同,SSL证书可分为以下几种:

  • 增强型SSL证书(EV SSL,即为Extended Validation SSL),适合银行金融类电子商务网站(网上购物)使用,证书里显示单位名称,显示绿色地址栏;有EV超安SSL和EV超安SSL Pro两个型号
  • 机构验证型SSL证书(OV SSL, 即为Organization Validation SSL),适合电子商务、电子政务网站、企事业单位管理系统、电子邮件系统使用,证书里显示单位名称; 有OV超真 SSL和OV 超真SSL Pro两个型号
  • 个人验证型SSL证书(IV SSL,即为IdentityValidation SSL),适用于个人专业网站使用,显示个人姓名
  • 域名验证型SSL证书(DV SSL 即为Domain Validation SSL),不显示任何信息,是最基础级的SSL 证书。通常是验证域名下某个指定文件的内容,或者验证与域名相关的某条 TXT 记录

2、申请SSL证书

SSL使用的是公钥私钥体系,所以向CA申请SSL证书前必须先生成一个私钥文件(.key)并使用该私钥签署一个证书签署请求文件(.crs),证书签署请求文件包含申请者的DN(Distinguished Name,标识名)和公钥信息。申请者将该文件提交给CA后,CA会向申请者返回一个证书文件(.crt)。

可使用openssl来生成私钥和证书签署请求文件,命令如下:

[root@localhost ~]# openssl req -new -newkey rsa:2048 -sha256 -nodes -out abc.csr -keyout abc.key -subj '/C=CN/ST=fujian/L=fuzhou/O=abc Inc./OU=Web/CN=abc.com'

命令详解:生成一个新的RSA密钥并输出abc.csr和abc.key两个文件。

  • -nodes:私钥不加密,如果不加该参数,则访问私钥时需要输入密码
  • C:Country,表示所在国家,使用两位数的国家缩写
  • ST:State/Province,所在的州或省
  • L:Locality,所在的城市或县区
  • O:Organization,此网站所属的单位|公司|个人的名称
  • OU:Organization Unit,下属部门,也用于显示其他证书相关信息,如证书类型、证书产品名称、身份验证类型或验证内容等
  • CN:Common Name,网站的域名

命令执行后会在当前目录下生成abc.csr和abc.key两个文件。其中的abc.csr就可以提交给CA以申请SSL证书,CA通过验证后会提供给我们证书文件。

由于这里的域名abc.com没有进行域名解析,CA是无法验证这个域名的,所以也无法为它颁发证书。为了解决这种情况,我们可以使用openssl自己颁发一张证书,当然,这张证书是没有经过认证的,使用时就会发现问题了。运行以下命令:

[root@localhost nginx]# openssl req -new -newkey rsa:2048 -sha256 -nodes -x509 -days 365 -out abc.crt -keyout abc.key -subj '/C=CN/ST=fujian/L=fuzhou/O=abc Inc./OU=Web/CN=abc.com'

此时,当前目录下会生成abc.crt和abc.key两个文件。

3、Nginx配置HTTPS

Nginx的配置文件中已经有一段关于HTTPS的配置,内容如下:

# HTTPS server
#
#server {
#    listen       443 ssl;
#    server_name  localhost;

#    ssl_certificate      cert.pem;
#    ssl_certificate_key  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;
#    }
#}

详解:

  • ssl_certificate:指定证书文件crt的路径,可以使用绝对路径或相对路径
  • ssl_certificate_key:指定私钥文件key的路径
  • ssl_session_cache:设置session缓存
  • ssl_session_timeout:session的超时时间
  • ssl_ciphers:选择加密套件和加密算法,不同浏览器支持的套件顺序可能不同,这里使用默认值
  • ssl_prefer_server_ciphers:在与客户端协商加密算法时,优先使用服务端的加密套件,on表示打开

还可以添加以下设置:

  • ssl_protocols:启动指定的加密协议,建议设置为TLSv1 TLSv1.1 TLSv1.2,使用TLSv1.1和TLSv1.2要保证当前的openssl版本大于等于1.0.1;不建议使用SSLv3,因为存在一些容易被攻击的漏洞
  • add_header X-Frame-Options:增强安全,设置为DENY表示减少点击劫持
  • add_header X-Frame-Options:增强安全,设置为nosniff表示禁止服务器自动解析资源类型
  • add_header X-Xss-Protection:增强安全,设置为1表示防止XSS攻击

这里为这台运行Nginx的主机的www.abc.com配置了HTTPS,并在客户端hosts文件中做了本地解析,然后访问https://www.abc.com:

1

安装的ESET杀毒软件跳出了安全警告,不信任的证书。

2

因为SSL证书没有经过CA的认证,所以火狐也阻止了。但是已经出现了证书的验证信息,就说明Nginx的HTTPS配置成功。

原文地址:https://www.cnblogs.com/yu2006070-01/p/10233470.html