title: linux-openssl
date: 2020-09-16 11:02:15
categories:
- [學(xué)習(xí), shell]
tags: - shell
- linux
- openssl
介紹
{% note info %}
OpenSSL是一個(gè)健壯的疙教、商業(yè)級(jí)的藕夫、功能齊全的開源工具包,用于傳輸層安全(TLS)協(xié)議,以前稱為安全套接字層(Secure Sockets Layer, SSL)協(xié)議默垄。協(xié)議實(shí)現(xiàn)基于全強(qiáng)度通用密碼庫型檀,也可以單獨(dú)使用。
openssl是一個(gè)功能豐富且自包含的開源安全工具箱弃鸦。它提供的主要功能有:SSL協(xié)議實(shí)現(xiàn)(包括SSLv2绞吁、SSLv3和TLSv1)、大量軟算法(對(duì)稱/非對(duì)稱/摘要)唬格、大數(shù)運(yùn)算家破、非對(duì)稱算法密鑰生成、ASN.1編解碼庫购岗、證書請(qǐng)求(PKCS10)編解碼汰聋、數(shù)字證書編解碼、CRL編解碼喊积、OCSP協(xié)議烹困、數(shù)字證書驗(yàn)證、PKCS7標(biāo)準(zhǔn)實(shí)現(xiàn)和PKCS12個(gè)人數(shù)字證書格式實(shí)現(xiàn)等功能乾吻。
<span style="color:red;">項(xiàng)目地址</span> <span style="color:red;">官方網(wǎng)址</span> <span style="color:red;">手冊(cè)</span>
{% endnote %}
算法簡(jiǎn)介
{% tabs configtab, 1 %}
對(duì)稱算法使用一個(gè)密鑰髓梅。給定一個(gè)明文和一個(gè)密鑰,加密產(chǎn)生密文绎签,其長(zhǎng)度和明文大致相同枯饿。解密時(shí),使用讀密鑰與加密密鑰相同诡必。
ECB\CBC\CFB\OFB
摘要算法是一種能產(chǎn)生特殊輸出格式的算法奢方,這種算法的特點(diǎn)是:無論用戶輸入什么長(zhǎng)度的原始數(shù)據(jù),經(jīng)過計(jì)算后輸出的密文都是固定長(zhǎng)度的,這種算法的原理是根據(jù)一定的運(yùn)算規(guī)則對(duì)原數(shù)據(jù)進(jìn)行某種形式的提取袱巨,這種提取就是摘要阁谆,被摘要的數(shù)據(jù)內(nèi)容與原數(shù)據(jù)有密切聯(lián)系,只要原數(shù)據(jù)稍有改變愉老,輸出的“摘要”便完全不同场绿,因此,基于這種原理的算法便能對(duì)數(shù)據(jù)完整性提供較為健全的保障嫉入。但是焰盗,由于輸出的密文是提取原數(shù)據(jù)經(jīng)過處理的定長(zhǎng)值,所以它已經(jīng)不能還原為原數(shù)據(jù)咒林,即消息摘要算法是不可逆的熬拒,理論上無法通過反向運(yùn)算取得原數(shù)據(jù)內(nèi)容,因此它通常只能被用來做數(shù)據(jù)完整性驗(yàn)證垫竞。
如今常用的“消息摘要”算法經(jīng)歷了多年驗(yàn)證發(fā)展而保留下來的算法已經(jīng)不多澎粟,這其中包括MD2、MD4欢瞪、MD5活烙、SHA、SHA-1/256/383/512等遣鼓。
常用的摘要算法主要有MD5和SHA1啸盏。MD5的輸出結(jié)果為16字節(jié),sha1的輸出結(jié)果為20字節(jié)骑祟。
在公鑰密碼系統(tǒng)中回懦,加密和解密使用的是不同的密鑰,這兩個(gè)密鑰之間存在著相互依存關(guān)系:即用其中任一個(gè)密鑰加密的信息只能用另一個(gè)密鑰進(jìn)行解密次企。這使得通信雙方無需事先交換密鑰就可進(jìn)行保密通信怯晕。其中加密密鑰和算法是對(duì)外公開的,人人都可以通過這個(gè)密鑰加密文件然后發(fā)給收信者抒巢,這個(gè)加密密鑰又稱為公鑰贫贝;而收信者收到加密文件后,它可以使用他的解密密鑰解密秉犹,這個(gè)密鑰是由他自己私人掌管的蛉谜,并不需要分發(fā),因此又成稱為私鑰崇堵,這就解決了密鑰分發(fā)的問題型诚。
主要的公鑰算法有:RSA、DSA鸳劳、DH和ECC狰贯。
Openssl中大量用到了回調(diào)函數(shù)。回調(diào)函數(shù)一般定義在數(shù)據(jù)結(jié)構(gòu)中涵紊,是一個(gè)函數(shù)指針傍妒。通過回調(diào)函數(shù),客戶可以自行編寫函數(shù)摸柄,讓openssl函數(shù)來調(diào)用它颤练,即用戶調(diào)用openssl提供的函數(shù),openssl函數(shù)再回調(diào)用戶提供的函數(shù)驱负。這樣方便了用戶對(duì)openssl函數(shù)操作的控制嗦玖。在openssl實(shí)現(xiàn)函數(shù)中,它一般會(huì)實(shí)現(xiàn)一個(gè)默認(rèn)的函數(shù)來進(jìn)行處理跃脊,如果用戶不設(shè)置回調(diào)函數(shù)宇挫,則采用它默認(rèn)的函數(shù)。
{% endtabs %}
命令詳解
help
$ openssl help (所有命令幫助)
.....
$ openssl help dgst (列出命令dgst幫助)
.....
$ openssl help list (列出命令list幫助) 等同于 openssl list -help
.....
標(biāo)準(zhǔn)命令(Standard commands)
$ openssl list -commands (列出標(biāo)準(zhǔn)命令)
......
- asn1parse
asn1parse是一個(gè)有效的診斷工具酪术,可以解析ASN.1結(jié)構(gòu)器瘪。也可用來從ASN.1格式的數(shù)據(jù)中提取數(shù)據(jù)。 - ca
ca是一個(gè)極小的CA應(yīng)用程序绘雁。它可被用于簽名各種證書請(qǐng)求及生成CRLs娱局,它也包含了一個(gè)文本數(shù)據(jù)庫,其中記錄了已經(jīng)發(fā)布的證書以及這些證書的狀態(tài)咧七。 - ciphers
顯示支持的加密套件衰齐。 - cms
該命令處理S/MIME v3.1郵件〖套瑁可以用它對(duì)S/MIME消息進(jìn)行加密耻涛、解密、簽名瘟檩、驗(yàn)證簽名抹缕、壓縮以及解壓縮等操作。 - crl
crl命令用于處里PME或DER格式的CRL文件(證書吊銷列表 (Certificate Revocation List 墨辛,簡(jiǎn)稱: CRL) 是 PKI 系統(tǒng)中的一個(gè)結(jié)構(gòu)化數(shù)據(jù)文件) - crl2pkcs7
本命令根據(jù)CRL或證書來生成pkcs#7消息卓研。 - dgst
dgst用于數(shù)據(jù)摘要。
echo -n "123456" | openssl dgst -md5 # 輸出md5值
echo -n "123456" | openssl dgst -sha1 # 輸出sha1值
echo -n '123456' > a.txt
openssl dgst -md5 a.txt # 輸出文件md5值與上例相同
- dhparam
生成和管理Diffie-Hellman參數(shù)睹簇。被genpkey和pkeyparam取代 - dsa
DSA數(shù)據(jù)管理奏赘。處理DSA密鑰、格式轉(zhuǎn)換和打印信息太惠,用于數(shù)字簽名 - dsaparam
DSA參數(shù)生成與管理磨淌。用于生成和操作dsa證書參數(shù),用于數(shù)字簽名凿渊,被genpkey和pkeyparam取代 - ec
EC(橢圓曲線)密鑰處理梁只,用于數(shù)字簽名和加密 - ecparam
EC參數(shù)的操作和生成缚柳,產(chǎn)生ECC密鑰對(duì)。用于數(shù)字簽名和加密 - enc
加密和解密
對(duì)稱加密算法工具搪锣。它能夠運(yùn)用塊或者流算法對(duì)數(shù)據(jù)加/解密秋忙。還能夠把加密/接密,還可以把結(jié)果進(jìn)行base64編碼。
openssl enc -des3 -e -in a.txt -out b.txt
engine
引擎(loadble模塊)信息和操縱构舟。errstr
本命令用于查詢錯(cuò)誤代碼翰绊。
openssl errstr 02001002
- gendsa
gendsa根據(jù)DSA密鑰參數(shù)生成DSA密鑰,dsa密鑰參數(shù)可用dsaparam命令生成旁壮。 - genpkey
生成私鑰或參數(shù)监嗜。
鼓勵(lì)使用genpkey,因?yàn)榭梢允褂妙~外的算法選項(xiàng)和ENGINE提供的算法抡谐。
# 生成RSA私鑰
$openssl genpkey -out rsa_pri.key -outform PEM -pass pass:123456 -aes-128-cbc \
-algorithm RSA -pkeyopt rsa_keygen_bits:1024 -text
# 這種方式生成的RSA私鑰 不僅代用 私鑰和大數(shù)裁奇,還代用公鑰,以及其它信息麦撵,以用于快速計(jì)算刽肠。
- genrsa
生成RSA密鑰。 - help
幫助 - list
列出命令 - nseq
創(chuàng)建或檢查netscape證書序列免胃,多證書與netscape證書序列間相互轉(zhuǎn)化 - ocsp
在線證書狀態(tài)協(xié)議實(shí)用程序音五。 - passwd
生成散列密碼。生成各種口令密文 - pkcs12
PKCS12數(shù)據(jù)管理羔沙。工具躺涝,用于生成和分析pkcs12文件 - pkcs7
PKCS7加密消息語法,各種消息存放的格式標(biāo)準(zhǔn)扼雏;用于處理DER或者PEM格式的pkcs7文件 - pkcs8
私鑰轉(zhuǎn)換工具坚嗜,pkcs8格式 - pkey
pkey命令處理公鑰或私鑰。它們可以在各種形式之間進(jìn)行轉(zhuǎn)換诗充,并將其結(jié)構(gòu)打印出來苍蔬。
//由私鑰生成公鑰
$openssl pkey -in rsa_pri.key -inform PEM -passin pass:123456 -out rsa_pub.key -outform PEM -pubout -text
//私鑰改密碼
$openssl pkey -in rsa_pri.key -inform PEM -passin pass:123456 -out rsa_change.key -outform PEM -passout pass:456789 -des-cbc -text
//改變公鑰格式
$openssl pkey -in rsa_pub.key -inform PEM -out rsa_pub_der.key -outform DER -pubin -pubout -text
-
pkeyparam
- 該命令沒有-inform或-outform選項(xiàng),因?yàn)閮H支持PEM格式蝴蜓,因?yàn)槊荑€類型由PEM頭決定碟绑。
pkeyutl
公鑰算法加密操作實(shí)用程序。pkeyutl命令可用于執(zhí)行支持的公鑰操作.prime
檢查一個(gè)數(shù)是否是素?cái)?shù)rand
生成偽隨機(jī)字節(jié)茎匠。rehash
為文件創(chuàng)建一個(gè)符號(hào)連接格仲,并將此符號(hào)連接的名稱設(shè)為文件的hash值,作用是讓openssl在證書目錄中能夠找到證書req
PKCS10 X.509證書簽名請(qǐng)求(CSR)管理汽抚。
req命令主要?jiǎng)?chuàng)建證書請(qǐng)求(可以新生成私鑰)抓狭,查看證書請(qǐng)求伯病。它可以創(chuàng)建自簽名證書造烁,以作為root CA使用否过。但不能讀取證書rsa
RSA密鑰管理。處理RSA密鑰惭蟋、格式轉(zhuǎn)換和打印信息rsautl
RSA實(shí)用程序用于簽名苗桂,驗(yàn)證,加密和解密告组。取而代之的是pkeyutls_client
這將實(shí)現(xiàn)一個(gè)通用SSL / TLS客戶端煤伟,可以建立與遠(yuǎn)程服務(wù)器的SSL / TLS透明連接。s_server
這實(shí)現(xiàn)了一個(gè)通用SSL / TLS服務(wù)器木缝,它接受來自遠(yuǎn)程客戶端的SSL / TLS連接便锨。s_time
SSL連接定時(shí)器。提供的SSL/TLS性能測(cè)試工具我碟,測(cè)試服務(wù)sess_id
SSL會(huì)話數(shù)據(jù)管理放案。SSL/TLS協(xié)議的session處理工具smime
S / MIME郵件處理。處理S/MIME郵件矫俺,加密吱殉、解密、簽名和驗(yàn)證speed
算法速度測(cè)量厘托。友雳,調(diào)整測(cè)試庫的性能spkac
SPKAC打印和生成實(shí)用程序srp
secure remote password SRP協(xié)議storeutl
這個(gè)命令可用于顯示從給定uri中獲取的內(nèi)容(根據(jù)具體情況在解密之后)。ts
時(shí)間戳機(jī)構(gòu)工具(客戶端/服務(wù)器)verify
X.509證書驗(yàn)證铅匹。version
openssl versionx509
X.509證書管理押赊。顯示證書信息、轉(zhuǎn)換證書格式包斑、簽名證書請(qǐng)求及改變證書信任設(shè)置,X.509是ITU-T標(biāo)準(zhǔn)化部門基于他們之前的ASN.1定義的一套證書標(biāo)準(zhǔn)考杉。
摘要算法命令(Message Digest commands)
$ openssl list -digest-commands (列出摘要命令)
......
$ openssl list -digest-algorithms (列出摘要算法)
......
- 所有新應(yīng)用程序的選擇的摘要算法是SHA1。 然而其他摘要算法仍然被廣泛使用舰始。
- 在簽名時(shí)崇棠,dgst將根據(jù)私鑰的ASN.1信息自動(dòng)確定用于簽名的算法(RSA,ECC等)丸卷。當(dāng)驗(yàn)證簽名時(shí)枕稀,它只處理RSA,DSA或ECDSA簽名本身谜嫉,而不是分析相關(guān)數(shù)據(jù)來識(shí)別簽名者和相關(guān)算法萎坷,如x.509,CMS和S / MIME的簽名者和算法沐兰。
- 某些簽名算法哆档,特別是ECDSA和DSA需要一個(gè)隨機(jī)數(shù)源。
- 僅當(dāng)單個(gè)文件要簽名或驗(yàn)證時(shí)住闯,才能使用簽名和驗(yàn)證選項(xiàng)
- 十六進(jìn)制簽名無法使用openssl進(jìn)行驗(yàn)證瓜浸。使用“xxd -r”或類似程序在驗(yàn)證之前將十六進(jìn)制簽名轉(zhuǎn)換為二進(jìn)制簽名澳淑。
加解密命令(Cipher commands)
$ openssl list -cipher-commands (列出加解密命令)
......
$ openssl list -cipher-algorithms (列出加解密算法)
......
- 該程序可以通過openssl ciphername或者openssl enc -ciphername 兩種方式調(diào)用,但是前一種不支持引擎加密.
- 應(yīng)在配置文件中配置提供全新加密算法的引擎(如提供gost89算法的ccgost引擎)插佛。在命令行中使用-engine選項(xiàng)指定的引擎只能用于由配置文件中指定的OpenSSL內(nèi)核或其他引擎支持的密碼的硬件輔助實(shí)現(xiàn)
- 當(dāng)enc命令列出支持的加密算法時(shí)杠巡,也列出了配置文件中指定的引擎提供的算法。
- 如果需要雇寇,將提示輸入密鑰以獲得密鑰氢拥。
- 如果從密碼派生密鑰,則應(yīng)使用-salt選項(xiàng)锨侯,除非您希望與以前版本的OpenSSL和SSLeay兼容嫩海。沒有-salt選項(xiàng),可以對(duì)密碼執(zhí)行有效的字典攻擊囚痴,并攻擊流密碼加密數(shù)據(jù)出革。原因是沒有slat,相同的密碼總是生成相同的加密密鑰渡讼。當(dāng)slat被使用時(shí)骂束,加密數(shù)據(jù)的前八個(gè)字節(jié)被保留給鹽:它在加密文件時(shí)被隨機(jī)生成,并且在被解密時(shí)從加密文件讀取成箫。
- 一些密碼沒有大的密鑰,如果不正確使用蹬昌,會(huì)帶來安全隱患。建議初學(xué)者在CBC模式下使用強(qiáng)分組密碼皂贩,如bf或des3。
- 所有塊密碼通常使用PKCS#5填充也稱為標(biāo)準(zhǔn)塊填充:這允許執(zhí)行基本的完整性或密碼檢查明刷。然而,由于隨機(jī)數(shù)據(jù)通過測(cè)試的機(jī)會(huì)優(yōu)于256中的1辈末,這不是一個(gè)非常好的測(cè)試愚争。
- 如果禁止填充,則輸入數(shù)據(jù)必須是密碼塊長(zhǎng)度的倍數(shù)挤聘。
- 所有RC2密碼具有相同的密鑰和有效的密鑰長(zhǎng)度轰枝。
- Blowfish和RC5算法使用128位密鑰。
常用命令總結(jié)
# 生成100位隨機(jī)數(shù)组去,使用base64編碼輸出
openssl rand -base64 100
# 輸出到文件myr.dat
openssl rand –base64 –out myr.dat 100
# 16進(jìn)制方式輸出
openssl rand -hex 10
# 生成md5摘要
echo -n 123456 | openssl dgst -md5 | awk '{printf("%s",md5)}'
# 生成sha1摘要
echo -n 123456 | openssl dgst -sha1 | awk '{printf("%s",sha1)}'
# 對(duì)稱加密
# 生成16進(jìn)制加密字符串
echo -n "我們是害蟲鞍陨,正義的來福靈快來把我殺死!"|openssl enc -e -aes-128-ecb -K 226a89e66d0dcc79c9673150fa176001 | od -tx1 | awk '{for(i=2;i<=NF;i++){printf("%s",);}}'
# 解密16進(jìn)制加密字符串
echo -n "6556492b1fbfd723fb2af8dc32fa0b2105007adde27f96d257abc45b9a1ddaee9fa8999029e756cfd1cabf24c941ab7ce6925f1ff7a7123db9921f9d596625a7"| sed 's/\(..\)/\\\\x\1/g' | xargs echo -e -n | openssl enc -d -aes-128-ecb -K 226a89e66d0dcc79c9673150fa176001
# 生成base64編碼加密字符串
echo -n "我們是害蟲从隆,正義的來福靈快來把我殺死诚撵!"|openssl enc -e -aes-128-ecb -K 226a89e66d0dcc79c9673150fa176001 -a -A
# 解密base64字符串
echo -n "ZVZJKx+/1yP7KvjcMvoLIQUAet3if5bSV6vEW5od2u6fqJmQKedWz9HKvyTJQat85pJfH/enEj25kh+dWWYlpw=="|openssl enc -d -aes-128-ecb -K 226a89e66d0dcc79c9673150fa176001 -a -A
# 以上aes-128-ecb為加解密算法缭裆,-K參數(shù)表示加密秘鑰,加密和解密方需妥善保存
# 非對(duì)稱砾脑,使用公鑰加密幼驶,私鑰解密
# 生成私鑰
openssl genpkey -out cxl_rsa_pri.key -outform PEM -pass pass:whyme -aes-128-cbc -algorithm RSA -pkeyopt rsa_keygen_bits:1024 -text
# 用私鑰生成公鑰
openssl pkey -in cxl_rsa_pri.key -inform PEM -passin pass:whyme -out cxl_rsa_pub.key -outform PEM -pubout -text
# 用公鑰加密艾杏,輸出base64編碼
echo -n '123456' | openssl pkeyutl -encrypt -inkey cxl_rsa_pub.key -keyform PEM -pubin | base64 -w0
# 用私鑰解密
echo -n 'QmjiDoh/j+dtdxuZ0BUlrRTHbZFCzb43ZnM+cbpT93JnRQa64MrTLrAj50O1EM/voM9KPgvQfuiIhQbwKdeDXV66ZmlbsXfhc0PW2xMDCqJaR77E2N8yyAFWx4Z698zCqWx86svgscpQp62dwX/9P0+e1za2lbFCe8h0wv2ZQcE=' | base64 -d | openssl pkeyutl -decrypt -inkey cxl_rsa_pri.key -passin pass:whyme
# 由用戶側(cè)傳過來的數(shù)據(jù)都是加密后的數(shù)據(jù)韧衣,沒有私鑰無法查看原始數(shù)據(jù)
# 使用私鑰簽名
echo -n '123456' | openssl pkeyutl -sign -inkey cxl_rsa_pri.key -keyform PEM -passin pass:whyme | base64 -w0
# 使用公鑰驗(yàn)證簽名
echo -n '123456' > data.txt
echo -n 'DPBPRL/DTmR8llgjF16U1NDtZTgLLYBaqq2IP/wwWilEbJDpKCVb7mx82EwtSi6GAisx4TzL9U/O6bpyJeVFrCMhLkKo3Lhs2hzQMBKi42CcsTHcEiCH6o6eOI+1ZpfdDXDFz7/IdQJdek0oXx6cZPuWlWqiq2bEmZK2T9zbFBE=' | base64 -d > sig
openssl pkeyutl -verify -inkey cxl_rsa_pub.key -keyform PEM -pubin -in data.txt -sigfile sig
# 服務(wù)器發(fā)給客戶端的數(shù)據(jù)由客戶端驗(yàn)證簽名,保證數(shù)據(jù)沒有篡改過
# 證書
openssl version -a
#查看版本和配置文件位置,生成證書可以使用配置文件中的相關(guān)配置,本例中不使用這種方式购桑,各位可以研究一下
-nodes :如果指定-newkey自動(dòng)生成秘鑰畅铭,那么-nodes選項(xiàng)說明生成的秘鑰不需要加密,即不需要輸入passphase.
-batch :指定非交互模式勃蜘,直接讀取config文件配置參數(shù)硕噩,或者使用默認(rèn)參數(shù)值
# 生成證書,可以在生成證書的時(shí)候生成私鑰缭贡,也可以指定私鑰文件生成證書炉擅,如果都不指定,會(huì)自動(dòng)生成私鑰文件
# 生成自簽名證書阳惹,證書名cxl-req.crt谍失,不指定私鑰,私鑰名為配置文件中名稱或缺省privkey.pem
openssl req -x509 -newkey rsa:1024 -out cxl-req.crt
# 指定私鑰密碼
openssl req -x509 -newkey rsa:1024 -out cxl-req.crt -passout pass:123456
# 指定證書參數(shù)
openssl req -x509 -newkey rsa:1024 -out cxl-req.crt -passout pass:123456 -subj /C=CN/ST=北京市/L=城市名/OU=組織名/O=公司名/CN=whatthis/emailAddress=test@company.com
# 查看證書內(nèi)容
openssl x509 -in cxl-req.crt -noout -text
openssl x509 -in cxl-req.crt -noout -subject
openssl x509 -in cxl-req.crt -noout -pubkey
# 指定私鑰名稱 cxl-req-pri.pem
openssl req -x509 -newkey rsa:1024 -out cxl-req.crt -keyout cxl-req-pri.pem -outform PEM -passout pass:123456 -subj /C=CN/ST=provincename/L=cityname/OU=organizationname/O=companyname/CN=whatthis/emailAddress=test@company.com
# 使用密鑰生成證書
openssl req -new -x509 -key cxl-req-pri.pem -outform PEM -passin pass:123456 -out cxl-req111.crt -subj /C=CN/ST=provincename/L=cityname/OU=organizationname/O=companyname/CN=whatthis/emailAddress=test@company.com
# 查看證書
openssl x509 -in cxl-req111.crt -noout -text