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命令(需要请求文件)
::生成请求文件和私钥 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
注:该命令的缺陷是只能对短小的文件进行加密和签名操作,如果太大会报以下错误:
方法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