开发者社区> 问答> 正文

生成、签署 ECC 证书,Apache Httpd 部署双证书教程

妙正灰 2016-12-29 15:37:39 5264
前言


2017年绝对是移动互联网的加密元年,越来越多的移动互联网网站、应用会部署 HTTPS 加密,不过移动平台因为普遍基于 ARM 架构所以对处理 HTTPS 的性能和速度都不如电脑平台。
因此我们就需要部署更短、更快和更安全的 ECC 证书来实现移动平台的 HTTPS 的加密解密高效化。

介绍


椭圆曲线密码学(Elliptic curve cryptography,缩写为ECC),一种建立公开密钥加密的算法,基于椭圆曲线数学,其更适合于移动互联网,有更好的安全性和更好的性能。ECC加密算法 1985年 提出,到 2005 年才在各种操作系统中获得广泛支持,2015 年开始被普遍性的部署。


缺陷:
就像上面所说的一样,2005 年才被各大操作系统广泛支持,所以 2005 之前包括之后几年发布的操作系统都不会对其有很好的支持。
因此会需要使用本文介绍的双证书来解决。

签发


目前主流的 CA 都已经支持了 ECC 证书的签发,但是几个老牌大厂支持 ECC 的证书动辄就是几千元,那还玩个蛋。
目前廉价或免费的 ECC 证书解决方案:
  1. Comodo 的低端证书(四级证书链接,略长)
  2. Let’s Encrypt 的免费证书(90天签发一次,签发略复杂)


CSR 申请方法


一、生成 key

openssl ecparam -genkey -name secp256r1 -out mf8.biz-ecc.key

-name 参数 prime256v1 或者secp384r1。 256bit 其实安全性和速度都足够了.

二、生成 CSR

openssl req -new -sha256 -key vobe-io-ecc.key -out vobe-io-ecc.csr

在这里我们只需要 sha256 即可,这里之后会提问你很多问题,可以搜索一下 csr 的填写教程。

三、傻瓜


一键命令:

openssl ecparam -out 你的域名.ecc.pkey -name secp256r1 -genkey && openssl req -new -key 你的域名.ecc.pkey -sha256 -nodes -out 你的域名.ecc.csr -subj “/C=CN/ST=省份/L=城市/O=组织/OU=组织单位/部门/分支/CN=你的域名”


将中文部分修改补齐即可,默认生成 256 bit 的 key 和 csr 。


在线生成:
https://www.chinassl.net/ssltools/generator-csr.html

Let’s Encrypt 方法

这里介绍用 acme.sh 签发,米饭也是用这货签的。
指定 --keylength ec-256 就可以将证书类型改为 ECC: acme.sh --issue -w /data/wwwroot/www.mf8.biz -d mf8.biz -d www.mf8.biz --keylength ec-256

Apache Httpd 双证书


Nginx 教程: https://www.mf8.biz/ecc-nginx-double-cert/
Apache Httpd 版本: 2.4(2.2 我测试不成功),然后 OpenSSL 库的版本不同,方法也不同。

OpenSSL 1.0.2 or Later


适用于: Ubuntu 16.04 、Debian 9 or 8 + BackPorts 等系统 OpenSSL 版本较高的系统
这里就会非常简单,只要复制两份即可,然后必须将证书和证书链合并为一个文件(证书上,证书链下)。
#ECC 在前
SSLCertificateFile "/usr/local/httpd/conf/ssl/www.mf8.biz.ecc.crt"
SSLCertificateKeyFile "/usr/local/httpd/conf/ssl/www.mf8.biz.ecc.key"
#RSA 在后
SSLCertificateFile "/usr/local/httpd/conf/ssl/www.mf8.biz.crt"
SSLCertificateKeyFile "/usr/local/httpd/conf/ssl/www.mf8.biz.key"


OpenSSL < 1.0.2


适用于: Centos 7 Ubuntu 14.04 等系统 OpenSSL 版本小于 1.0.2 的,需要将 ECC 和 RSA的证书链合并,ECC 在前,RSA 在后。
#ECC 在前
SSLCertificateFile "/usr/local/httpd/conf/ssl/www.mf8.biz.ecc.crt"
SSLCertificateKeyFile "/usr/local/httpd/conf/ssl/www.mf8.biz.ecc.key"
#RSA 在后
SSLCertificateFile "/usr/local/httpd/conf/ssl/www.mf8.biz.crt"
SSLCertificateKeyFile "/usr/local/httpd/conf/ssl/www.mf8.biz.key"
#合并的证书链
SSLcertificateChainFile "/usr/local/httpd/conf/ssl/ca.crt"


Cipher Suites

[font=-apple-system, BlinkMacSystemFont, &]然后不管 OpenSSL 版本,Cipher Suites 都要搞好,不然双证书是不会生效的。
SSLCipherSuite: EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;

效果图


来自: https://www.mf8.biz/ecc-httpd-double-cert/

Ubuntu 算法 安全 应用服务中间件 Linux 网络安全 Apache 数据安全/隐私保护 nginx
分享到
取消 提交回答
全部回答(1)
  • 鬼才神兵
    2017-01-04 07:14:53
    您的无私奉献精神值得我们学习!向您致敬!
    0 0

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题