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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章