原创文章,转载请指明出处并保留原文url地址
现在网络完全越来越受到重视, 因此https也是大势所趋, 以往nginx都是工作在http方式下, 其实nginx在https下工作也挺好的。 这里将分步骤的逐步实现一套采用nginx, haproxy, keepalived实现的https系统, 并且系统没有单点故障, 基本适应中小系统的安全需要。
1. Nginx https安装 (本文)这个文章主要是安装支持https的nginx, 源代码装过程
2. https安装(2)nginx配置 继承上一个文章, 记录配置过程, 然后实现https服务
3. 两台nginx实现https负载均衡 介绍通过haproxy实现两个nginx的负载均衡, 解决nginx的单点故障
下面用到的几个文件, 已经下载好, 可以直接使用
openssl-0.9.8y.tar
pcre-8.33.tar
zlib-1.2.8.tar
1. Nginx的优点
Nginx作为WEB服务器,Nginx处理静态文件、索引文件、自动索引的效率非常高。
Nginx作为代理服务器,Nginx可以实现无缓存的反向代理,提高网站的性能
Nginx作为负载均衡服务器,内部可以支持PHP、也可以支持HTTP代理服务器对外进行服务,同时还支持简单的容错和利用算法进行负载;
Nginx在性能方面:Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率 。它支持内核Poll模型,能经受高负载的考验,有报告表明能支持高达 50,000个并发连接数。
Nginx具有很高的稳定性,其它HTTP服务器当遇到访问的峰值,或者有人恶意发起
慢速连接时,也很可能会导致服务器物理内存耗尽频繁交换,失去响应只能重启服务器。例如当前Apache一旦上到200个以上进程,web响应速度就明显非常缓慢了。而Nginx采
取了分阶段资源分配技术,使得它的CPU与内存占用率非常低。Nginx官方表示保持10,000个没有活动的连接,它只占2.5M内存,所以类似DOS这样的攻击对Nginx来说毫无用处;
Nginx高可用方面:Nginx支持热部署,它的启动特别容易, 并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在不间断服务的情况下,对软件版本进行进行升级。
2. https
2.1. 什么是HTTPS
在说HTTPS之前先说说什么是HTTP,HTTP就是我们平时浏览网页时候使用的一种协议。HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全。为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。SSL目前的版本是3.0,被IETF(Internet Engineering Task Force)定义在RFC 6101中,之后IETF对SSL 3.0进行了升级,于是出现了TLS(Transport Layer Security) 1.0,定义在RFC 2246。实际上我们现在的HTTPS都是用的TLS协议,但是由于SSL出现的时间比较早,并且依旧被现在浏览器所支持,因此SSL依然是HTTPS的代名词,但无论是TLS还是SSL都是上个世纪的事情,SSL最后一个版本是3.0,今后TLS将会继承SSL优良血统继续为我们进行加密服务。目前TLS的版本是1.2,定义在RFC 5246中,暂时还没有被广泛的使用。
对历史感兴趣的朋友可以参考http://en.wikipedia.org/wiki/Transport_Layer_Security,这里有对TLS/SSL详尽的叙述。
2.2 HTTPS到底安全吗?
这个答案是肯定的,很安全。谷歌公司已经行动起来要大力推广HTTPS的使用,在未来几周,谷歌将对全球所有本地域名都启用HTTPS,用户只要在搜索前用Google帐号登录,之后所有的搜索操作都将使用TLS协议加密,见:http://thenextweb.com/google/2012/03/05/google-calls-for-a-more-secure-web-expands-ssl-encryption-to-local-domains/。
2.3 HTTPS的工作原理
HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。TLS/SSL协议不仅仅是一套加密传输的协议,更是一件经过艺术家精心设计的艺术品,TLS/SSL中使用了非对称加密,对称加密以及HASH算法。握手过程的简单描述如下:
1.浏览器将自己支持的一套加密规则发送给网站。
2.网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
3.获得网站证书之后浏览器要做以下工作:
a) 验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。
b) 如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码,并用证书中提供的公钥加密。
c) 使用约定好的HASH计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。
4.网站接收浏览器发来的数据之后要做以下的操作:
a) 使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。
b) 使用密码加密一段握手消息,发送给浏览器。
5.浏览器解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密。
这里浏览器与网站互相发送加密的握手消息并验证,目的是为了保证双方都获得了一致的密码,并且可以正常的加密解密数据,为后续真正数据的传输做一次测试。另外,HTTPS一般使用的加密与HASH算法如下:
非对称加密算法:RSA,DSA/DSS
对称加密算法:AES,RC4,3DES
HASH算法:MD5,SHA1,SHA256
其中非对称加密算法用于在握手过程中加密生成的密码,对称加密算法用于对真正传输的数据进行加密,而HASH算法用于验证数据的完整性。由于浏览器生成的密码是整个数据加密的关键,因此在传输的时候使用了非对称加密算法对其加密。非对称加密算法会生成公钥和私钥,公钥只能用于加密数据,因此可以随意传输,而网站的私钥用于对数据进行解密,所以网站都会非常小心的保管自己的私钥,防止泄漏。
TLS握手过程中如果有任何错误,都会使加密连接断开,从而阻止了隐私信息的传输。正是由于HTTPS非常的安全,攻击者无法从中找到下手的地方,于是更多的是采用了假证书的手法来欺骗客户端,从而获取明文的信息,但是这些手段都可以被识别出来,我将在后续的文章进行讲述。不过2010年还是有安全专家发现了TLS 1.0协议处理的一个漏洞:http://www.theregister.co.uk/2011/09/19/beast_exploits_paypal_ssl/,实际上这种称为BEAST的攻击方式早在2002年就已经被安全专家发现,只是没有公开而已。目前微软和Google已经对此漏洞进行了修复。见:http://support.microsoft.com/kb/2643584/en-us https://src.chromium.org/viewvc/chrome?view=rev&revision=90643
3. 采用nginx来搭建https服务器
3.1 准备虚拟机vmware
我们将采用vmware安装 linux虚拟机, 然后在linux虚拟机中, 安装nginx.
虚拟机采用从互联网下载好的虚拟机, 信息如下:
3.2 下载nginx
进入linux中, 输入:
wget http://nginx.org/download/nginx-1.5.3.tar.gz
下载nginx
解压缩:
tar xzvf nginx-1.5.3.tar.gz
配置nginx
./configure --with-http_stub_status_module --with-http_ssl_module
提示
./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.
需要安装 pcre程序
3.3 安装pcre
到http://www.pcre.org/下载 pcre程序(yum 安装后, nginx还是提示找不到相关类)
PCRE - Perl Compatible Regular Expressions
The PCRE library is a set of functions that implement regular expression pattern matching using the same syntax and semantics as Perl 5. PCRE has its own native API, as well as a set of wrapper functions that correspond to the POSIX regular expression API. The PCRE library is free, even for building proprietary software.
PCRE was originally written for the Exim MTA, but is now used by many high-profile open source projects, including Apache, PHP, KDE, Postfix, Analog, and Nmap. PCRE has also found its way into some well known commercial products, like Apple Safari. Some other interesting projects using PCRE include Chicken, Ferite, Onyx, Hypermail, Leafnode, Askemos, and Wenlin.
输入下面命令, 下载pcre程序
wget http://downloads.sourceforge.net/project/pcre/pcre/8.33/pcre-8.33.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fpcre%2Ffiles%2Fpcre%2F8.33%2F&ts=1379034447&use_mirror=jaist
tar xzvf pcre-8.33.tar.gz 解压缩
cd pcre-8.33 进入目录
./configure && make && make install 配置编译, 安装
输出如下信息:
configure: error: You need a C++ compiler for C++ support.
yum install -y gcc-c++ 安装编译器
安装完成 gcc-c++后, 再次安装 pcre, 安装成功过
进入nginx目录, 再次运行
./configure --with-http_stub_status_module --with-http_ssl_module
有如下信息:
./configure: error: SSL modules require the OpenSSL library.
You can either do not enable the modules, or install the OpenSSL library
into the system, or build the OpenSSL library statically from the source
with nginx by using --with-openssl=<path> option.
我们还需要openssl(我们需要源代码, 经过测试,不指定源代码目录,还是安装不成功)
3.4 安装openssl
到网站:
http://www.openssl.org/source/
下载 openssl
wget http://www.openssl.org/source/openssl-0.9.8y.tar.gz
下载openssl源代码
解压缩
tar xzvf openssl-0.9.8y.tar.gz
配置openssl
./config --prefix=/usr/local/openssl
编译安装: make && make install
再次进入nginx安装目录, 配置nginx系统
./configure --with-http_stub_status_module --with-http_ssl_module --with-openssl=/root/openssl-0.9.8y
输出结果如下:
./configure: error: the HTTP gzip module requires the zlib library.
You can either disable the module by using --without-http_gzip_module
option, or install the zlib library into the system, or build the zlib library
statically from the source with nginx by using --with-zlib=<path> option.
需要安装 zlib软件包
3.5 安装zlib
http://www.zlib.net/
wget http://zlib.net/zlib-1.2.8.tar.gz
下载: wget http://zlib.net/zlib-1.2.8.tar.gz
解压缩:tar xzvf zlib-1.2.8.tar.gz
cd zlib-1.2.8
ls
配置: ./configure
编译安装: make && make install
3.6 安装nginx并运行nginx
进入nginx目录, 输入如下命令:
./configure --with-http_stub_status_module --with-http_ssl_module --with-openssl=/root/openssl-0.9.8y
make && make install 安装nginx系统
[root@iig nginx-1.5.3]# cd /usr/local/nginx/sbin/
[root@iig sbin]# ./nginx
./nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory
[root@iig sbin]#
运行nginx命令, 发现不能运行.
在搜索引擎查找,发现相关问题情况如下
在centos5.7 32位上编译安照 nginx-1.1.16 出错
[root@localhost conf]# /usr/local/nginx/sbin/nginx
/usr/local/nginx/sbin/nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory
从错误看出是缺少lib文件导致,进一步查看下
[root@localhost conf]# ldd $(which /usr/local/nginx/sbin/nginx)
linux-gate.so.1 => (0x0071b000)
libpthread.so.0 => /lib/libpthread.so.0 (0×00498000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0×00986000)
libpcre.so.1 => not found
libcrypto.so.6 => /lib/libcrypto.so.6 (0×00196000)
libz.so.1 => /lib/libz.so.1 (0×00610000)
libc.so.6 => /lib/libc.so.6 (0x002d7000)
/lib/ld-linux.so.2 (0x006a8000)
libdl.so.2 => /lib/libdl.so.2 (0x008c3000)
可以看出 libpcre.so.1 => not found 并没有找到,进入/lib目录中手动链接下
[root@localhost lib]# ln -s libpcre.so.0.0.1 libpcre.so.1
在64位系统测试时, 发现需要进入 /lib64目录, 执行上述目录后, 才能启动nginx
然后在启动nginx ok 了
[root@iig sbin]# ldd $(which /usr/local/nginx/sbin/nginx)
linux-gate.so.1 => (0x00d47000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00ba3000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0x00bf0000)
libpcre.so.1 => not found
libdl.so.2 => /lib/libdl.so.2 (0x00b3b000)
libz.so.1 => /lib/libz.so.1 (0x00f3f000)
libc.so.6 => /lib/libc.so.6 (0x009f6000)
/lib/ld-linux.so.2 (0x009d8000)
重新启动nginx, 没有报错误, 这样 支持 https的nginx安装完毕.
在安装过程中, 还发现一些其他问题,如下:
由于客户的VPS上有一个需要信用卡认证网站,以便于从国外接受信用卡付款
但经过几次信用卡公司安全检测,总是给出一些高危提示
昨天晚上给这个机器升级了openSSL 和 openSSH 到最新版本
今天升级Nginx 时候报错
openssl/include/openssl/ssl.h Error 2
解决办法是将--with-openssl=<dir> 中的 dir 指向openSSL的源码目录
我昨天升级时候,将 openSSL放到了 /root 下,那么就是
--with-openssl=/root/openssl-VERSION
VERSION代表版本号码,具体要看你自己的版本是什么
相关文章
https安装(2)nginx配置