Patch OpenSSL使其支持CHACH20_POLY1305加密算法

截止目前的OpenSSL-1.0.2j的版本还不支持Google的CHACHA20加密算法.CHACHA20加密算法相对RC4等相对安全,也针对ARM的手机端进行优化,使其更快更省电。

不过最新的Intel处理器及ARM V8的处理器通过AES-NI指令集对AES-GCM加密算法进行了优化,速度要比chacha20快很多,所以在支持AES-NI指令集的设备上优先使用AES-GCM加密算法,在设备不支持的情况下使用chacha20加密算法。

支持chacha20加密算法的3种方式:

  1. 使用LibreSSL(OpenBSD Fork)
  2. 使用BoringSSL(Google Fork)
  3. 使用CloudFlare提供的Patch

三种方法对比:

  1. LibreSSL能支持OCSP stapling,但是如果首选了CHACHA20作为优先算法,则只要支持CHACHA20算法的都是用CHACHA20算法,支持AES-NI指令集的设备无法发挥出相应的性能
  2. BoringSSL则可以对支持AES-NI指令集的设备优先使用AES-GCM加密算法,但是目前不支持OCSP stapling
  3. 使用CloudFlare提供的Patch则可以自动适应,AES-NI设备使用AES-GCM,不支持的设备使用CHACHA20

环境:

CentOS 6.8 x86_64

OpenSSL-1.0.2j

Nginx-1.10.2

下载CloudFlare提供的Patch

wget https://codeload.github.com/cloudflare/sslconfig/zip/master

下载OpenSSL

wget https://www.openssl.org/source/openssl-1.0.2j.tar.gz

下载Nginx

wget http://nginx.org/download/nginx-1.10.2.tar.gz

安装依赖包

yum -y install gcc gcc-c++ pcre-devel zlib-devel unzip patch

解压文件

unzip master
tar zxf nginx-1.10.2.tar.gz
tar zxf openssl-1.0.2j.tar.gz

对OpenSSL进行补丁操作

cd openssl-1.0.2j
patch -p1 < ../sslconfig-master/patches/openssl__chacha20_poly1305_draft_and_rfc_ossl102j.patch
#此处说明一下须使用同版本的补丁,我这里是1.0.2j就用ossl102j的patch
cd ..

编译Nginx

cd nginx-1.10.2
./configure --prefix=/usr/local/nginx1.10.2 --user=www --group=www --with-openssl=../openssl-1.0.2j --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module
make && make install

如果执行make && make install的时候报错,则需要

make -f objs/Makefile
make[1]: Entering directory `/root/nginx-1.10.2‘
cd ../openssl-1.0.2j         && if [ -f Makefile ]; then make clean; fi         && ./config --prefix=/root/nginx-1.10.2/../openssl-1.0.2j/.openssl no-shared          && make         && make install_sw LIBDIR=lib
make[2]: Entering directory `/root/openssl-1.0.2j‘
Makefile is older than Makefile.org, Configure or config.
Reconfigure the source tree (via ‘./config‘ or ‘perl Configure‘), please.
make[2]: *** [Makefile] Error 1
make[2]: Leaving directory `/root/openssl-1.0.2j‘
make[1]: *** [../openssl-1.0.2j/.openssl/include/openssl/ssl.h] Error 2
make[1]: Leaving directory `

上面的报错信息是因为打了补丁的原因,提示Makefile.org比Makefile新,所以停止操作。这个时候我们可以手动编译OpenSSL

cd ../openssl-1.0.2j 
./config --prefix=/root/nginx-1.10.2/../openssl-1.0.2j/.openssl no-shared
make
make install_sw LIBDIR=lib

再次执行make && make install就不会报错了

查看结果:

/usr/local/nginx1.10.2/sbin/nginx -V
nginx version: nginx/1.10.2
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC) 
built with OpenSSL 1.0.2j  26 Sep 2016
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx1.10.2 --user=www --group=www --with-openssl=../openssl-1.0.2j --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module

可以看到的是OpenSSL 1.0.2j.

然后Nginx的配置文件如下:

server {
    listen       443;
    server_name m.abc.com;
    access_log  logs/https_m.abc.com.log  main;
    ssl on;
    ssl_certificate keys/server.pem;
    ssl_certificate_key keys/server.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    #定义加密算法
    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_session_timeout 5m;
    ssl_session_cache builtin:1000 shared:SSL:10m;
    location / {
        root html;
        index index.html;
    }

不支持AES-NI指令集的手机访问使用CHACHA20_POLY1305进行加密和身份验证

支持AES-NI指令集的手机访问使用AES_128_GCM进行加密和身份验证

时间: 2024-10-19 03:40:40

Patch OpenSSL使其支持CHACH20_POLY1305加密算法的相关文章

显示本地openssl支持的加密算法

参考页面: http://www.yuanjiaocheng.net/entity/choose-development-approach.html http://www.yuanjiaocheng.net/entity/query-with-edm.html http://www.yuanjiaocheng.net/entity/linq-to-entities-projection.html http://www.yuanjiaocheng.net/entity/dbset-class.ht

使用mod_encoding使apache支持中文附件名

本地测试环境为apache2.2.31,PHP5.3.27,操作系统为RHEL6.4x86_64,使用mod_encoding工具使apache支持中文附件名,比如http://www.example.com/合同.rar 1.先修改操作系统的语言环境,使linux本地支持中文,可以查看中文文件名 修改/etc/sysconfig/i18n文件将LANG="en_US.UTF-8"SYSFONT="latarcyrheb-sun16"修改为 LANG="z

[archlinux][tls] archlinux下使curl支持sslv3的方法

描述 在archlinux下,希望使用curl产生一条使用sslv3的https访问请求. 使用curl的如下命令: curl -k -vvv --sslv3 https://192.168.7.9:8080 然而很遗憾,因为sslv3太老了,所以它不支持, ╰─>$ curl -k -vvv --sslv3 https://192.168.7.9:8080 * Trying 192.168.7.9:8080... * TCP_NODELAY set * Connected to 192.168

PIE使IE支持CSS3圆角盒阴影与渐变渲染

PIE使IE支持CSS3圆角盒阴影与渐变渲染 http://css3pie.com/download/

配置 squid 使其支持 访问https站点

需求:让用户通过squid访问https网站 注意和配置squid使其支持https不同 网上的资料基本都是给squid配置一个证书,但直觉告诉我这并不能解决我们的问题 进入正题,通过之前配置好的squid访问http站点可以正常访问, 但无法访问https开头的网站 查找问题最好的方法就是分析日志 access.log中发现如下信息 NONE/400 4280CONNECT error:method-not-allowed - NONE/- text/html 查看 squid.conf ,默

如何配置IIS使其支持APK文件的下载

如何配置IIS使其支持APK文件的下载APK文件是安卓的安装程序的文件,IIS里的MIME里默认是不支持的.如果没有配置MIME时,直接输入网址要下载APK文件时,会提示找不到此文件.这里教你如何配置IIS的MIME设置,使其可以支持APK文件的下载.1.在管理工具里打开Internet 信息服务(IIS)管理器.然后选择需要配置的网站.2.右侧的界面中会显示该网站的所有功能配置,我们选择并点击进入“MIME类型”3.在右侧的操作区选择点击“添加”MIME.4.在弹出的添加窗口里的文件扩展名输入

使IE支持placeholder

Html5的表单添加了许多给力的属性,其中输入框的placeholder便是很赞的属性!现代浏览器大多都支持这个属性,但IE8....好吧,前端的童鞋们总会想出各种姿势对付IE的~_~ //使IE支持placeholder if( !('placeholder' in document.createElement('input')) ){ $('input[placeholder]').each(function(){ var that = $(this), text= that.attr('p

【Python】nose_parameterized使unitTest支持参数化

nose_parameterized使unitTest支持参数化 GIThttps://github.com/wolever/nose-parameterized And @parameterized.expand can be used to generate test methods in situations where test generators cannot be used (for example, when the test class is a subclass of uni

Linux下安装libiconv使php支持iconv函数

libiconv组件安装好了可以让我们php支持iconv函数了,这个函数的作用就是字符编码强制转换了,下面和111cn小编一起来看一个Linux中安装libiconv使php支持iconv函数的例子吧. 问题: 线上运行的lamp服务器,php不支持iconv函数. 解决方法: 安装libiconv,重新编译apache,使php支持iconv函数,实现utf-8和gb2312编码的转换. 具体步骤: 1.下载libiconv cd /usr/local/src wget http://ftp