OpenSSL的多种自签名、CA签名、RSA私钥生成、RSA加密、签名/验证、提取公钥的方法

OpenSSL的命令行数量很庞大,很吓唬人。

这是因为OpenSSL所涉及到的领域的确很多,比如各种对称/非对称算法,随机数,签名,加密,证书,结构分析,PKI体系的构建等,这些领域的背后有一大堆的RFC文档,OpenSSL把这些理论上的东西都落实为算法供我们学习和使用。

算法的实现可以有2种形式:API和“工具”。

前者是由程序员使用的函数库,而后者就是编译完成的本地代码,它有3种名字,指向同一个对象,分别是:命令、工具,应用程序。

例如生成自签名证书的命令行:

openssl req -x509 -newkey rsa:8192 -keyout rca.key -out rca.cer -days 365

其中的“req”是“命令”(也可称为“工具”和“应用程序”),-days是“选项”,365是“参数”。

俗话说“万变不离其宗”,虽然它的命令行庞大而复杂,但还是有规律可循的,比如-inform 指定输入文件格式,-outform指定输出文件格式,这两个选项重复出现在多个命令之中;还有选项虽然名字相同,但对不同的命令有不同的功能,比如 -in选项,如果配合req命令,就是输入证书请求文件,如果配合x509命令,就是输入证书。

鉴于OpenlSSL命令行的灵活性,同一个功能可以由不同的命令行完成,以下是我的一些总结。

当然,很可能还有未囊括进来的命令行,欢迎你写在评论区,我会在正文把你列为感谢作者。

让我们共同完成这个很有趣的“工程”--给Open SSL找相同!

当前版本号:OpenSSL for Windows 1.1.1c  28 May 2019


生成自签名证书的4种方法

方法 1:req命令(不需要请求文件)

::生成自签名证书和私钥
openssl req -x509 -newkey rsa:8192 -keyout rca.key -out rca.cer -days 365

方法2:x509命令(需要请求文件)

::生成请求文件和私钥
openssl req -new -out ca.csr -keyout ca.key
::生成自签名证书
openssl x509 -signkey ca.key -req -days 365 -in ca.csr -out cacert.pem

方法3:ca命令(需要请求文件)

::生成请求文件和私钥
openssl req -new -out ca.csr -keyout ca.key
::生成自签名证书
openssl ca -selfsign -in ca.csr -keyfile ca.key -out ca.cer -outdir . -days 3650 -create_serial -extensions v3_ca

方法4:ca命令重签名

读入之前的自签名证书ca1.cer,以新的DN名称重签名,以下代码是OpenSSL自建CA和CA链,给主机签发证书的批处理(使用CA命令)其中的”二级CA签发证书“的一部分,若要理解请看该文。

d:&cd\&rd/s/q ca1&md ca1&cd\ca1&md democa&md democa\newcerts&md democa\private
cd.>democa\index.txt&echo ca02>democa\serial

:: 生成自签名的CA1根证书,私钥和公钥:
openssl req -x509 -newkey rsa:8192 -keyout ca1.key -out ca1.cer -days 3650 -subj /C=CN/ST=jiangsu/L=nanjing/O=Tiger/OU=CA-1/CN=CA1/[email protected] -set_serial 0xca01 -passout pass:abcd
openssl rsa -in ca1.key -pubout -out ca1.pub -passin pass:abcd

:: 以新的DN名称重新签名CA1根证书,输出的新自签名证书是ca1-ok.cer
openssl ca -ss_cert ca1.cer -keyfile ca1.key -cert ca1.cer -out ca1-ok.cer -outdir . -create_serial -policy policy_anything -batch -passin pass:abcd -subj /C=CN/O=aa/ST=bb/CN=CA1


作为CA给(中间CA或者终端)签署证书的2种方法

有2种方法:X509命令和CA命令,详见我的另外2篇文章,这里不再赘述。

OpenSSL自建CA和CA链,给主机签发证书的批处理(使用x509命令)

OpenSSL自建CA和CA链,给主机签发证书的批处理(使用CA命令)


生成RSA私钥的3种方法

方法1:genrsa命令:

openssl genrsa -out ca.key 8192

方法2:genpkey命令:

openssl genpkey -out rsa_pri.key -outform PEM -pass pass:123456 -aes-128-cbc -algorithm RSA -pkeyopt rsa_keygen_bits:4096

方法3:req命令

openssl req -x509 -newkey rsa:8192 -keyout rca.key -out rca.cer -days 3650

RSA加密的2种方法

方法1:pkeyutl命令:

::公钥加密
openssl rsautl -encrypt -in a.txt -out 1.enc -inkey ca.pub -pubin
::私钥解密
openssl rsautl -decrypt -in 1.enc -out dec.txt -inkey ca.key

注:该命令的缺陷是只能对短小的文件进行加密和签名操作,如果太大会报以下错误:

无标题.png

方法2:rsautl命令:

注:经实验,对于当前版本的OpenSSL,该命令能处理的文件最大为1013字节

::公钥加密
openssl rsautl -encrypt -in a.txt -out 1.enc -inkey ca.pub -pubin
::私钥解密
openssl rsautl -decrypt -in 1.enc -out dec.txt -inkey ca.key


签名/验证签名的4种方法

方法1:dgst命令:

::对待签名的文件体积没有限制;原理是生成待签名文件的散列值,然后用公钥/私钥加密该散列值。
::用私钥key.pem给1.zip生成二进制的签名文件,算法是SHA-256,签名文件是1.sig,注意不能使用-hex选项:
openssl dgst -sha256 -sign key.pem -out 1.sig 1.zip
::用公钥对生成的签名文件1.sig与源文件1.zip进行比对验证,注意签名的算法和验证签名的算法要相同:
openssl dgst -sha256 -verify pub.pem -signature 1.sig 1.zip
::同上,只不过用私钥验证签名
openssl dgst -sha256 -prverify key.pem -signature 1.sig 1.zip

方法2:md5命令(语法与dgst一模一样):

::对待签名的文件体积没有限制;原理是生成待签名文件的散列值,然后用公钥/私钥加密该散列值。
::用私钥ca.key给文件text.txt签名,生成了名为sign的签名文件:
openssl md5 -sha256 -sign ca.key -out sign test.txt
::用公钥ca.pub对生成的签名文件1.sig与源文件1.zip进行比对验证,注意签名的算法和验证签名的算法要相同:
openssl md5 -sha256 -verify ca.pub -signature sign test.txt
::同上,只不过用私钥验证签名
openssl md5 -sha256 -prverify ca1.key -signature sign test.txt

方法3:rsautl命令:

::rsautl只能给小文件签名,经我的实验不能大于1013字节
::私钥签名(其实就是私钥加密文件)
openssl rsautl -sign -in abc.txt -out abc.sig -inkey ca.key
::公钥验证(其实就是用公钥将其解密),如果通过就恢复出原始数据,否则报错
openssl rsautl -verify -in abc.sig -out abc.vfy -inkey ca.pub -pubin方法1:pkeyutl令:

方法4:pkeyutl命令:

::pkeyutl只能给散列值签名。
::实验目标:给test.txt生成散列值,然后对散列值签名,最后验证这个散列值的签名。
::先用dgst命令生给文件test.txt成二进制的散列值,文件名是test.sig
openssl dgst -sha256 -binary -out test.sig test.txt
::用私钥给这个散列值签名(就是私钥加密散列值),生成签名文件md.sig:
openssl pkeyutl -sign -inkey ca.key -keyform PEM -in test.sig -out md.sig
::读入公钥、散列值签名md.sig、散列值test.sig以验证该签名是否正确。原理就是用公钥解密md.sig,结果与test.sig相同即验证通过
openssl pkeyutl -verify -inkey ca.pub -keyform PEM -pubin -in test.sig -sigfile md.sig


提取公钥的2种方法

方法1:rsa命令:

openssl rsa -in ca.key -pubout -out ca.pub

方法2:pkey命令:

openssl pkey -in ca.key -pubout -out ca.pub


猜你喜欢

转载自blog.51cto.com/9843231/2463204