新西兰服务器

OpenSSL生成自签名证书的方法有哪些


OpenSSL生成自签名证书的方法有哪些

发布时间:2020-06-16 14:11:13 来源:高防服务器网 阅读:382 作者:鸽子 栏目:安全技术

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

方法 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&cdca1&md democa&md democanewcerts&md democaprivate  cd.>democaindex.txt&echo ca01>democaserial  ::生成请求文件和私钥,私钥保护密码是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&cdca1&md democa&md democanewcerts&md democaprivate  cd.>democaindex.txt&echo ca01>democaserial    :: 生成自签名的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链,给主机签发证书的批处理(使用CA命令)

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

方法1:双击证书,点击“安装证书”,把根证书导入“受信任的根证书颁发机构”,把中间证书导入“中级证书颁发机构”,这就把证书链导入至windows证书库,过程一目了然,截图略。

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

[微信提示:高防服务器能助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。

[图文来源于网络,不代表本站立场,如有侵权,请联系高防服务器网删除]
[