openssl 安装及使用

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
相关推荐
Bulestar_xx4 小时前
安全见闻(3)
网络·windows·安全
IT蓝月9 小时前
人工智能-Python网络编程-TCP
网络·python·tcp/ip
fengxingzhe00810 小时前
OSPFv2协议状态切换(状态机)基本原理-RFC2328
运维·网络·网络协议·面试·ospfv2·ospfv2协议状态机·ospfv2报文交互实例
乐悲蔚蓝湖10 小时前
常见协议位于层数及ACL应用
网络
maimang0910 小时前
TCP 小队列的设计原理
网络
binqian10 小时前
【k8s】Calico网络
网络·kubernetes·php
密码突破手10 小时前
pyca/cryptography库的学习(7)——python
网络·python·算法·安全·密码学
明金同学10 小时前
Hutool 发送 HTTP 请求的几种常见写法
网络·网络协议·http
乐悲蔚蓝湖12 小时前
华三与华为ACL,及ACL+QOS的区别
服务器·网络·华为
weixin_5940645913 小时前
园区网综合拓扑实验
网络·智能路由器