ECC算法,目前主要用于签名/验签和生成DH会话秘钥。
下面的表格展示了在相同的安全登记下,ECC和RSA秘钥长度的对比:
RSA size(in bits) | ECC size(in bits) |
---|---|
1024 | 160 |
2048 | 224 |
3072 | 256 |
7680 | 384 |
前提准备
需要下载安装openssl,并将其添加进path
确保openssl可以使用后,列出可用ECC曲线
openssl ecparam -list_curves
我们使用prime256v1
生成ECC
秘钥对。
使用ECC key
生成CA
证书
我们需要使用CA
证书来签名服务器和客户端的证书,使用ECC
私钥生成CA
根证书,为此我们创建几个目录,用来存储CA
证书,秘钥,索引数据
任意创建一个文件夹,这里随意命名位tls
然后在该文件夹里创建如上图圈出文件/文件夹,其他都是后面命令自动生成的
- private: 用于存放CA私钥
- cert:用于存放CA自签的CA证书
- client_certs: 用于存放经CA签发好的客户端证书集合
- server_certs: 用于存放经CA签发好的服务器证书集合
- newcerts: 用于存放经CA签发好的所有证书集合并编号
- index:用于存放证书索引信息
- serial: 用于存放证书编号,并在serial文件中添加10000001初始编号,之后每签名一个新证书,编号自动+1
- openssl.cnf为配置文件,可以从目录bin/cnf中拷贝过来
红色箭头处修改为自己创建的根文件夹名
建立CA,创建自签名证书
命令行进入自己创建的文件夹
生成CA ECC私钥
openssl ecparam -out private/ec-cakey.pem -name prime256v1 -genkey
⽣成秘钥时,openssl默认仅存储曲线的名字:
openssl ecparam -in private/ec-cakey.pem -text -noout
生成CA证书
使用上一步生成的CA私钥,生成CA证书
openssl req -new -x509 -days 3650 -config openssl.cnf -extensions v3_ca -key private/ec-cakey.pem -out cert/ec-cacert.pem
接下来,我们可以验证下CA证书的内容和使用的签名算法
openssl x509 -noout -text -in cert/ec-cacert.pem
可以看到,我们使用的是ECDSA签名算法来生成我们的CA证书,而不是使用的RSA。
使用私钥验证CA证书
如果想使用私钥(包含ECDSA key)验证证书:
openssl x509 -noout -pubkey -in cert/ec-cacert.pem
类似的我们可以从私钥导出公钥
openssl pkey -pubout -in private/ec-cakey.pem
可以看到生成的公钥是相同的
使用CA私钥和证书签发服务端证书
命令行进入server_certs
文件夹
我们再一次使用曲线prime256v1生成ECC的私钥
openssl ecparam -out server.key -name prime256v1 -genkey
验证曲线:
openssl ecparam -in server.key -text -noout
生成服务端证书请求文件CSR
我们的CA证书生成时,使用的是openssl.cnf
里的v3_ca
扩展选项
CA证书会匹配 Country Name, state or Province Name and Organization Name
.所以服务端证书的CSR请求里的值必须匹配CA证书里相应的值。
Common Name
必须是服务端的主机名(hostname
),客户端与服务端认证时会使用这个Common Name
.
生成CSR请求:
openssl req -new -key server.key -out server.csr -sha256
现在我们使用ECC CA私钥,CA证书,对server.csr进行签名,生成服务端证书:
openssl ca -keyfile ../private/ec-cakey.pem -cert ../cert/ec-cacert.pem -in server.csr -out server.crt -config ../openssl.cnf
验证证书是否有效时使用CA证书进行验证
openssl verify -CAfile ../cert/ec-cacert.pem server.crt
我们也可以验证服务器证书的签名算法,确保使用的是ECC私钥
openssl x509 -noout -text -in server.crt
验证index.txt
验证index.txt包含服务端证书的信息,这个服务端证书是我们使用CA证书签名的。100000001是我们再开始部分写入的序列号,每次签名这个序列号都会自加1
客户端证书生成与服务器类似。