传统的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:
安装的ESET杀毒软件跳出了安全警告,不信任的证书。
因为SSL证书没有经过CA的认证,所以火狐也阻止了。但是已经出现了证书的验证信息,就说明Nginx的HTTPS配置成功。