要保证Web浏览器到服务器的安全链接,HTTPS几乎是惟一选择。HTTPS其实就是HTTP over SSL,也就是让HTTP链接创建在SSL安全链接之上。nginx
SSL使用证书来建立安全链接。有两种验证模式:git
仅客户端验证服务器的证书,客户端本身不提供证书;github
客户端和服务器都互相验证对方的证书。shell
显然第二种方式安全性更高,通常用网上银行会这么搞,可是,普通的Web网站只能采用第一种方式。后端
客户端如何验证服务器的证书呢?服务器本身的证书必须通过某“权威”证书的签名,而这个“权威”证书又可能通过更权威的证书签名,这么一级一级追溯上去,最顶层那个最权威的证书就称为根证书。根证书直接内置在浏览器中,这样,浏览器就能够利用本身自带的根证书去验证某个服务器的证书是否有效。浏览器
若是要提供一个有效的证书,服务器的证书必须从VeriSign这样的证书颁发机构签名,这样,浏览器就能够验证经过,不然,浏览器给出一个证书无效的警告。安全
申请一个证书签名的费用是一年几十~几百刀不等,因此若是只是出于管理目的,能够建立自签名证书,保证管理员经过浏览器安全链接到服务器。服务器
下面简单介绍如何建立一个自签名的SSL证书。dom
建立自签名证书须要安装openssl,使用如下步骤:网站
建立Key;
建立签名请求;
将Key的口令移除;
用Key签名证书。
为HTTPS准备的证书须要注意,建立的签名请求的CN必须与域名彻底一致,不然没法经过浏览器验证。
以上步骤命令繁琐,因此我作了一个shell脚本,能一次性把证书搞定。从这里下载脚本:
https://github.com/michaelliao/itranswarp.js/blob/master/conf/ssl/gencert.sh
运行脚本,假设你的域名是www.test.com
,那么按照提示输入:
$ ./gencert.sh Enter your domain [www.example.com]: www.test.com Create server key... Generating RSA private key, 1024 bit long modulus .................++++++ .....++++++ e is 65537 (0x10001) Enter pass phrase for www.test.com.key:输入口令Verifying - Enter pass phrase for www.test.com.key:输入口令Create server certificate signing request... Enter pass phrase for www.test.com.key:输入口令Remove password... Enter pass phrase for www.test.com.origin.key:输入口令writing RSA key Sign SSL certificate... Signature ok subject=/C=US/ST=Mars/L=iTranswarp/O=iTranswarp/OU=iTranswarp/CN=www.test.com Getting Private key TODO: Copy www.test.com.crt to /etc/nginx/ssl/www.test.com.crt Copy www.test.com.key to /etc/nginx/ssl/www.test.com.key Add configuration in nginx: server { ... ssl on; ssl_certificate /etc/nginx/ssl/www.test.com.crt; ssl_certificate_key /etc/nginx/ssl/www.test.com.key; }
红色部分是输入,注意4次输入的口令都是同样的。
在当前目录下会建立出4个文件:
www.test.com.crt:自签名的证书
www.test.com.csr:证书的请求
www.test.com.key:不带口令的Key
www.test.com.origin.key:带口令的Key
Web服务器须要把www.test.com.crt
发给浏览器验证,而后用www.test.com.key
解密浏览器发送的数据,剩下两个文件不须要上传到Web服务器上。
以Nginx为例,须要在server {...}
中配置:
server { ... ssl on; ssl_certificate /etc/nginx/ssl/www.test.com.crt; ssl_certificate_key /etc/nginx/ssl/www.test.com.key; }
若是一切顺利,打开浏览器,就能够经过HTTPS访问网站。第一次访问时会出现警告(由于咱们的自签名证书不被浏览器信任),把证书经过浏览器导入到系统(Windows使用IE导入,Mac使用Safari导入)并设置为“受信任”,之后该电脑访问网站就能够安全地链接Web服务器了:
如何在应用服务器中配置证书呢?例如Tomcat,gunicorn等。正确的作法是不配置,让Nginx处理HTTPS,而后经过proxy以HTTP链接后端的应用服务器,至关于利用Nginx做为HTTPS到HTTP的安全代理,这样即利用了Nginx的HTTP/HTTPS处理能力,又避免了应用服务器不擅长HTTPS的缺点。