一、 openssl簡介-指令enc node
用法: openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a] [-k password] [-kfile filename] [-K key] [-iv IV] [-p] [-P] [-bufsize number] [-debug] 程序員
說明:對稱加密算法工具。它可以把數據用不一樣對稱加密算法來加/解密。還可以把加密/解密,還能夠把結果進行base64編碼。 [/b:5c505c4c1d] 算法
參數含義:app
-in filename : 要加密/解密的輸入文件,缺省爲標準輸入。
-out filename :要加密/解密的輸出文件,缺省爲標準輸出。
-pass arg : 輸入文件若是有密碼保護,在這裏輸入密碼。
-salt : 爲了和openssl 0.9.5之後的版本兼容,必須set這個參數,salt又是密碼學裏的一個術語。這是加密事後放在密碼最前面的一段字符串, 用途也是爲了讓破解更難dom
-nosalt : 想和openssl 0.9.5之前的版本兼容,就set這個參數
-e : 一個缺省會set的option, 把輸入數據加密。
-d : 解密輸入數據。
-a : 用base64編碼處理數據。set了這個option表示在加密以後的數據還要用base64編碼捏一次,解密以前則先用base64編碼解碼。
-k password : 一個過期了的項,爲了和之前版本兼容。如今用-key代替了。
-kfile filename : 同上,被passin代替。
-K key : 以16進製表示的密碼。
-iv IV : 做用徹底同上。
-p : 打印出使用的密碼。
-P : 做用同上,但打印完以後立刻退出。
-bufsize number : 設置I/O操做的緩衝區大小
-debug : 打印調試信息。
注意事項:
0.9.5之後的版本,使用這個指令,-salt是必須被set的。不然很容易用字典攻擊法破你的密碼,流加密算法也容易被破。(加密算法中有塊加密算法和流加密算法倆種,塊加密算法是一次加密固定長度的數據,通常是8Bytes, 流加密算法則加密大量數據)。爲何我也弄不清楚。研究加密算法實在麻煩,也不是咱們程序員的責任本指令能夠用不一樣加密算法,那麼哪些好,哪些壞呢?若是你使用不當,高強度的加密算法也變脆弱了。通常推薦新手門使用des3-cbc。 ide
本指令支持的加密算法
base64 Base 64
bf-cbc Blowfish in CBC mode
bf Alias for bf-cbc
bf-cfb Blowfish in CFB mode
bf-ecb Blowfish in ECB mode
bf-ofb Blowfish in OFB mode
cast-cbc CAST in CBC mode
cast Alias for cast-cbc
cast5-cbc CAST5 in CBC mode
cast5-cfb CAST5 in CFB mode
cast5-ecb CAST5 in ECB mode
cast5-ofb CAST5 in OFB mode 工具
des-cbc DES in CBC mode
des Alias for des-cbc
des-cfb DES in CBC mode
des-ofb DES in OFB mode
des-ecb DES in ECB mode
des-ede-cbc Two key triple DES EDE in CBC mode
des-ede Alias for des-ede
des-ede-cfb Two key triple DES EDE in CFB mode
des-ede-ofb Two key triple DES EDE in OFB mode
des-ede3-cbc Three key triple DES EDE in CBC mode
des-ede3 Alias for des-ede3-cbc
des3 Alias for des-ede3-cbc
des-ede3-cfb Three key triple DES EDE CFB mode
des-ede3-ofb Three key triple DES EDE in OFB mode
desx DESX algorithm.
idea-cbc IDEA algorithm in CBC mode
idea same as idea-cbc
idea-cfb IDEA in CFB mode
idea-ecb IDEA in ECB mode
idea-ofb IDEA in OFB mode
rc2-cbc 128 bit RC2 in CBC mode
rc2 Alias for rc2-cbc
rc2-cfb 128 bit RC2 in CBC mode
rc2-ecb 128 bit RC2 in CBC mode
rc2-ofb 128 bit RC2 in CBC mode
rc2-64-cbc 64 bit RC2 in CBC mode
rc2-40-cbc 40 bit RC2 in CBC mode
rc4 128 bit RC4
rc4-64 64 bit RC4
rc4-40 40 bit RC4
rc5-cbc RC5 cipher in CBC mode
rc5 Alias for rc5-cbc
rc5-cfb RC5 cipher in CBC mode
rc5-ecb RC5 cipher in CBC mode
rc5-ofb RC5 cipher in CBC mode
你們可能看到DES都分des-ecb, des-cbc, des-cfb這些。簡單解釋一下。
ecb就是說每來8bytes,就加密8bytes送出去。各個不一樣的數據塊之間沒有任何聯繫。cbc和cfb則每次加密一個8bytes的時候都和上一個8bytes加密的結果有一個運算法則。各個數據塊之間是有聯繫的。
舉例時間:
把某二進制文件轉換成base64編碼方式:
openssl base64 -in file.bin -out file.b64
把某base64編碼文件轉換成二進制文件。
openssl base64 -d -in file.b64 -out file.bin
把某文件用DES-CBC方式加密。加密過程當中會提示你輸入保護密碼。
openssl des3 -salt -in file.txt -out file.des3
解密該文件, 密碼經過-k來輸入
openssl des3 -d -salt -in file.des3 -out file.txt -k mypassword
加密某文件,而且把加密結果進行base64編碼。用bf+cbc算法加密
openssl bf -a -salt -in file.txt -out file.bf
先用base64解碼某文件,再解密
openssl bf -d -salt -a -in file.bf -out file.txt測試
二、 openssl簡介-指令gendsa ui
用法:this
openssl gendsa [-out filename] [-des] [-des3] [-idea] [-rand file(s)] [paramfile]
描述:
本指令由DSA參數來產生DSA的一對密鑰。dsa參數能夠用dsaparam來產生。[/b:3ff9640d43]
OPTIONS
-des|-des3|-idea :採用什麼加密算法來加密咱們的密鑰。通常會要你輸入保護密碼。若是這三個中一個也沒set, 咱們的密鑰將不被加密而輸入。
-rand file(s) : 產生key的時候用過seed的文件,能夠把多個文件用冒號分開一塊兒作seed.
paramfile : 指定使用的DSA參數文件。
三、 openssl簡介-指令genrsa
用法:
openssl genrsa [-out filename] [-passout arg] [-des] [-des3] [-idea] [-f4] [-3] [-rand file(s)] [numbits]
描述:生成RSA私有密鑰的工具。[/b:e2fe605c7d]
OPTIONS
-out filename : 私有密鑰輸入文件名,缺省爲標準輸出。
the output filename. If this argument is not specified then standard output is uused.
-passout arg : 參看指令dsa裏面的passout參數說明
-des|-des3|-idea : 採用什麼加密算法來加密咱們的密鑰。通常會要你輸入保護密碼。 若是這三個中一個也沒set, 咱們的密鑰將不被加密而輸入。
-F4|-3 :使用的公共組件,一種是3, 一種是F4, 我也沒弄懂這個option是什麼意思。
-rand file(s) : 產生key的時候用過seed的文件,能夠把多個文件用冒號分開一塊兒作seed.
numbits :指明產生的參數的長度。必須是本指令的最後一個參數。若是沒有指明,則產生512bit長的參數。
研究過RSA算法的人確定知道,RSA的私有密鑰其實就是三個數字,其中倆個是質數。這倆個呢,就叫prime numbers.產生RSA私有密鑰的關鍵就是產生這倆。還有一些其餘的參數,引導着整個私有密鑰產生的過程。由於產生私有密鑰過程須要不少隨機數,這個過程的時間是不固定的。
產生prime numbers的算法有個bug, 它不能產生短的primes. key的bits起碼要有64位。通常咱們都用1024bit的key.
四、 openssl簡介-指令passwd
用法: openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-quiet] [-table] {password}
說明: 本指令計算用來哈希某個密碼,也能夠用來哈希文件內容。[/b:da40679049]
本指令支持三種哈希算法:
UNIX系統的標準哈希算法(crypt)
MD5-based BSD(1)
OPTIONS
-crypt -1 -apr1 : 這三個option中任意選擇一個做爲哈希算法,缺省的是-crypt
-salt string : 輸入做爲salt的字符串。
-in file : 要哈希的文件名稱
-stdin : 從標準輸入讀入密碼
-quiet : 當從標準輸入讀密碼,輸入的密碼太長的時候,程序將自動解短它。這個option的 set將不在狀況下發出警告。
-table : 在輸出列的時候,先輸出明文的密碼,而後輸出一個TAB,再輸出哈希值.
舉例時間:
openssl passwd -crypt -salt xx password xxj31ZMTZzkVA.
openssl passwd -1 -salt xxxxxxxx password $1$xxxxxxxx$8XJIcl6ZXqBMCK0qFevqT1.
openssl passwd -apr1 -salt xxxxxxxx password $apr1$xxxxxxxx$dxHfLAsjHkDRmG83UXe8K0
五、 openssl簡介-指令pkcs7
用法:
openssl pkcs7 [-inform PEM|DER] [-outform PEM|DER] [-in filename] [-out filename] [-print_certs] [-text] [-noout]
說明: 處理PKCS#7文件的工具, [/b:6d30603c82]
-inform DER|PEM :指定輸入的格式是DEM仍是DER. DER格式採用ASN1的DER標準格式。通常用的多的都是PEM格式,就是base64編碼格式.你去看看你作出來的那些.key, .crt文件通常都是PEM格式的,第一行和最後一行指明內容,中間就是通過編碼的東西。
-outform DER|PEM : 和上一個差很少,不一樣的是指定輸出格式
-in filename : 要分析的文件名稱, 缺省是標準輸入.
-out filename : 要輸出的文件名, 缺省是標準輸出.write to or standard output by default.
-print_certs : 打印出該文件內的任何證書或者CRL.
-text : 打印出證書的細節.
-noout : 不要打印出PKCS#7結構的編碼版本信息.
舉例時間:
把一個PKCS#7文件從PEM格式轉換成DER格式
openssl pkcs7 -in file.pem -outform DER -out file.der
打印出文件內全部的證書
openssl pkcs7 -in file.pem -print_certs -out certs.pem
PCKS#7 文件的開始和結束倆行是這樣子的:
-----BEGIN PKCS7-----
-----END PKCS7-----
爲了和某些猥瑣CA兼容,這樣子的格式也能夠接受
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
好象咱們尚未解釋pkcs#7是什麼東西. 有興趣的能夠看看rfc2315, 估計看完目錄尚未陣亡的同窗不會超過1/10.
六、 openssl簡介-指令rand
用法: openssl rand [-out file] [-rand file(s)] [-base64] num
描述: 用來產生僞隨機字節. 隨機數字產生器須要一個seed, 先已經說過了,在沒有/dev/srandom系統下的解決方法是本身作一個~/.rnd文件.若是該程序能讓隨機數字產生器很滿意的被seeded,程序寫回一些怪怪的東西回該文件. [/b:55d4e97ab2]
-out file : 輸出文件.
-rand file(s) : 產生隨機數字的時候用過seed的文件,能夠把多個文件用冒號分開一塊兒作seed.
-base64 : 對產生的東西進行base64編碼
num : 指明產生多少字節隨機數.
七、 openssl簡介-指令req
用法: openssl req [-inform PEM|DER] [-outform PEM|DER] [-in filename] [-passin arg] [-out filename] [-passout arg] [-text] [-noout][-verify] [-modulus] [-new] [-rand file(s)] [-newkey rsa:bits] [-newkey dsa:file] [-nodes] [-key filename] [-keyform PEM|DER][-keyout filename] [-[md5|sha1|md2|mdc2]] [-config filename] [-x509] [-days n] [-asn1-kludge] [-newhdr] [-extensions section] [-reqexts section]
描述: 本指令用來建立和處理PKCS#10格式的證書.它還可以創建自簽名證書,作Root CA. [/b:866f672f5a]
-inform DER|PEM : 指定輸入的格式是DEM仍是DER. DER格式採用ASN1的DER標準格式。通常用的多的都是PEM格式,就是base64編碼格式.你去看看你作出來的那些.key, .crt文件通常都是PEM格式的,第一行和最後一行指明內容,中間就是通過編碼的東西。
-outform DER|PEM : 和上一個差很少,不一樣的是指定輸出格式
-in filename : 要處理的CSR的文件名稱,只有-new和-newkey倆個option沒有被set,本option纔有效
-passin arg : 去看看CA那一章關於這個option的解釋吧。
-out filename : 要輸出的文件名
-passout arg : 參看dsa指令裏的passout這個option的解釋吧.
-text : 將CSR文件裏的內容以可讀方式打印出來
-noout : 不要打印CSR文件的編碼版本信息.
-modulus : 將CSR裏面的包含的公共米要的係數打印出來.
-verify : 檢驗請求文件裏的簽名信息.
-new : 本option產生一個新的CSR, 它會要用戶輸入建立CSR的一些必須的信息.至於須要哪些信息,是在config文件裏面定義好了的.若是-key沒有被set, 那麼就將根據config文件裏的信息先產生一對新的RSA密鑰
-rand file(s) : 產生key的時候用過seed的文件,能夠把多個文件用冒號分開一塊兒作seed.
-newkey arg : 同時生成新的私有密鑰文件和CSR文件. 本option是帶參數的.若是是產生RSA的私有密鑰文件,參數是一個數字, 指明私有密鑰bit的長度. 若是是產生DSA的私有密鑰文件,參數是DSA密鑰參數文件的文件名.
-key filename : 參數filename指明咱們的私有密鑰文件名.容許該文件的格式是PKCS#8.
-keyform DER|PEM : 指定輸入的私有密鑰文件的格式是DEM仍是DER. DER格式採用ASN1的DER標準格式。通常用的多的都是PEM格式,就是base64編碼格式.你去看看你作出來的那些.key, .crt文件通常都是PEM格式的,第一行和最後一行指明內容,中間就是通過編碼的東西。
-outform DER|PEM : 和上一個差很少,不一樣的是指定輸出格式
-keyform PEM|DER : 私有密鑰文件的格式, 缺省是PEM
-keyout filename : 指明建立的新的私有密鑰文件的文件名. 若是該option沒有被set, 將使用config文件裏面指定的文件名.
-nodes : 本option被set的話,生成的私有密鑰文件將不會被加密.
-[md5|sha1|md2|mdc2] : 指明簽發的證書使用什麼哈希算法.若是沒有被set, 將使用config文件裏的相應item的設置. 但DSA的CSR將忽略這個option, 而採用SHA1哈希算法.
-config filename : 使用的config文件的名稱. 本option若是沒有set, 將使用缺省的config文件.
-x509 : 本option將產生自簽名的證書. 通常用來錯測試用,或者本身玩下作個Root CA.證書的擴展項在 config文件裏面指定.
-days n : 若是-509被set, 那麼這個option的參數指定咱們本身的CA給人家簽證書的有效期.缺省是30天.
-extensions section -reqexts section : 這倆個option指定config文件裏面的與證書擴展和證書請求擴展有關的倆個section的名字(若是-x509這個option被set).這樣你能夠在config文件里弄幾個不一樣的與證書擴展有關的section, 而後爲了避免同的目的給CSR簽名的時候指明不一樣的section來控制簽名的行爲.
-asn1-kludge : 缺省的req指令輸出徹底符合PKCS10格式的CSR, 但有的CA僅僅接受一種非正常格式的CSR, 這個option的set就能夠輸出那種格式的CSR. 要解釋這倆種格式有點麻煩, 須要用到ASN1和PKCS的知識,並且如今這樣子怪的CA幾乎沒有,因此省略解釋
-newhdr : 在CSR問的第一行和最後一行中加一個單詞"NEW", 有的軟件(netscape certificate server)和有的CA就有這樣子的怪癖嗜好.若是那些必需要的option的參數沒有在命令行給出,那麼就會到config文件裏去查看是否有缺省值, 而後時候。config文件中相關的一些KEY的解釋與本指令有關的KEY都在[req]這個section裏面.
input_password output_password :私有密鑰文件的密碼和把密碼輸出的文件名.同指令的passin, passout的意義相同.
default_bits : 指定產生的私有密鑰長度, 若是爲空,那麼就用512.只有-new被set, 這個設置才起做用,意義同-newkey相同.
default_keyfile : 指定輸出私有密鑰文件名,若是爲空, 將輸出到標準輸入,意義同-keyout相同.
oid_file : oid_section 與oid文件有關的項, oid不清楚是什麼東西來的.
RANDFILE
產生隨機數字的時候用過seed的文件,能夠把多個文件用冒號分開一塊兒作seed.
encrypt_key
若是本KEY設置爲no, 那麼若是生成一個私有密鑰文件,將不被加密.同命令行的-nodes的意義相同.
default_md
指定簽名的時候使用的哈希算法,缺省爲MD5. 命令行裏有一樣的功能輸入.
string_mask
屏蔽掉某些類型的字符格式. 不要亂改這個KEY的值!!有的字符格式netscape不支持,因此亂改這個KEY很危險.
req_extensions
指明證書請求擴展section, 而後由那個secion指明擴展的特性. openssl的缺省config文件裏, 擴展的是X509v3, 不擴展的是x509v1.這個KEY的意義和命令行裏-reqexts相同.
x509_extensions
同命令行的-extension的意義相同.指明證書擴展的sesion, 由那個section指明證書擴展的特性.
prompt
若是這個KEY設置爲no, 那麼在生成證書的時候須要的那些信息將從config文件裏讀入,而不是從標準輸入由用戶去輸入, 同時改變下倆個KEY所指明的section的格式.
attributes
一個過期了的東西, 不知道也罷. 不過它的意義和下一個KEY有點相似,
格式則徹底相同.
distinguished_name
指定一個section, 由那個section指定在生成證書或者CRS的時候須要的資料.該section的格式以下:
其格式有倆種, 若是KEY prompt被set成no(看看prompt的解釋), 那麼這個secion的格式看起來就是這樣子的:
CN=My Name
OU=My Organization
emailAddress=someone@somewhere.org
就說只包括了字段和值。這樣子能夠可讓其餘外部程序生成一個摸板文件,包含全部字段和值, 把這些值提出來.等下舉例時間會有詳細說明.若是prompt沒有被set成no, 那麼這個section的格式則以下:
fieldName="please input ur name"
fieldName_default="fordesign"
fieldName_min= 3
fieldName_max= 18
"fieldname"就是字段名, 好比commonName(或者CN). fieldName(本例中是"prompt")是用來提示用戶輸入相關的資料的.若是用戶什麼都不輸, 那麼就使用確省值.若是沒有缺省值, 那麼該字段被忽略.用戶若是輸入 ’.’ ,也可讓該字段被忽略.
用戶輸入的字節數必須在fieldName_min和fieldName_max之間. 不一樣的section還可能對輸入的字符有特殊規定,好比必須是可打印字符.那麼在本例裏面, 程序的表現將以下:
首先把fieldName打印出來給用戶以提示
please input ur name:
以後若是用戶必須輸入3到18之間的一個長度的字符串, 若是用戶什麼也不輸入,那麼就把fieldName_default裏面的值"fordesign"做爲該字段的值添入.
有的字段能夠被重複使用.這就產生了一個問題, config文件是不容許一樣的section文件裏面有多於一個的相同的key的.其實這很容易解決,好比把它們的名字分別叫作"1.organizationName", "2.organizationName"
openssl在編譯的時候封裝了最必須的幾個字段, 好比commonName, countryName, localityName, organizationName,organizationUnitName, stateOrPrivinceName還增長了emailAddress surname, givenName initials 和 dnQualifier.
舉例時間:
就使用確省值.若是沒有缺省值, 那麼該字段被忽略.用戶若是輸入 ’.’ ,也可讓該字段被忽略.用戶輸入的字節數必須在fieldName_min和fieldName_max之間. 不一樣的section還可能對輸入的字符有特殊規定,好比必須是可打印字符.那麼在本例裏面, 程序的表現將以下:
首先把fieldName打印出來給用戶以提示
please input ur name:
以後若是用戶必須輸入3到18之間的一個長度的字符串, 若是用戶什麼也不輸入,那麼就把fieldName_default裏面的值"fordesign"做爲該字段的值添入.
有的字段能夠被重複使用.這就產生了一個問題, config文件是不容許一樣的section文件裏面有多於一個的相同的key的.其實這很容易解決,好比把它們的名字分別叫作"1.organizationName", "2.organizationName" openssl在編譯的時候封裝了最必須的幾個字段,好比commonName,countryName,localityName, organizationName,organizationUnitName, stateOrPrivinceName還增長了emailAddress surname, givenName initials 和 dnQualifier.
舉例時間:
Examine and verify certificate request:
檢查和驗證CSR文件.
openssl req -in req.pem -text -verify -noout
作本身的私有密鑰文件, 而後用這個文件生成CSR文件.
openssl genrsa -out key.pem 1024
openssl req -new -key key.pem -out req.pem
也能夠一步就搞定:
openssl req -newkey rsa:1024 -keyout key.pem -out req.pem
作一個自簽名的給Root CA用的證書:
openssl req -x509 -newkey rsa:1024 -keyout key.pem -out crt.pem
下面是與本指令有關的config文件中相關的部分的一個例子:
[ req ]
default_bits = 1024
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
attributes = req_attributes
x509_extensions = v3_ca
dirstring_type = nobmp
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = AU
countryName_min = 2
countryName_max = 2
localityName = Locality Name (eg, city)
organizationalUnitName = Organizational Unit Name (eg, section)
commonName = Common Name (eg, YOUR name)
commonName_max = 64
emailAddress = Email Address
emailAddress_max = 40
[ req_attributes ]
challengePassword = A challenge password
challengePassword_min = 4
challengePassword_max = 20
[ v3_ca ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer:always
basicConstraints = CA:true
RANDFILE = $ENV::HOME/.rnd
[ req ]
default_bits = 1024
default_keyfile = keyfile.pem
distinguished_name = req_distinguished_name
attributes = req_attributes
prompt = no
output_password = mypass
[ req_distinguished_name ]
C = GB
ST = Test State or Province
L = Test Locality
O = Organization Name
OU = Organizational Unit Name
CN = Common Name
emailAddress = test@email.address
[ req_attributes ]
challengePassword = A challenge password
通常的PEM格式的CSR文件的開頭和結尾一行以下
-----BEGIN CERTIFICATE REQUEST----
-----END CERTIFICATE REQUEST----
但個把變態軟件和CA硬是須要CSR的文件要這樣子:
-----BEGIN NEW CERTIFICATE REQUEST----
-----END NEW CERTIFICATE REQUEST----
用-newhdr就能夠啦, 或者你本身手工加也中.openssl對倆種格式都認可.
openssl的config文件也能夠用環境變量OPENSSL_CONF或者SSLEAY_CONF來指定.
八、 openssl簡介-指令rsa
用法
openssl rsa [-inform PEM|NET|DER] [-outform PEM|NET|DER] [-in filename] [-passin arg] [-out filename] [-passout arg] [-sgckey] [-des] [-des3] [-idea] [-text] [-noout] [-modulus] [-check] [-pubin] [-pubout]
說明: rsa指令專門處理RSA密鑰.其實其用法和dsa的差很少. [/b:ac3cf3a933]
-inform DER|PEM|NET : 指定輸入的格式是DEM仍是DER仍是NET.注意, 這裏多了一種格式,就是NET,DER格式採用ASN1的DER標準格式。通常用的多的都是PEM格式,就是base64編碼格式.你去看看你作出來的那些.key, .crt文件通常都是PEM格式的,第一行和最後一行指明內容,中間就是通過編碼的東西。NET格式在本章後面會詳細解釋.
-outform DER|PEM|NET
和上一個差很少,不一樣的是指定輸出格式
-in filename : 要分析的文件名稱。若是文件有密碼保護,會要你輸入的.
-passin arg : 去看看CA那一章關於這個option的解釋吧。
-out filename : 要輸出的文件名。
-passout arg : 沒什麼用的一個選項,用來把保護key文件的密碼輸出的,意義和passin差很少。
-sgckey : 配合NET格式的私有密鑰文件的一個option, 沒有必要去深刻知道了。
-des|-des3|-idea : 指明用什麼加密算法把咱們的私有密鑰加密。加密的時候會須要咱們輸入密碼來保護該文件的。若是這仨一個都沒有選,那麼你的私有密鑰就以明文寫進你的key文件。該選項只能輸出PEM格式的文件。
-text : 打印出私有密鑰的各個組成部分.
-noout : 不打印出key的編碼版本信息。
-modulus : 把其公共密鑰的值也打印出來
-pubin : 缺省的來講是從輸入文件裏讀到私有密鑰,這個就能夠從輸入文件裏去讀公共密鑰.
-pubout : 缺省的來講是打印出私有密鑰,這個就能夠打印公共密鑰.若是上面那個選項有set那麼這個選項也自動被set.
-check : 檢查RSA的私有密鑰是否被破壞了這個指令實在和dsa太類似了。copy的我手軟。
如今解釋一下NET是一種什麼格式。它是爲了和老的netscape server以及IIS兼容才弄出來的。他使用沒有被salt過的RC4作加密算法,加密強度很底,若是不是必定要用就別用。
舉例時間:
把RSA私有密鑰文件的保護密碼去掉(最好別這麼作)
openssl rsa -in key.pem -out keyout.pem
用DES3算法加密咱們的私有密碼文件:
openssl rsa -in key.pem -des3 -out keyout.pem
把一個私有密鑰文件從PEM格式轉化成DER格式:
openssl rsa -in key.pem -outform DER -out keyout.der
把私有密鑰的全部內容詳細的打印出來:
openssl rsa -in key.pem -text -noout
只打印出公共密鑰部分:
openssl rsa -in key.pem -pubout -out pubkey.pem
九、 openssl簡介-指令rsautl
用法: openssl rsautl [-in file] [-out file] [-inkey file] [-pubin] [-certin] [-sign] [-verify] [-encrypt] [-decrypt] [-pkcs] [-ssl] [-raw] [-hexdump] [-asn1parse]
描述: 本指令可以使用RSA算法簽名,驗證身份, 加密/解密數據。[/b:86b8dd1e33]
-in filename : 指定輸入文件名。缺省爲標準輸入。 -out filename : 指定輸入文件名, 缺省爲標準輸出。 -inkey file : 指定咱們的私有密鑰文件, 格式必須是RSA私有密鑰文件。 -pubin : 指定咱們的公共密鑰文件。說真的我還真不知道RSA的公共密鑰文件有什麼用,通常公共密鑰都是放在證書裏面的。 -certin :指定咱們的證書文件了。 -sign : 給輸入的數據簽名。須要咱們的私有密鑰文件。 -verify : 對輸入的數據進行驗證。 -encrypt : 用咱們的公共密鑰對輸入的數據進行加密。 -decrypt : 用RSA的私有密鑰對輸入的數據進行解密。 -pkcs, -oaep, -ssl, -raw : 採用的填充模式, 上述四個值分別表明:PKCS#1.5(缺省值), PKCS#1 OAEP, SSLv2裏面特定的填充模式,或者不填充。若是要簽名,只有-pkcs和-raw可使用. -hexdump : 用十六進制輸出數據。 -asn1parse : 對輸出的數據進行ASN1分析。看看指令asn1parse吧。該指令通常和-verify一塊兒用的時候威力大。 本指令加密數據的時候只能加密少許數據,要加密大量數據,估計要調API.我也沒試過寫RSA加密解密的程序來玩。 舉例時間: 用私有密鑰對某文件簽名: openssl rsautl -sign -in file -inkey key.pem -out sig 注意哦, 文件真的不能太大, 這個不能太大意思是必須很小。 文件大小最好不要大過73。絕對不能多過150,多了就會出錯。 這個工具真是用來玩的 對簽名過的數據進行驗證,獲得原來的數據。 openssl rsautl -verify -in sig -inkey key.pem 檢查原始的簽名過的數據: openssl rsautl -verify -in sig -inkey key.pem -raw -hexdump 0000 - 00 01 ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 0010 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 0020 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 0030 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 0040 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 0050 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 0060 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 0070 - ff ff ff ff 00 68 65 6c-6c 6f 20 77 6f 72 6c 64 .....hello world 很明顯,這是PKCS#1結構:使用0xff填充模式。 配合指令asn1parse,能夠分析簽名的證書,咱們在req指令裏說了怎麼作自簽名的證書了,如今來分析一下先。 openssl asn1parse -in pca-cert.pem 0:d=0 hl=4 l= 742 cons: SEQUENCE 4:d=1 hl=4 l= 591 cons: SEQUENCE 8:d=2 hl=2 l= 3 cons: cont [ 0 ] 10:d=3 hl=2 l= 1 prim: INTEGER :02 13:d=2 hl=2 l= 1 prim: INTEGER :00 16:d=2 hl=2 l= 13 cons: SEQUENCE 18:d=3 hl=2 l= 9 prim: OBJECT :md5WithRSAEncryption 29:d=3 hl=2 l= 0 prim: NULL 31:d=2 hl=2 l= 92 cons: SEQUENCE 33:d=3 hl=2 l= 11 cons: SET 35:d=4 hl=2 l= 9 cons: SEQUENCE 37:d=5 hl=2 l= 3 prim: OBJECT :countryName 42:d=5 hl=2 l= 2 prim: PRINTABLESTRING :AU .... 599:d=1 hl=2 l= 13 cons: SEQUENCE 601:d=2 hl=2 l= 9 prim: OBJECT :md5WithRSAEncryption 612:d=2 hl=2 l= 0 prim: NULL 614:d=1 hl=3 l= 129 prim: BIT STRING 最後一行BIT STRING就是實際的簽名。咱們能夠這樣子捏它出來: openssl asn1parse -in pca-cert.pem -out sig -noout -strparse 614 還能夠這樣子把公共密鑰給弄出來: openssl x509 -in test/testx509.pem -pubkey&nb, sp;-noout >pubkey.pem 咱們也能夠這樣子分析簽名: openssl rsautl -in sig -verify -asn1parse -inkey pubkey.pem -pubin 0:d=0 hl=2 l= 32 cons: SEQUENCE 2:d=1 hl=2 l= 12 cons: SEQUENCE 4:d=2 hl=2 l= 8 prim: OBJECT :md5 14:d=2 hl=2 l= 0 prim: NULL 16:d=1 hl=2 l= 16 prim: OCTET STRING 0000 - f3 46 9e aa 1a 4a 73 c9-37 ea 93 00 48 25 08 b5 .F...Js.7...H%.. 這是通過分析後的ASN1結構。能夠看出來使用的哈希算法是md5. (很抱歉,我本身試這一行的時候輸出結果卻徹底不一樣。 0:d=0 hl=2 l= 120 cons: appl [ 24 ] length is greater than 18 徹底沒有辦法看出那裏有寫哈希算法。) 證書裏面的簽名部分能夠這麼捏出來: openssl asn1parse -in pca-cert.pem -out tbs -noout -strparse 4 這樣獲得他的哈希算法的細節: openssl md5 -c tbs MD5(tbs)= f3:46:9e:aa:1a:4a:73:c9:37:ea:93:00:48:25:08:b5