HTTPS
HTTPS 目前已经是所有重视隐私和安全性的网站的首选,例如国外的 Google、Facebook、Twitter,国内则是淘宝、百度、京东等都已都支持了全站 HTTPS,可以想象以下,如果一个网站没有加密,那么你的所有账户密码都是通过明文来传输,当涉及到隐私和金融问题,不加密是多么可怕的事情。
随着技术的发展,HTTPS 网站已不再是大型网站的专利,所有普通的个人站点和blog可以以自己动手搭建一个安全加密的网站。
什么是 HTTPS、SSL 证书
HTTPS
超文本传输安全协议(缩写:HTTPS,英语:Hypertext Transfer Protocol Secure)是超文本传输协议和 SSL/TLS 的组合,用以提供加密通讯及对网络服务器身份的鉴定。HTTPS 连接经常被用于万维网上的交易支付和企业信息系统中敏感信息的传输。HTTPS 不应与在 RFC 2660 中定义的安全超文本传输协议 (S-HTTP) 相混。
SSL 证书
SSL 证书是数字证书的一种,遵守 SSL 协议,使用 Secure Socket Layer 协议在浏览器和 Web 服务器之间建立一条安全通道,从而实现数据信息在客户端和服务器之间的加密传输,保证双方传递信息的安全性,不可被第三方窃听;用户可以通过服务器证书验证他所访问的网站是否真实可靠。
等多关于 HTTPS、SSl 证书的信息,请 Google.
使用 OpenSSL 生成自签名证书
制作 CA 证书
- 修改 CA 配置文件
|
|
- 在 CA 目录下创建两个初始文件
|
|
- 生成根密钥
|
|
- 生成根证书
|
|
会提示输入一些内容,因为是私有的,所以可以随便输入(之前修改的 openssl.cnf 会在这里呈现),最好记住能与后面保持一致。上面的自签证书 cacert.pem
应该生成在 /etc/pki/CA
下
制作服务器证书
- 生成服务器 ssl 密钥
|
|
- 为 ningx 生成证书签署请求
|
|
- 用私有 CA 来签署证书
|
|
上面签发过程其实默认使用了 -cert cacert.pem -keyfile cakey.pem
,这两个文件就是前两步生成的位于 /etc/pki/CA
下的根密钥和根证书。将生成的 crt 证书发回 nginx 服务器使用。
- 精简上面的步骤如下
|
|
更为简单的步骤
配置 Nginx 支持 SSL
编辑配置文件
|
|
通过第三方 SSL 签发机构签发SSL证书
使用 OpenSSL 生成 SSL Key 和 CSR
由于只有浏览器或者系统信赖的 CA 才可以让所有的访问者通畅的访问你的加密网站,而不是出现证书错误的提示。所以我们跳过自签证书的步骤,直接开始签署第三方可信任的 SSL 证书吧。
OpenSSL 在 Linux、OS X 等常规的系统下默认都安装了,因为一些安全问题,一般现在的第三方 SSL 证书签发机构都要求起码 2048 位的 RSA 加密的私钥。同时,普通的 SSL 证书认证分两种形式,一种是 DV(Domain Validated),还有一种是 OV (Organization Validated),前者只需要验证域名,后者需要验证你的组织或公司,在安全性方面,肯定是后者要好。无论你用 DV 还是 OV 生成私钥,都需要填写一些基本信息,这里我们假设如下:
域名,也称为 Common Name,因为特殊的证书不一定是域名:example.com
- 组织或公司名字 (Organization):Example, Inc.
- 部门(Department):可以不填写,这里我们写 Web Security
- 城市(City):Beijing
- 省份(State / Province):Beijing
- 国家(Country):CN
- 加密强度:2048 位,如果你的机器性能强劲,也可以选择 4096 位
按照以上信息,使用 OpenSSL 生成 key 和 csr 的命令如下
PS:如果是泛域名证书,则应该填写 *.example.com
你可以在系统的任何地方运行这个命令,会自动在当前目录生成 example_com.csr 和 example_com.key 这两个文件
接下来你可以查看一下 example_com.csr,得到类似这么一长串的文字
这个 CSR 文件就是你需要提交给 SSL 认证机构的,当你的域名或组织通过验证后,认证机构就会颁发给你一个 example_com.crt
而 example_com.key 是需要用在 Nginx 配置里和 example_com.crt 配合使用的,需要好好保管,千万别泄露给任何第三方
Nginx 配置 HTTPS 网站以及增加安全的配置
你需要提交 CSR 文件给第三方 SSL 认证机构,通过认证后,他们会颁发给你一个 CRT 文件,我们命名为 example_com.crt
同时,为了统一,你可以把这三个文件都移动到 /etc/ssl/private/ 目录。
然后可以修改 Nginx 配置文件
检测配置文件没问题后重新读取 Nginx 即可
但是这么做并不安全,默认是 SHA-1 形式,而现在主流的方案应该都避免 SHA-1,为了确保更强的安全性,我们可以采取迪菲-赫尔曼密钥交换
首先,进入 /etc/ssl/certs 目录并生成一个 dhparam.pem
生成完毕后,在 Nginx 的 SSL 配置后面加入
同时,如果是全站 HTTPS 并且不考虑 HTTP 的话,可以加入 HSTS 告诉你的浏览器本网站全站加密,并且强制用 HTTPS 访问
同时也可以单独开一个 Nginx 配置,把 HTTP 的访问请求都用 301 跳转到 HTTPS
可靠的第三方 SSL 签发机构
众所周知,前段时间某 NIC 机构爆出过针对 Google 域名的证书签发的丑闻,所以可见选择一家靠谱的第三方 SSL 签发机构是多么的重要。
目前一般市面上针对中小站长和企业的 SSL 证书颁发机构有:
Comodo / 子品牌 Positive SSL
GlobalSign / 子品牌AlphaSSL
其中 Postivie SSL、AlphaSSL、RapidSSL 等都是子品牌,一般都是三级四级证书,所以你会需要增加 CA 证书链到你的 CRT 文件里。
以 Comodo Positive SSL 为例,需要串联 CA 证书,假设你的域名是 example.com
那么,串联的命令是
在 Nginx 配置里使用 example_com.signed.crt 即可
如果是一般常见的 AplhaSSL 泛域名证书,他们是不会发给你 CA 证书链的,那么在你的 CRT 文件后面需要加入 AlphaSSL 的 CA 证书链