防伪码:生当作人杰,死亦为鬼雄。

一、Haproxy篇:

1、centos6.5系统
[root@yangwen ~]# cat /etc/redhat-release
CentOS release 6.5 (Final)
[root@yangwen ~]# uname -r
2.6.32-431.el6.x86_64
2、下载并编译安装openssl
[root@yangwen ~]# wget https://www.openssl.org/source/openssl-1.1.1.tar.gz
[root@yangwen ~]# tar zxf openssl-1.1.1.tar.gz
[root@yangwen ~]# cd openssl-1.1.1
[root@yangwen openssl-1.1.1]# ./config --prefix=/usr/local/
[root@yangwen openssl-1.1.1]# make && make install
[root@yangwen openssl-1.1.1]# echo /usr/local/openssl/lib >>/etc/ld.so.conf
[root@yangwen ~]# ln -sf /usr/local/lib64/libcrypto.so.1.1 /lib64/libcrypto.so.1.1
[root@yangwen ~]# ln -sf /usr/local/lib64/libssl.so.1.1 /lib64/libssl.so.1.1
[root@yangwen ~]# openssl version
OpenSSL 1.1.1  11 Sep 2018
下载haprox并编译安装(支持openssl,可以去此网站下载http://down.51cto.com/)

Nginx/Haproxy实现OpenSSL升级方案+证书安全检测步骤_第1张图片[root@yangwen local]# ls haproxy-1.7.5.tar.gz
haproxy-1.7.5.tar.gz
[root@yangwen local]# tar zxf haproxy-1.7.5.tar.gz
[root@yangwen local]# cd haproxy-1.7.5
[root@yangwen haproxy-1.7.5]# yum -y install pcre-devel zlib-devel
[root@yangwen haproxy-1.7.5]# make TARGET=linux \
USE_ZLIB=1 \
USE_PCRE=1 \
USE_OPENSSL=1 \
SSL_INC=/usr/local/include \
SSL_LIB=/usr/local/lib
[root@yangwen haproxy-1.7.5]# make install
验证:ldd /usr/local/sbin/haproxy | fgrep ssl 应该输出:
[root@yangwen ~]# ldd /usr/local/sbin/haproxy | fgrep ssl
 libssl.so.1.1 => /lib64/libssl.so.1.1 (0x00007f91364b8000) 

二、Nginx篇

1、准备centos6.5系统
[root@yangwen ~]# cat /etc/redhat-release
CentOS release 6.5 (Final)
[root@yangwen ~]# uname -r
2.6.32-431.el6.x86_64
2、编译安装nginx且支持openssl

脚本如下:

#!/bin/bash
wget -P /usr/local/src  http://nginx.org/download/nginx-1.15.6.tar.gz
wget -P /usr/local/src  https://www.openssl.org/source/openssl-1.1.1.tar.gz
yum -y install epel-release
yum -y install patch gcc gcc-c++  readline-devel zlib-devel libffi-devel \
 openssl openssl-devel make autoconf automake libtool bison libxml2 \
 libxml2-devel libxslt-devel libyaml-devel  python  python-docutils \
 cmake imake expat-devel libaio libaio-devel bzr ncurses-devel wget \
 libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel  \
 pcre-devel curl-devel libmcrypt libmcrypt-devel
id nginx &> /dev/null
if [ $? -ne 0 ];then
  groupadd -r nginx
  useradd -g nginx -r nginx
fi
cd /usr/local/src
tar -xvf openssl-1.1.1.tar.gz
tar -xvf nginx-1.15.6.tar.gz
cd /usr/local/src/nginx-1.15.6
./configure --prefix=/usr/local/nginx \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_stub_status_module \
--with-http_auth_request_module \
--with-threads \
--with-stream \
--with-openssl=/usr/local/src/openssl-1.1.1 \
--with-stream_ssl_module \
--with-http_slice_module \
--with-mail \
--with-mail_ssl_module \
--with-file-aio \
--with-http_v2_module \
--with-ipv6 
mkdir -pv /var/cache/nginx/{client_temp,proxy_temp,fastcgi_temp,uwsgi_temp,scgi_temp}
make && make install

[root@yangwen ~]# /usr/sbin/nginx
[root@yangwen ~]# ps -ef | grep nginx
root      15935      1  0 20:38 ?        00:00:00 nginx: master process /usr/sbin/nginx
nginx     15936  15935  0 20:38 ?        00:00:00 nginx: worker process
root      15939   2510  0 20:38 pts/1    00:00:00 grep nginx
[root@yangwen ~]# netstat -anpt | grep nginx
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      15935/nginx        
[root@yangwen ~]# curl -I 127.0.0.1
HTTP/1.1 200 OK
Server: nginx/1.11.7
Date: Tue, 20 Nov 2018 12:38:58 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 20 Nov 2018 12:38:07 GMT
Connection: keep-alive
ETag: "5bf4002f-264"
Accept-Ranges: bytes

[root@yangwen ~]# nginx -V
nginx version: nginx/1.11.7
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-23) (GCC)
built with OpenSSL 1.1.0e  16 Feb 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-threads --with-stream --with-openssl=/usr/local/src/openssl-1.1.0e --with-stream_ssl_module --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio --with-http_v2_module --with-ipv6

3、升级openssl
[root@yangwen ~]# wget https://www.openssl.org/source/openssl-1.1.1.tar.gz
[root@yangwen ~]# tar zxf openssl-1.1.1.tar.gz
[root@yangwen ~]# cd openssl-1.1.1
[root@yangwen openssl-1.1.1]# mkdir -p /usr/local/ssl
[root@yangwen openssl-1.1.1]# ./config   --openssldir=/usr/local/ssl
[root@yangwen openssl-1.1.1]# make -j$(nproc) && make -j$(nproc) install

[root@yangwen openssl-1.1.1]# ln -sf /usr/local/lib64/libcrypto.so.1.1 /lib64/libcrypto.so.1.1
[root@yangwen openssl-1.1.1]# ln -sf /usr/local/lib64/libssl.so.1.1 /lib64/libssl.so.1.1
[root@yangwen openssl-1.1.1]# openssl version
OpenSSL 1.1.1  11 Sep 2018
4、重新编译安装nginx
注意次参数的路径:--with-openssl=/usr/local/src/openssl-1.1.1
[root@yangwen ~]# /usr/sbin/nginx
[root@yangwen ~]# ps -ef | grep nginx
root      37756      1  0 20:57 ?        00:00:00 nginx: master process /usr/sbin/nginx
nginx     37757  37756  0 20:57 ?        00:00:00 nginx: worker process
root      37759   2510  0 20:58 pts/1    00:00:00 grep nginx
[root@yangwen ~]# netstat -anpt | grep nginx
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      37756/nginx        
[root@yangwen ~]# curl -I 127.0.0.1
HTTP/1.1 200 OK
Server: nginx/1.15.6
Date: Tue, 20 Nov 2018 12:58:20 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 20 Nov 2018 12:38:07 GMT
Connection: keep-alive
ETag: "5bf4002f-264"
Accept-Ranges: bytes

[root@yangwen ~]# nginx -V
nginx version: nginx/1.15.6
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-23) (GCC)
built with OpenSSL 1.1.1  11 Sep 2018
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-threads --with-stream --with-openssl=/usr/local/src/openssl-1.1.1 --with-stream_ssl_module --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio --with-http_v2_module --with-ipv6
注:新版的openssl已经集成到里面了,因此ldd /usr/sbin/nginx | grep ssl不会再显示了

我建议如下命令去操作更安全:
./configure xxx
make -j$(nproc)
mv /usr/sbin/nginx /usr/sbin/nginx.old
cp -prd objs/nginx /usr/sbin/nginx
nginx -s reload

三、证书安全检测

近日,证书爆出的漏洞很多,固然有一部分是历史遗留问题,但是日常运维中我们能有较强的安全意识和扎实的基础知识,也能尽早的发现漏洞并整改,防患于未然。
我总结了几种证书漏洞,希望大家集思广益,查缺补漏(证书漏洞查看推荐使用360浏览器)。

第一,证书本身漏洞
1、证书过期
 查看证书方法是,点击网页url左上角的绿色小锁子(有红色×的表示有证书漏洞)—>点击证书信息,在常规里看到有效期。有效期在今日之前即为证书过期。

Nginx/Haproxy实现OpenSSL升级方案+证书安全检测步骤_第2张图片

Nginx/Haproxy实现OpenSSL升级方案+证书安全检测步骤_第3张图片

2、服务器证书与网址不符
   即申请的证书并非适用于本网址,比如网址是oos-nm-iam.ctyunapi.cn,但是证书却是颁发给*.oos-nm.ctyunapi.cn的。

Nginx/Haproxy实现OpenSSL升级方案+证书安全检测步骤_第4张图片

3、证书链不完整。
   证书一般是由根证书+中级证书(有的时候不需要中级证书)+网站ssl证书。
   证书链不完整主要影响在安卓浏览器,安卓手机上会有提示,但PC浏览器上一般是正常的,有两个方法可以检测。
A、linux命令行工具openssl查看
   比如查看内蒙资源池api的网址
   openssl s_client -connect oos-nm.ctyunapi.cn:443
   发现有两个链,如果是一个,就是不完整的表现

Nginx/Haproxy实现OpenSSL升级方案+证书安全检测步骤_第5张图片

 B、通过专门的网站查询,我推荐在线网站https://myssl.com/,输入网站地址,如果证书链不全,会在检测报告里体现出来。

Nginx/Haproxy实现OpenSSL升级方案+证书安全检测步骤_第6张图片 

Nginx/Haproxy实现OpenSSL升级方案+证书安全检测步骤_第7张图片

4、证书签发机构不合法,比如谷歌和Mozilla 已经不再信任沃通在 2016 年 10 月 21 日颁发的证书,这里的证书指的是根证书不合法。比如以360证书为例:

Nginx/Haproxy实现OpenSSL升级方案+证书安全检测步骤_第8张图片

1:根证书,这个不能是沃通证书
2:这个是沃通证书,这个没问题,因为这是中间商的证书,不是证书颁发机构
3:服务器证书。

Nginx/Haproxy实现OpenSSL升级方案+证书安全检测步骤_第9张图片

第二、证书加密协议以及加密套件
     加密协议:
     https其实是有两部分组成:http + SSL / TLS,也就是在http上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据。
     目前sslv3和sslv2协议已经被破解,不再被推荐使用,所以推荐使用更为安全的TLS协议,一般为tlsv1.2。
     加密套件:
     当你在浏览器的地址栏上输入https开头的网址后,浏览器和服务器之间会在接下来的几百毫秒内进行大量的通信。这些复杂的步骤的第一步,就是浏览器与服务器之间协商一个在后续通信中使用的密钥算法。这个过程简单来说是这样的:
浏览器把自身支持的一系列Cipher Suite(密钥算法套件,后文简称Cipher)[C1,C2,C3, …]发给服务器;
服务器接收到浏览器的所有Cipher后,与自己支持的套件作对比,如果找到双方都支持的Cipher,则告知浏览器;
浏览器与服务器使用匹配的Cipher进行后续通信。如果服务器没有找到匹配的算法,浏览器(以Firefox 30为例,后续例子中使用的浏览器均为此版本的Firefox)将给出错误信息。

     目前支持的加密套件中不支持的有RC4,DH等,所以一般在加密套件里一般去掉这些协议。
     目前在各种web服务器配置加密协议和套件不尽相同,在haproxy上配置加密协议和套件如下所示:

KBLAMFKNWDBB]GH}0NG){MS.png

ssl-default-bind-options  设置ssl协议
一般要禁止sslv3      no-sslv3
使用tlsv1.2          force-tlsv12
ssl-default-bind-ciphers   设置加密套件
一般设置为
ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE