OpenSSL 是一个强大的开源加密库,提供了一系列密码学功能,包括加密、解密、数字签名、证书生成和管理等。它同时也是一个通用的 SSL/TLS 协议实现,用于安全地传输数据。您可以使用 OpenSSL 来创建和管理证书、进行加密通信,以及执行各种与加密相关的操作。
安装
查看版本
openssl version
openssl version -a
如
> openssl version
OpenSSL 1.0.2k-fips 26 Jan 2017
升级版本
#更新yum
yum update -y
#查看可用版本
yum list available openssl
#或者使用
yum info openssl
源码编译安装
wget https://www.openssl.org/source/old/1.1.1/openssl-1.1.1w.tar.gz
tar -zxf openssl-1.1.1w.tar.gz
配置安装
./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl shared zlib
make && make install
--prefix 指定安装目录
shared表示构建共享库,zlib表示使用zlib压缩
新建软连接
mv /usr/bin/openssl /usr/bin/openssl_bak
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
mv /usr/include/openssl /usr/include/openssl_bak
ln -s /usr/local/openssl/include/openssl /usr/include/openssl
更新动态链接库
echo "/usr/local/openssl/lib" > /etc/ld.so.conf.d/openssl.conf
ldconfig
查看是否支持sm2
openssl ecparam -list_curves
生成sm2 key
openssl ecparam -genkey -name SM2 -param_enc explicit -outform pem -out sm2key.pem
生成私钥
证书一般都是使用非对称加密,包含公钥和私钥两部分。首先需要一个私钥,最常见的是使用RSA非对称加密算法。
下面就是使用genra来生成RSA算法的私钥:
openssl genrsa -out rsa_priv.key 2048
-out指定输出密钥存储文件位置,
-des3 可以指定使用des3加密密钥,需要输入一个密码
最后数字2048指定私钥字节长度,必须是最后一个参数。默认值是2048。
另外还可以对私钥生成密码保护,可以使用-aes128,-aes192,-aes256。当然也可以使用des。如-des,-des3。设置密码保护参数时候会提示输入密码。
如果设置了密码,查看私钥信息会有对应的加密方法
> cat priv.key
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,A56910C3F5355F8A5A357952BB08E1D7
qKCeF3Q11Rcyc2yLYdHsgsLlzRz8+2fGfXeRFckldwR0aMAOzADUqCzC0fDEbY/V
+YYhf/DZXux355YyBYYiS4Rfu9bX+QD9vXIPEmPF/I3VGAPcjlj5OWOL3rWHDO2f
N1mlnFrtm8y3rLvVUhrK9y48n8uJCdD/xbtXpvwtYlVCFnY9kSk7U1blRhdr0h2L
...
私钥内的数据不仅仅是二进制数据,其有一定的结构信息。可以使用rsa命令来查看
openssl rsa -text -in priv.key
同样可以根据私钥来生成公钥
openssl rsa -in priv.key -pubout -out pub.key
生成待签名证书请求(CSR)
证书签名请求(Certificate Signing Request),生成csr文件。
有了私钥之后,下一步就就可以根据私钥来生成csr。
需要使用req命令:
shell
> openssl req -key rsa_priv.key -new -out test.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
#国家名称
Country Name (2 letter code) [XX]:CN
#省
State or Province Name (full name) []:Shandong
#城市
Locality Name (eg, city) [Default City]:Jinan
#机构或公司名称
Organization Name (eg, company) [Default Company Ltd]:CaoCao
#组织单位名称
Organizational Unit Name (eg, section) []:Cao
#一般填写域名
Common Name (eg, your name or your server's hostname) []:www.caocao.com
#邮箱
Email Address []:6667@qq.com
#往下两个参数可不填
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
一些常用参数说明:
-key 指定生成csr文件的密钥文件
-newkey rsa:nbits 如果没有私钥,使用该参数指定生成一个新私钥来进行csr。 例如,rsa:2048
表示使用 RSA 算法和 2048 位的密钥。
-keyout 如果创建一个新私钥,指定新密钥的存储位置。
-nodes:如果生成csr时创建一个新密钥,设置新密钥不加密。
-new 生成一个新的csr请求
-out 指定csr文件保存位置
证书签名请求命令需要填写一些主题相关信息,见上面交互命令填写备注信息。
根据上面的参数,如果预先没有密钥,可以使用-newkey命令来同时生成私钥
shell
openssl req -newkey rsa:2048 -nodes -keyout priv.key -out test.csr
生成test.csr文件同时生成私钥priv.key
待签名主题信息除了使用上面的交互式方式进行输入外,还可以将其统一配置在一个配置文件里,然后使用-config来指定配置文件
openssl req -new -config test.conf -key priv.key -out test1.csr
test.conf配置文件内容如下:
[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = mydn
[mydn]
C=CN
ST=ShanDong
L=Jinan
O=TestCompany
#organ unit
OU=testorg
#common name
CN=www.test.com
emailAddress=3333@qq.com
[req]下的部分来指定生成req命令参数信息,default_bits表示默认密钥长度2048,prompt表示关闭交互命令方式,default_md表示消息摘要算法,distinguished_name表示主题名称,如这里mydn,在下面的[mydn]部分就是来指定主题信息部分。这部分和交互式命令输入内容相同,就是包括国家,省,市,组织单位,通用名称,邮箱等信息。
csr生成之后,可以使用以下命令来查看确认待签名信息是否正确
openssl req -in test.csr -text -noout
这会回显待签名上面输入的主题信息
生成签名证书
CSR生成确认之后,就可以去公开的CA(Certificate Authority(证书颁发机构))机构去进行签名来生成签名证书。我们这里呢不会去CA机构来生成签名证书,这里只是为了学习生成签名证书的方法。openssl生成签名证书需要指定CAZ证书相关信息
使用CA根证书对待签名证书生成签名证书
openssl x509 -req -in test.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out test.crt -days 365
这里主要通过x509命令来生成签名证书
X509
-in filename :指定待签名证书文件,csr文件
-out filename:指定输出签名证书文件名
-pubkey filename:导出证书的公钥
-days 指定证书有效时间
CA证书相关参数:
-CA filename:指定CA证书文件
-CAkey filename:指定CA私钥文件
-CAcreateserial:如果CA序列号文件不存在,将创建该文件
这里除了CA证书和CA私钥文件其它的参数数据都有了,CA证书也是一个签名证书,可以通过openssl命令来生成自签名CA根证书
生成自签名CA根证书
openssl req -x509 -sha256 -days 1825 -newkey rsa:2048 -keyout rootCA.key -out rootCA.crt
-x509:指定生成自签名证书
-days:指定证书有效期
这样生成了自签名根证书后,下一步就可以使用根证书来对CSR进行签名生成签名证书了。
自签名证书
如果你只是需要自签名证书的话,也可以只用指定签名私钥即可,使用-signkey来指定签名私钥:
> openssl x509 -req -days 365 -in test1.csr -signkey priv.key -out test1.crt
Signature ok
subject=C = CN, ST = ShanDong, L = Jinan, O = TestCompany, OU = testorg, CN = www.test.com, emailAddress = 3333@qq.com
Getting Private key
Enter pass phrase for priv.key:
自签名证书的Issuer(颁发者)和Subject(主题)相同。这个也很好理解,因为签名时候没有使用CA证书,只是使用的私钥,私钥里没有公司相关信息,所以颁发者信息只能取csr中的信息。可以通过下面要介绍的证书提取命令来查看证书信息。
这里介绍了两种生成签名证书的方法:
1、直接使用一个私钥,这样是自签名
2、自己模拟生成一个CA的签名证书,然后使用该证书对CSR签名生成签名证书。
提取证书信息
签名证书生成后,可以下发给客户端使用。客户端可以根据证书信息提取公钥、证书序列化、颁发者和主题、有效期等信息,这样客户端就可以对证书进行简单验证,验证颁发者和主题是否合法及相符,然后才使用公钥进行签名验签,加密解密操作。
#显示证书的详细信息
openssl x509 -in rootCA.crt -text -noout
#提取证书颁发者信息
openssl x509 -in test.crt -issuer -noout
#提取证书序列号
openssl x509 -in test.crt -serial -noout
#提取证书有效期
openssl x509 -in test.crt -dates -noout
#提取证书主题信息
openssl x509 -in test.crt -subject -noout
#提取证书的公钥
openssl x509 -in test.crt -pubkey -noout > publickey.pem
证书转换
证书常见个格式:
PEM(Privacy Enhanced Mail):PEM 格式是最常见的证书格式之一,使用 Base64 编码的 ASCII 文本表示,可以包含证书、私钥和 CA 证书等。通常以 .pem
或 .crt
扩展名结尾
DER(Distinguished Encoding Rules):DER 格式是二进制格式的证书表示形式,通常在网络通信中使用。通常以 .der
或 .cer
结尾。
PKCS#12:PKCS#12 是一种密码保护的证书格式,可以包含私钥、证书链和密码等信息。通常以 .p12
或 .pfx
结尾。
PKCS#7:PKCS#7 是用于数字签名、加密、证书请求等的标准格式,通常以 .p7b
或 .p7c
结尾。
上面通过openssl格式生成的证书都是PEM格式的,所以这里以PEM和其它转换格式转换来介绍
PEM和DER转换
shell
#pem转der
openssl x509 -inform PEM -in test1.crt -outform DER -out test1.der
#der转pem
openssl x509 -inform DER -in test1.der -outform PEM -out test1.pem
PEM和PKCS#12转换
pem转pkcs#12
shell
#pem转pkcs#12
openssl pkcs12 -export -out test.pfx -inkey rootCA.key -in test.crt -certfile rootCA.crt
-in:指定pem证书文件
-inkey:指定签名根证书私钥
-certfile:指定签名根证书,如果没有可以不设置,如我们上面的自签名就没有根证书信息
导出时候需要设置一个导出密码。
pkcs#12转pem
shell
openssl pkcs12 -in test.pfx -out frompfk.pem -nodes
这样生成的pem证书和私钥存储在一个文件里,需要手工去区分截取。
也可以添加参数控制只输出证书或私钥
shell
#只生成私钥
openssl pkcs12 -in test2.pfx -nocerts -out frompfk_priv.pem -nodes
#只生成证书内容
openssl pkcs12 -in test2.pfx -nokeys -clcerts -out frompfk_test.crt -nodes
-nodes设置不设置密码保护
pkcs#7与pem
shell
#pkcs#7 转pem
openssl crl2pkcs7 -nocrl -out test1.p7b -certfile test1.crt
#pem 转 pkcs#7
openssl pkcs7 -in test1.p7b -print_certs -out frompk7_test1.crt
pem&der转换
shell
openssl x509 -outform der -in test1.crt -out test1.der
openssl x509 -inform der -in test1.der -out test1_fromder.pem