OpenSSL
安装
Windows
地址:http://slproweb.com/products/Win32OpenSSL.html
配置环境变量
配置两个环境变量,一个是
OPENSSL_HOME
,另一个要配置到Path
中
OPENSSL_HOME
:就是 OpenSSL 的安装目录
Path
:就是OPENSSL_HOME
目录下的bin
目录
命令
ecparam
椭圆曲线密钥参数生成及操作。
椭圆曲线(ECC)算法是一种公钥算法,它比流行的RSA算法有很多优点:
- 安全性能更高 , 如160位ECC与1024位RSA、DSA有相同的安全强度。
- 计算量小,处理速度快, 在私钥的处理速度上(解密和签名),ECC比RSA、DSA快得多。
- 存储空间占用小 ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多, 所以占用的存储空间小得多。
- 带宽要求低。
用法:
openssl ecparam [-inform DER|PEM] [-outform DER|PEM] [-in filename] [-out filename] [-noout] [-text] [-C] [-check] [-name arg] [-list_curve] [-conv_form arg] [-param_enc arg] [-no_seed] [-rand file(s)] [-genkey] [-engine id]
解释:
-list_curves
:打印所有可用的算法曲线
-genkey
:生成密钥
-name
:使用指定的算法曲线
-out
:输出文件
例子:
比特币选取了
secp256k1
作为算法曲线
# 使用 secp256k1 作为算法曲线,生成 EC 参数和私钥,并输出到 ca-key_.key 文件中
openssl ecparam -genkey -name secp256k1 -out ca-key_.key
pkcs8
pkcs8格式的私钥转换工具
用法:
openssl pkcs8 [-inform PEM|DER] [-outform PEM|DER] [-in filename] [-passin arg] [-out filename] [-passout arg] [-topk8] [-noiter] [-nocrypt] [-nooct] [-embed] [-nsdb] [-v2 alg] [-v1 alg] [-engine id]
解释:
-topk8
:输出pkcs8文件
-v2
:采用PKCS#5 v2.0,并指定加密算法
-inform
:输入文件格式
-outform
:输出文件格式
-in
:输入文件
-out
:指定输出文件
例子:
CBC模式:Cipher-block chaining,密码块连接模式。
目前,CBC是最为常用的工作模式。
- 每一次加密都需要前一个密文块参与,明文中微小的改变都会使后续所有密文改变;
- 无法从密文看出明文的规律。安全性得以提高。
CTR模式:Counter mode,计数器模式。
CTR 模式被广泛用于 ATM 网络安全和 IPSec应用中,相对于其它模式而言,CRT模式具有如下特点:
- 硬件效率:允许同时处理多块明文 / 密文。
- 软件效率:允许并行计算,可以很好地利用 CPU 流水等并行技术。
- 预处理:算法和加密盒的输出不依靠明文和密文的输入,因此如果有足够的保证安全的存储器,加密算法将仅仅是一系列异或运算,这将极大地提高吞吐量。
- 随机访问:第 i 块密文的解密不依赖于第 i-1 块密文,提供很高的随机访问能力。
- 可证明的安全性:能够证明 CTR 至少和其他模式一样安全(CBC, CFB, OFB, …)
- 简单性:与其它模式不同,CTR模式仅要求实现加密算法,但不要求实现解密算法。对于 AES 等加/解密本质上不同的算法来说,这种简化是巨大的。
- 无填充,可以高效地作为流式加密使用。
# 使用 aes-256-cbc 加密算法,将存有 EC 参数和私钥的 ca-key_.key 文件,转换为带有密码保护的 PEM 格式的 pkcs8 文件
openssl pkcs8 -topk8 -v2 aes-256-cbc -inform PEM -outform PEM -in ca-key_.key -out ca-key.key
# 到了这一步,其实可以把没有密码保护的 ca-key_.pem 删除
req
req命令主要用于生成和处理PKCS#10证书请求。
用法:
openssl req [-inform PEM|DER] [-outform PEM|DER] [-in filename] [-passin arg] [-out filename] [-passout arg] [-text] [-pubkey] [-noout] [-verify] [-modulus] [-new] [-rand file(s)] [-newkey rsa:bits] [-newkey dsa:file] [-nodes] [-key filename] [-keyform PEM|DER] [-keyout filename] [-[md5|sha1|md2|mdc2]] [-config filename] [-subj arg] [-multivalue-rdn] [-x509] [-days n] [-set_serial n] [-asn1-kludge] [-newhdr] [-extensions section] [-reqexts section] [-utf8] [-nameopt] [-batch] [-verbose] [-engine id]
解释:
-new
:生成新的证书请求以及私钥,默认为1024比特。
-utf8
:输入字符为utf8编码,默认输入为ASCII编码。
-config
:指定证书请求模板文件,默认采用openssl.cnf,需另行指定时用此选项。配置的写法可以参考openssl.cnf,其中有关于生成证书请求的设置。
-key
:证书私钥文件的来源。允许该文件的格式是PKCS#8
-subj
:用于指定生成的证书请求的用户信息,或者处理证书请求时用指定参数替换。生成证书请求时,如果不指定此选项,程序会提示用户来输入各个用户信息,包括国名、组织等信息,如果采用此选择,则不需要用户输入了。比如:-subj /CN=china/OU=test/O=abc/CN=forxy
,注意这里等属性必须大写。
-out
:要输出的文件名
例子:
证书请求的用户信息:
-subj "/C=国家代码简称/ST=州或省份名称/L=城市或区域名称/OU=组织单位名称/O=组织名称/CN=通用名称(可以是带有通配符的域名)"
# 使用 openssl.cnf 作为证书请求模板文件,生成 ca-req.csr 证书请求文件,指定编码为 utf8 ,并指定用户信息(下面以 baidu.com 的证书信息为例)
openssl req -new -utf8 -config openssl.cnf -key ca-key.key -subj