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

网友投稿 939 2022-10-08


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命令,就是输入X.509格式的证书。

鉴于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命令(需要请求文件)

:: 创建ca命令所需的文件和目录结构 d:&cd\&md ca1&cd\ca1&md democa&md democa\newcerts&md democa\private cd.>democa\index.txt&echo ca01>democa\serial ::生成请求文件和私钥,私钥保护密码是1234: openssl req -new -out ca.csr -keyout ca.key -days 3650 -subj /C=CN/ST=jiangsu/L=nanjing/O=Tiger/OU=CA-1/CN=CA1/emailAddress=ca1@tiger.com -set_serial 0xca01 -passout pass:1234 ::生成自签名证书 openssl ca -selfsign -in ca.csr -keyfile ca.key -out ca.cer -outdir .  -passin pass:1234 -days 3650 -create_serial -extensions v3_ca

方法4:ca命令重签名

读入之前的自签名证书ca1.cer,以新的DN重签名:

:: 创建ca命令所需的文件和目录结构 d:&cd\&md ca1&cd\ca1&md democa&md democa\newcerts&md democa\private cd.>democa\index.txt&echo ca01>democa\serial :: 生成自签名的CA1根证书,私钥,私钥保护密码是1234: 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/emailAddress=ca1@tiger.com -set_serial 0xca01 -passout pass:1234 :: 以新的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:1234 -subj /C=CN/O=aa/ST=bb/CN=CA1

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

分别是X509命令和CA命令,详见我的另外2篇文章,这里不再赘述。

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

生成RSA私钥的3种方法

方法1:genrsa命令:

openssl genrsa -out ca.key 8192

方法2:genpkey命令:

::用密码123456保护私钥 openssl genpkey -out rsa_pri.key -outform PEM -pass pass:123456 -aes-128-cbc -algorithm RSA -pkeyopt rsa_keygen_bits:8192

方法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

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

方法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

注:若想要RSA加密(以及下文的签名)无体积限制,可以使用gpg4win。

签名/验证签名的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

提取公钥的4种方法

方法1:rsa命令:

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

方法2:pkey命令:

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

方法3:req命令:

提取请求文件之中的公钥:

openssl req -in host.csr -pubkey -out host.pub

方法4:x509命令:

提取证书中的主题(使用者)的公钥:

openssl x509 -in ca.cer -pubkey -noout -out ca.pub

创建证书链2方种法

方法2:通过copy命令创建证书链,重点是中间证书在前,依次往后排,最后是根证书:

copy ca3.cer+ca2.cer+ca1.cer ca3-chain.cer

验证证书链3方种法

方法1:对应创建证书链方法1,通过在Web客户端将根证书和中间证书导入Windows证书库,应用程序(例如谷个浏览器)可以通过CryptoAPI验证证书链。若要人工验证,双击证书即出现层次化的证书链结构:

方法2:对应创建证书链方法2,使用verify命令:

openssl verify -CAfile ca-chain.cer host1.cer

方法3:x509命令的-CApath选项

本方法在Windows下操作比较麻烦。先建立目录,例如yz,然后把根证书和所有中间CA证书都拷贝到该目录,但要改名为xxxxxxxx.0,其中的8个x是用openssl x509 -in xx.cer -subject_hash -noout输出的hash值,后面的.0必须存在。

例如,ca1是根证书,ca2.cer和ca3.cer是中间证书,host1是ca3给用户签署的SSL证书;就把ca1.cer、ca2.cer、ca3.cer都拷贝yz目录,然后依次改名,比如openssl x509 -in ca1.cer -subject_hash -noout输出的hash值是8607f596,就将ca1.cer改名为8607f596.0,改名全部完成之后执行命令:

openssl verify -CApath yz host1.cer


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java日常练习题,每天进步一点点(46)
下一篇:ACSS2020: 自动驾驶时代和ISO / SAE 21434法规下的安全车辆开发流程(acsac 2020)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~