前言

对于 ECDH,Wikipedia 如下描述:

Elliptic curve Diffie–Hellman (ECDH) is an anonymous key agreement protocol that allows two parties, each having an elliptic curve public–private key pair, to establish a shared secret over an insecure channel.

ECDH 是基于 ECC(Elliptic Curve Cryptosystems,椭圆曲线密码体制)的 DH( Diffie-Hellman)密钥交换算法。交换双方可以在不共享任何秘密的情况下协商出一个密钥。与 Diffie-Hellman 相比 ECDH 具有 ECC 的高强度、短密钥长度、计算速度快等优点。

由于 ECDH 每次用一个固定的 DH key, 导致不能向前保密(forward secrecy),安全性会降低,所以一般都是用 ECDHE(ECDH 的 ephemeral version)或其他版本的 ECDH 算法。

本文只对 ECDH 进行介绍,只为测试。

环境说明

CentOS 7.2(CentOS_7_x86_64_1151)

OpenSSL 1.0.2e

安装 OpenSSL

1.查看本机安装的版本

#openssl version

OpenSSL 1.0.1e-fips 11 Feb 2013

2.OpenSSL 应在1.0.2以上,这里使用 1.0.2e,去官网下载,源码安装一下,请根据实际情况更改下载地址。

#cd /usr/src

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

#tar -zxf openssl-1.0.2e.tar.gz

3.编译安装 OpenSSL

#cdopenssl-1.0.2e

#./config

#make

#make test

#make install

4.如果旧版本还在,可以先备份,并修改一个

#mv /usr/bin/openssl /root/

#ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl

5.查看版本

# openssl version

OpenSSL 1.0.2e 3 Dec 2015

制作CA证书

ECDH 密钥交换算法,不能自签名,所以制作证书,需要一个 CA 进行颁发。

CA 要给别人颁发证书,首先自己得有一个作为根证书,我们得在一切工作之前修改好 CA 的配置文件、序列号、索引等等。这些参数都是在 openssl.cnf 里面配置的。

#vi /etc/pki/tls/openssl.cnf

openssl.cnf 配置文件中主要关注 [CA_default] 和 [policy_match] 规则

......

[ CA_default ]

dir = /etc/pki/CA # Where everything is keptcerts = $dir/certs # Where the issued certs are keptcrl_dir = $dir/crl # Where the issued crl are keptdatabase = $dir/index.txt # database index file.

#unique_subject = no # Set to 'no' to allow creation of # several ctificates with same subject.new_certs_dir = $dir/newcerts # default place for new certs.

certificate = $dir/cacert.pem # The CA certificateserial = $dir/serial # The current serial numbercrlnumber = $dir/crlnumber # the current crl number # must be commented out to leave a V1 CRLcrl = $dir/crl.pem # The current CRLprivate_key = $dir/private/cakey.pem# The private keyRANDFILE = $dir/private/.rand # private random number file......

......

# For the CA policy[ policy_match ]

countryName = match

stateOrProvinceName = optional

organizationName = optional

organizationalUnitName = optional

commonName = supplied

emailAddress = optional

......

1.先初始化 index.txt 和 serial 文件

#cd /etc/pki/CA/

#touchindex.txt serial

#echo01 > serial

2.生成 CA 的私钥(private key)

#cd /etc/pki/CA/

#openssl genrsa -out private/cakey.pem 2048

3.生成 CA 的证书(certificate),使用 req 命令生成自签证书

#openssl req -new -x509 -key private/cakey.pem -out cacert.pem

会提示输入一些内容,请按提示输入即可。

制作 ECDH 密钥交换的证书

将根证书拷贝到 $HOME 目录,省去输入目录的麻烦,本文只为示例作用。

#cd /etc/pki/CA/private/

#cpcakey.pem ~

#cd /etc/pki/CA/

#cpcacert.pem ~

#cd ~

1.生成 private key 之前,先查看一下那种椭圆曲线可以使用

#openssl ecparam -list_curves

结果如下,OpenSSL 1.0.2e 支持很多。

......secp521r1 : NIST/SECG curve over a 521 bit prime field

prime192v1: NIST/X9.62/SECG curve over a 192 bit prime field

prime192v2: X9.62 curve over a 192 bit prime field

prime192v3: X9.62 curve over a 192 bit prime field

prime239v1: X9.62 curve over a 239 bit prime field

prime239v2: X9.62 curve over a 239 bit prime field

prime239v3: X9.62 curve over a 239 bit prime field

prime256v1: X9.62/SECG curve over a 256 bit prime field......

本例使用 prime256v1

2.生成 ECDH 的私钥(private key)

#openssl ecparam -out ecparam.pem -name prime256v1

#openssl genpkey -paramfile ecparam.pem -out ecdhkey.pem

3.生成 ECDH 的公钥(public key)

#openssl pkey -in ecdhkey.pem -pubout -out ecdhpubkey.pem

4.生成 CSR(Certificate Request)文件,CSR 是需要自签名的,不能使用 ECDH 算法,因为 ECDH 不是签名算法,本例使用RSA算法生成。

#openssl genrsa -out rsakey.pem 1024

#openssl req -new -key rsakey.pem -out ecdhrsacsr.pem

5.最后,使用 ECDH 的公钥和 RSA 的 CSR 制作 ECDH 证书,由于 ECDH 不是自签名算法,不能自签名生成。本例使用刚才制作的 CA 证书生成。

#openssl x509 -req -in ecdhrsacsr.pem -CAkey cakey.pem -CA cacert.pem -force_pubkey ecdhpubkey.pem -out ecdhcert.pem -CAcreateserial

本例后来使用的 RSA 算法生成的 CSR 文件,所以生成的 ecdhcert.pem 支持 ECDH_RSA 的密码套件。

目前生成的证书列表如下:

cakey.pem# CA private key(RSA算法的)

cacert.pem# CA certificate

ecparam.pem# EC Parameters

ecdhkey.pem# ECDH private key

ecdhpubkey.pem# ECDH public key

rsakey.pem# RSA private key(用于请求证书的)

ecdhrsacsr.pem# RSA 的 CSR文件

ecdhcert.pem# ECDH certificate(RSA算法的)

验证 ECDH

使用 OpenSSL 测试

1.服务端

#openssl s_server -cert ecdhcert.pem -key ecdhkey.pem -port 8888

2.客户端 (需要打开一个新的Terminal进行)

#cd ~

#vi test_ciphers

输入如下内容

#!/usr/bin/env bash

# OpenSSL requires the port number.

SERVER=127.0.0.1:8888

DELAY=1

ciphers=$(openssl ciphers 'ECDH:eNULL' | sed -e 's/:/ /g')

echoObtaining cipher list from $(openssl version).

forcipher in ${ciphers[@]}

doecho -n Testing $cipher...

result=$(echo -n | openssl s_client -cipher "$cipher" -connect $SERVER 2>&1)

if [[ "$result" =~ ":error:" ]] ; thenerror=$(echo -n $result | cut -d':' -f6)

echoNO \($error\)

else

if [[ "$result" =~ "Cipher is${cipher}" || "$result" =~ "Cipher :" ]] ; thenechoYES

elseechoUNKNOWN RESPONSE

echo $result

fi

fisleep $DELAY

done

此脚本会验证包含 ECDH 密钥交换算法的密码套件的支持程度,可以修改

ciphers=$(openssl ciphers 'ECDH:eNULL' | sed -e 's/:/ /g')

保存文件后,更改文件为可执行

#chmod +x test_ciphers

执行测试

#./test_ciphers

结果如下

Obtaining cipher list from OpenSSL 1.0.2e 3 Dec 2015.

Testing ECDHE-RSA-AES256-GCM-SHA384...NO (sslv3 alert handshake failure)

Testing ECDHE-ECDSA-AES256-GCM-SHA384...YES

Testing ECDHE-RSA-AES256-SHA384...NO (sslv3 alert handshake failure)

Testing ECDHE-ECDSA-AES256-SHA384...YES

Testing ECDHE-RSA-AES256-SHA...NO (sslv3 alert handshake failure)

Testing ECDHE-ECDSA-AES256-SHA...YES

Testing AECDH-AES256-SHA...NO (sslv3 alert handshake failure)

Testing ECDH-RSA-AES256-GCM-SHA384...YES

Testing ECDH-ECDSA-AES256-GCM-SHA384...NO (sslv3 alert handshake failure)

Testing ECDH-RSA-AES256-SHA384...YES

Testing ECDH-ECDSA-AES256-SHA384...NO (sslv3 alert handshake failure)

Testing ECDH-RSA-AES256-SHA...YES......

可以发现,包含 ECDH-RSA 的密码套件的,都是通过的。

参考资料

primekey证书服务器,使用 OpenSSL 制作 ECDH 密钥交换证书相关推荐

  1. 使用openssl制作https的证书

    1.前言 现在的web应用对安全越来越重视了,很多应用必须采用https来传输数据.但是https必须要有证书,在开发和测试环境一般我们在没条件采用ca签发的可信证书的情况下,我们可以使用openss ...

  2. eap wifi 证书_用openssl为EAP-TLS生成证书(CA证书,服务器证书,用户证书)

    我用的是openssl-1.0.2k. 脚本支持生成RSA,ECC证书. 运行时带参数指定类型. -->开始.按以下路径建立文件,脚本.ssl_create-cert-v0.4.7z ssl_c ...

  3. Ubuntu18.04 使用 openssl制作自签名证书

    执行"openssl verison",判断系统是否已安装openssl,若没有安装,请使用apt安装openssl. 一.图解自签名过程 二.关于 CRT PEM KEY CST ...

  4. asn1 pem pfx格式证书_Linux使用openssl管理自签名证书保障网络安全

    请关注本头条号,每天坚持更新原创干货技术文章. 如需学习视频,请在微信搜索公众号"智传网优"直接开始自助视频学习 1. 前言 本文主要介绍如何在Linux系统上使用OpenSSL命 ...

  5. https证书服务器怎么完成部署?

    HTTPS是一种由http协议和SSL证书一同搭建的网络协议,也被称为https证书.部署了https证书服务器的网站也又更高的安全以及可信度.随着人们对于网络安全意识的提高,也使得https证书服务 ...

  6. Centos搭建简单的证书机构,CA证书服务器

    CA认证: CA认证,即电子认证服务 [1]  ,是指为电子签名相关各方提供真实性.可靠性验证的活动. 证书颁发机构(CA, Certificate Authority)即颁发数字证书的机构.是负责发 ...

  7. 安装win2008r2、域控、IIS、证书服务器、部署exchange2010

    1/45 安装win2008r2.域控.IIS.证书服务器.部署exchange2010目的是最后完成exchange2010的部署,按照win2008r2---域控---IIS---证书服务器--- ...

  8. 使用证书保护网站--兼谈证书服务器吊销列表的使用

    现在许多企业与个人,都拥有属于自己的网站,并且发布在Internet供朋友.合作伙伴或其他人所访问,但是,在许多情况下,某些发布到Internet的网站,只想让指定的用户或指定的人来访问,那么应该怎么 ...

  9. 证书服务器 过期,iis7服务器证书过期如何换新的以及证书服务器

    随着计算机的普及,越来越多的人都在使用计算机来工作,随之而来的就是计算机中遇到的各种各样的问题,因为毕竟不是每个人都是学习计算机出身的,而且对计算机的了解也不是特别的透彻,比如说怎样请求证书?服务器证 ...

最新文章

  1. JavaScript中常见的错误,你犯了几个?
  2. Revit二次开发之“取得所选元素的族名称”
  3. maven Ubuntu14.04 安装
  4. angularjs 验证用户名是否重复
  5. iphone11边框喇手问题_iPhone12手感如何 直角边框真的会割手吗?
  6. Tensorflow API + OpenCV (Real Time Object Detection)
  7. Eclipse 中侧边栏、控制台、Server打不开怎么办?
  8. springboot框架搭建
  9. Keil开发环境安装教程
  10. 聚类及DBSCAN 聚类算法
  11. mysql堆溢出_MySQL错误1436:线程堆栈溢出,带有简单查询
  12. 华为存储发展史:从筚路蓝缕到星辰大海
  13. C语言数字图像处理---ZPHOTOENGINE算法库使用
  14. 基于TX2的全向四轮小车搭建(一)
  15. Python每日一记127文本型数字转化为数值型数字(eval函数)
  16. OCX控件的问题以及解决方法
  17. VS2015 kb2919355 解决方法汇总
  18. 未来智能互联汽车长啥样
  19. Linux下对TF卡进行分区
  20. 四位数码管显示多位数字计时

热门文章

  1. java调用站长之家api查询whois
  2. 数据特征分析技能—— 相关性检验
  3. 【华为认证5G工程师 HCIA-5G V2.0(中文版)发布通知】
  4. androidwebview开发,面试要掌握这几个关键点!内容太过真实
  5. @Async注解测试用例附源码(一)
  6. Chrome扩展插件整理合集
  7. 《画壁》——人人都有一场无悔的爱恋
  8. 实验十六:网络入侵检测系统(IDS)的安装部署
  9. 分布式Redis集群--Cluster架构
  10. java下划线_JAVA找到下划线并且把下划线后面的字母改成大写(简单递归)