openssl man手冊

標 題: openssl簡介--前言  
     
     
     
    不久前接到有關ssl的活, 結果找遍中文網站資料實在奇缺。感覺是好象現在國內做這個技術的人不多所有有興趣寫點東西來介紹一下。 
    
    我使用的ssl的toolkit是openssl就用openssl做例子來講解 
    openssl實在太大了,指令也多,API也多,更嚴重的是 它的API沒有說明。我打算漫漫說清楚其主要指令的用法,主要API的中文說明,以及使用/編程的方法。   
         
    工作量很大,因爲我接觸它也沒幾個月,現在大概 完成了1/10吧, 先把目前自己的一些心得,找到的資料 和一些翻譯出來的東西貼出來,希望對研究ssl的人有幫助




openssl簡介-證書
http://bbs.chinaunix.net/forum/viewtopic.php?p=3161562#3161585

openssl簡介-加密算法
http://bbs.chinaunix.net/forum/viewtopic.php?p=3161562#3161685

openssl簡介-協議
http://bbs.chinaunix.net/forum/viewtopic.php?p=3161562#3161727

openssl簡介-入門
http://bbs.chinaunix.net/forum/viewtopic.php?p=3161562#3162073

openssl簡介-指令 verify
http://bbs.chinaunix.net/forum/viewtopic.php?p=3161562#3173096

openssl簡介-指令asn1parse
http://bbs.chinaunix.net/forum/viewtopic.php?p=3161562#3173120

openssl簡介-指令ca
http://bbs.chinaunix.net/forum/viewtopic.php?p=3173126#3173126

openssl簡介-指令cipher
http://bbs.chinaunix.net/forum/viewtopic.php?p=3173132#3173132

openssl簡介-指令dgst
http://bbs.chinaunix.net/forum/viewtopic.php?p=3173136#3173136

openssl簡介-指令dhparam
http://bbs.chinaunix.net/forum/viewtopic.php?p=3173142#3173142

openssl簡介-指令enc
http://bbs.chinaunix.net/forum/viewtopic.php?p=3173146#3173146

openssl簡介-指令gendsa
http://bbs.chinaunix.net/forum/viewtopic.php?p=3173149#3173149

openssl簡介-指令genrsa
http://bbs.chinaunix.net/forum/viewtopic.php?p=3173152#3173152

openssl簡介-指令passwd
http://bbs.chinaunix.net/forum/viewtopic.php?p=3173154#3173154

openssl簡介-指令pkcs7
http://bbs.chinaunix.net/forum/viewtopic.php?p=3173156#3173156

openssl簡介-指令rand
http://bbs.chinaunix.net/forum/viewtopic.php?p=3173158#3173158

openssl簡介-指令req
http://bbs.chinaunix.net/forum/viewtopic.php?p=3173162#3173162

openssl簡介-指令rsa
http://bbs.chinaunix.net/forum/viewtopic.php?p=3173164#3173164

openssl簡介-指令rsautl
http://bbs.chinaunix.net/forum/viewtopic.php?p=3173168#3173168

openssl簡介-指令s_client
http://bbs.chinaunix.net/forum/viewtopic.php?p=3173171#3173171

openssl簡介-指令s_server
http://bbs.chinaunix.net/forum/viewtopic.php?p=3173175#3173175

openssl簡介-指令sess_id
http://bbs.chinaunix.net/forum/viewtopic.php?p=3173176#3173176

openssl簡介-指令speed
http://bbs.chinaunix.net/forum/viewtopic.php?p=3173178#3173178

openssl簡介-指令version
http://bbs.chinaunix.net/forum/viewtopic.php?p=3173181#3173181

openssl簡介-指令x509
http://bbs.chinaunix.net/forum/viewtopic.php?p=3173188#3173188



 wingger 回覆於:2005-01-07 09:29:51

標題:openssl簡介--證書

發信站:BBS水木清華站(FriNov1020:29:282000)

引用請指明原作譯者[email protected]

二證書



證書就是數字化的文件,裏面有一個實體(網站,個人等)的公共密鑰和其他的屬性,如名稱等。該公共密鑰只屬於某一個特定的實體,它的作用是防止一個實體假裝成另外一個實體。

證書用來保證不對稱加密算法的合理性。想想吧,如果沒有證書記錄,那麼假設某倆人A與B的通話過程如下:

這裏假設A的publickey是K1,privatekey是K2,B的publickey是K3,privatekey是K4

xxxxxx(kn)表示用kn加密過的一段文字xxxxxx

A-----〉hello(plaintext)-------------〉B
A〈---------hello(plaintext)〈---------B
A〈---------Bspublickey〈------------B
A---------〉spublickey(K1)--------〉B
......



如果C想假裝成B,那麼步驟就和上面一樣。
A-----〉hello(plaintext)-------------〉C
A〈---------hello(plaintext)〈---------C

注意下一步,因爲A沒有懷疑C的身份,所以他理所當然的接受了C的publickey,並且使用這個key來繼續下面的通信。

A〈---------Cspublickey〈------------C
A---------〉Aspublickey(K1)--------〉C
......

這樣的情況下A是沒有辦法發覺C是假的。如果A在通話過程中要求取得B的證書,並且驗證證書裏面記錄的名字,如果名字和B的名字不符合,就可以發現對方不是B.驗證B的名字通過再從證書裏面提取B的公用密鑰,繼續通信過程。


那麼,如果證書是假的怎麼辦?或者證書被修改過了怎麼辦?慢慢看下來吧。


證書最簡單的形式就是隻包含有證書擁有者的名字和公用密鑰。當然現在用的證書沒這麼簡單,裏面至少還有證書過期的deadline,頒發證書的機構名稱,證書系列號,和一些其他可選的信息。最重要的是,它包含了證書頒發機構(certificationauthority簡稱CA)的簽名信息。

我們現在常用的證書是採用X.509結構的,這是一個國際標準證書結構。任何遵循該標準的應用程序都可以讀,寫X509結構的證書。

通過檢查證書裏面的CA的名字,和CA的簽名,就知道這個證書的確是由該CA簽發的然後,你就可以簡單證書裏面的接收證書者的名字,然後提取公共密鑰。這樣做建立的基礎是,你信任該CA,認爲該CA沒有頒發錯誤的證書。

CA是第三方機構,被你信任,由它保證證書的確發給了應該得到該證書的人。CA自己有一個龐大的publickey數據庫,用來頒發給不同的實體。

這裏有必要解釋一下,CA也是一個實體,它也有自己的公共密鑰和私有密鑰,否則怎麼做數字簽名?它也有自己的證書,你可以去它的站點down它的證書得到它的公共密鑰。

一般CA的證書都內嵌在應用程序中間。不信你打開你的IE,在internet選項裏面選中"內容",點擊"證書",看看那個"中間證書發行機構"和"委託根目錄發行機構",是不是有一大堆CA的名稱?也有時CA的證書放在安全的數據庫裏面。

當你接受到對方的證書的時候,你首先會去看該證書的CA,然後去查找自己的CA證書數據庫,看看是否找的到,找不到就表示自己不信任該CA,那麼就告吹本次連接。找到了的話就用該CA的證書裏面的公用密鑰去檢查CA在證書上的簽名。

這裏又有個連環的問題,我怎麼知道那個CA的證書是屬於那個CA的?人家不能造假嗎?

解釋一下吧。CA也是分級別的。最高級別的CA叫RootCAs,其他cheap一點的CA的證書由他們來頒發和簽名。這樣的話,最後的保證就是:我們信任RootCAs.那些有RootCAs簽名過的證書的CA就可以來頒發證書給實體或者其他CA了。

你不信任RootCAs?人民幣由中國人民銀行發行,運到各個大銀行,再運到地方銀行,你從地方銀行取人民幣的時候不信任發行它的中國人民銀行嗎?RootCAs都是很權威的機構,沒有必要擔心他們的信用。

那RootCAs誰給簽名?他們自己給自己簽名,叫自簽名.

說了這麼多,舉個certificate的例子吧,對一些必要的item解釋一下。

CertificateExample
Certificate:
Data:
Version:1(0x0)
SerialNumber://系列號
02:41:00:00:16
SignatureAlgorithm:md2WithRSAEncryption//CA同志的數字簽名的算法
Issuer:C=US,O=RSADataSecurity,Inc.,OU=Commercial//CA自報家門
Certification
Authority
Validity
NotBefore:Nov418:58:341994GMT//證書的有效期
NotAfter:Nov318:58:341999GMT
Subject:C=US,O=RSADataSecurity,Inc.,OU=Commercial
CertificationAuthority
SubjectPublicKeyInfo:
PublicKeyAlgorithm:rsaEncryption
RSAPublicKey:(1000bit)
Modulus(1000bit):
00:a4:fb:81:62:7b:ce:10:27:dd:e8:f7:be:6c:6e:
c6:70:99:db:b8:d5:05:03:69:28:82:9c:72:7f:96:
3f:8e:ec:ac:29:92:3f:8a:14:f8:42:76:be:bd:5d:
03:b9:90:d4:d0:bc:06:b2:51:33:5f:c4:c2:bf:b6:
8b:8f:99:b6:62:22:60:dd:db:df:20:82:b4:ca:a2:
2f:2d:50:ed:94:32:de:e0:55:8d:d4:68:e2:e0:4c:
d2:cd:05:16:2e:95:66:5c:61:52:38:1e:51:a8:82:
a1:c4:ef:25:e9:0a:e6:8b:2b:8e:31:66:d9:f8:d9:
fd:bd:3b:69:d9:eb
Exponent:65537(0x10001)
SignatureAlgorithm:md2WithRSAEncryption
76:b5:b6:10:fe:23:f7:f7:59:62:4b:b0:5f:9c:c1:68:bc:49:
bb:b3:49:6f:21:47:5d:2b:9d:54:c4:00:28:3f:98:b9:f2:8a:
83:9b:60:7f:eb:50:c7:ab:05:10:2d:3d:ed:38:02:c1:a5:48:
d2:fe:65:a0:c0:bc:ea:a6:23:16:66:6c:1b:24:a9:f3:ec:79:
35:18:4f:26:c8:e3:af:50:4a:c7:a7:31:6b:d0:7c:18:9d:50:
bf:a9:26:fa:26:2b:46:9c:14:a9:bb:5b:30:98:42:28:b5:4b:
53:bb:43:09:92:40:ba:a8:aa:5a:a4:c6:b6:8b:57:4d:c5

其實這是我們看的懂的格式的證書內容,真正的證書都是加密過了的,如下:



-----BEGINCERTIFICATE-----

MIIDcTCCAtqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBiDELMAkGA1UEBhMCQ0gx

EjAQBgNVBAgTCWd1YW5nZG9uZzESMBAGA1UEBxMJZ3Vhbmd6aG91MREwDwYDVQQK

Ewhhc2lhaW5mbzELMAkGA1UECxMCc3cxDjAMBgNVBAMTBWhlbnJ5MSEwHwYJKoZI

hvcNAQkBFhJmb3JkZXNpZ25AMjFjbi5jb20wHhcNMDAwODMwMDc0MTU1WhcNMDEw

ODMwMDc0MTU1WjCBiDELMAkGA1UEBhMCQ0gxEjAQBgNVBAgTCWd1YW5nZG9uZzES

MBAGA1UEBxMJZ3Vhbmd6aG91MREwDwYDVQQKEwhhc2lhaW5mbzELMAkGA1UECxMC

c3cxDjAMBgNVBAMTBWhlbnJ5MSEwHwYJKoZIhvcNAQkBFhJmb3JkZXNpZ25AMjFj

bi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMDYArTAhLIFacYZwP30

Zu63mAkgpAjVHaIsIEJ6wySIZl2THEHjJ0kS3i8lyMqcl7dUFcAXlLYi2+rdktoG

jBQMOtOHv1/cmo0vzuf38+NrAZSZT9ZweJfIlp8W9uyz8Dv5hekQgXFg/l3L+HSx

wNvQalaOEw2nyf45/np/QhNpAgMBAAGjgegwgeUwHQYDVR0OBBYEFKBL7xGeHQSm

ICH5wBrOiqNFiildMIG1BgNVHSMEga0wgaqAFKBL7xGeHQSmICH5wBrOiqNFiild

oYGOpIGLMIGIMQswCQYDVQQGEwJDSDESMBAGA1UECBMJZ3Vhbmdkb25nMRIwEAYD

VQQHEwlndWFuZ3pob3UxETAPBgNVBAoTCGFzaWFpbmZvMQswCQYDVQQLEwJzdzEO

MAwGA1UEAxMFaGVucnkxITAfBgkqhkiG9w0BCQEWEmZvcmRlc2lnbkAyMWNuLmNv

bYIBADAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA4GBAGQa9HK2mixM7ML7

0jZr1QJUHrBoabX2AbDchb4Lt3qAgPOktTc3F+K7NgB3WSVbdqC9r3YpS23RexU1

aFcHihDn73s+PfhVjpT8arC1RQDg9bDPvUUYphdQC0U+HF72/CvxGCTqpnWiqsgw

xqeog0A8H3doDrffw8Zb7408+Iqf

-----ENDCERTIFICATE-----



證書都是有壽命的。就是上面的那個NotBefore和NotAfter之間的日子。過期的證書,如果沒有特殊原因,都要擺在證書回收列(certificaterevocationlist)裏面.證書回收列,英文縮寫是CRL.比如一個證書的key已經被破了,或者證書擁有者沒有權力再使用該證書,該證書就要考慮作廢。CRL詳細記錄了所有作廢的證書。

CRL的缺省格式是PEM格式。當然也可以輸出成我們可以讀的文本格式。下面有個CRL的例子。



-----BEGINX509CRL-----

MIICjTCCAfowDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMxIDAeBgNVBAoT

F1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2VydmVy

IENlcnRpZmljYXRpb24gQXV0aG9yaXR5Fw05NTA1MDIwMjEyMjZaFw05NTA2MDEw

MDAxNDlaMIIBaDAWAgUCQQAABBcNOTUwMjAxMTcyNDI2WjAWAgUCQQAACRcNOTUw

MjEwMDIxNjM5WjAWAgUCQQAADxcNOTUwMjI0MDAxMjQ5WjAWAgUCQQAADBcNOTUw

MjI1MDA0NjQ0WjAWAgUCQQAAGxcNOTUwMzEzMTg0MDQ5WjAWAgUCQQAAFhcNOTUw

MzE1MTkxNjU0WjAWAgUCQQAAGhcNOTUwMzE1MTk0MDQxWjAWAgUCQQAAHxcNOTUw

MzI0MTk0NDMzWjAWAgUCcgAABRcNOTUwMzI5MjAwNzExWjAWAgUCcgAAERcNOTUw

MzMwMDIzNDI2WjAWAgUCQQAAIBcNOTUwNDA3MDExMzIxWjAWAgUCcgAAHhcNOTUw

NDA4MDAwMjU5WjAWAgUCcgAAQRcNOTUwNDI4MTcxNzI0WjAWAgUCcgAAOBcNOTUw

NDI4MTcyNzIxWjAWAgUCcgAATBcNOTUwNTAyMDIxMjI2WjANBgkqhkiG9w0BAQIF

AAN+AHqOEJXSDejYy0UwxxrH/9+N2z5xu/if0J6qQmK92W0hW158wpJg+ovV3+wQ

wvIEPRL2rocL0tKfAsVq1IawSJzSNgxG0lrcla3MrJBnZ4GaZDu4FutZh72MR3Gt

JaAL3iTJHJD55kK2D/VoyY1djlsPuNh6AEgdVwFAyp0v

-----ENDX509CRL-----





下面是文本格式的CRL的例子。

ThefollowingisanexampleofaCRLintextformat:

issuer=/C=US/O=RSADataSecurity,Inc./OU=SecureServerCertification

Authority

lastUpdate=May202:12:261995GMT

nextUpdate=Jun100:01:491995GMT

revoked:serialNumber=027200004CrevocationDate=May202:12:261995GMT

revoked:serialNumber=0272000038revocationDate=Apr2817:27:211995GMT

revoked:serialNumber=0272000041revocationDate=Apr2817:17:241995GMT

revoked:serialNumber=027200001ErevocationDate=Apr800:02:591995GMT

revoked:serialNumber=0241000020revocationDate=Apr701:13:211995GMT

revoked:serialNumber=0272000011revocationDate=Mar3002:34:261995GMT

revoked:serialNumber=0272000005revocationDate=Mar2920:07:111995GMT

revoked:serialNumber=024100001FrevocationDate=Mar2419:44:331995GMT

revoked:serialNumber=024100001ArevocationDate=Mar1519:40:411995GMT

revoked:serialNumber=0241000016revocationDate=Mar1519:16:541995GMT

revoked:serialNumber=024100001BrevocationDate=Mar1318:40:491995GMT

revoked:serialNumber=024100000CrevocationDate=Feb2500:46:441995GMT

revoked:serialNumber=024100000FrevocationDate=Feb2400:12:491995GMT

revoked:serialNumber=0241000009revocationDate=Feb1002:16:391995GMT

revoked:serialNumber=0241000004revocationDate=Feb117:24:261995GMT



總結一下X.509證書是個什麼東東吧。它實際上是建立了公共密鑰和某個實體之間聯繫的數字化的文件。它包含的內容有:

版本信息,X.509也是有三個版本的。

系列號
證書接受者名稱
頒發者名稱
證書有效期
公共密鑰
一大堆的可選的其他信息
CA的數字簽名

證書由CA頒發,由CA決定該證書的有效期,由該CA簽名。每個證書都有唯一的系列號。證書的系列號和證書頒發者來決定某證書的唯一身份。

openssl有四個驗證證書的模式。你還可以指定一個callback函數,在驗證證書的時候會自動調用該callback函數。這樣可以自己根據驗證結果來決定應用程序的行爲。具體的東西在以後的章節會詳細介紹的。

openssl的四個驗證證書模式分別是:

SSL_VERIFY_NONE:完全忽略驗證證書的結果。當你覺得握手必須完成的話,就選用這個選項。其實真正有證書的人很少,尤其在中國。那麼如果SSL運用於一些免費的服務,比如email的時候,我覺得server端最好採用這個模式。

SSL_VERIFY_PEER:希望驗證對方的證書。不用說這個是最一般的模式了.對client來說,如果設置了這樣的模式,驗證server的證書出了任何錯誤,SSL握手都告吹.對server來說,如果設置了這樣的模式,client倒不一定要把自己的證書交出去。如果client沒有交出證書,server自己決定下一步怎麼做。

SSL_VERIFY_FAIL_IF_NO_PEER_CERT:這是server使用的一種模式,在這種模式下,server會向client要證書。如果client不給,SSL握手告吹。

SSL_VERIFY_CLIENT_ONCE:這是僅能使用在sslsessionrenegotiation階段的一種方式。什麼是SSLsessionrenegotiation?以後的章節再解釋。我英文差點,覺得這個詞組也很難翻譯成相應的中文。以後的文章裏,我覺得很難直接翻譯的單詞或詞組,都會直接用英文寫出來。如果不是用這個模式的話,那麼在regegotiation的時候,client都要把自己的證書送給server,然後做一番分析。這個過程很消耗cpu時間的,而這個模式則不需要client在regotiation的時候重複送自己的證書了。


 wingger 回覆於:2005-01-07 09:47:41

標題:openssl簡介--加密算法

發信站:BBS水木清華站(FriNov1020:24:102000)

引用請指明原作/譯者[email protected]



一加密算法的一些常識


要理解ssl先要知道一些加密算法的常識.


加密算法很容易理解啦,就是把明文變成人家看不懂的東西,然後送給自己想要的送到的地方,接收方用配套的解密算法又把密文解開成明文,這樣就不怕在路世上如果密文給人家截獲而泄密。

加密算法有倆大類,第一種是不基於KEY的,舉個簡單的例子,我要加密"fordesign"這麼一串字符,就把每個字符都變成它的後一個字符,那麼就是"gpseftjhm"了,這樣的東西人家當然看不明白,接收方用相反的方法就可以得到原文。當然這只是個例子,現在應該沒人用這麼搞笑的加密算法了吧。

不基於KEY的加密算法好象一直用到了計算機出現。我記得古中國軍事機密都是用這種方式加密的。打戰的時候好象軍隊那些電報員也要帶着密碼本,也應該是用這種方式加密的。這種算法的安全性以保持算法的保密爲前提。

這種加密算法的缺點太明顯了,就是一旦你的加密算法給人家知道,就肯定掛。日本中途島慘敗好象就是密碼給老米破了。設計一種算法是很麻煩的,一旦給人破了就沒用了,這也忑浪費。

我們現在使用的加密算法一般是基於key的,也就是說在加密過程中需要一個key,用這個key來對明文進行加密。這樣的算法即使一次被破,下次改個key,還可以繼續用。

key是一個什麼東西呢?隨便你,可以是一個隨機產生的數字,或者一個單詞,啥都行,只要你用的算法認爲你選來做key的那玩意合法就行。

這樣的算法最重要的是:其安全性取決於key,一般來說取決於key的長度。也就是說應該保證人家在知道這個算法而不知道key的情況下,破解也相當困難。其實現在常用的基於KEY的加密算法在網絡上都可以找到,很多革命同志(都是老外)都在想辦法破解基於key的加密算法又包括倆類:對稱加密和不對稱加密。對稱加密指的是雙方使用完全相同的key,最常見的是DES.DES3,RC4等。對稱加密算法的原理很容易理解,通信一方用KEK加密明文,另一方收到之後用同樣的KEY來解密就可以得到明文。

不對稱加密指雙方用不同的KEY加密和解密明文,通信雙方都要有自己的公共密鑰和私有密鑰。舉個例子比較容易理解,我們們假設通信雙方分別是A,B.
A,擁有KEY_A1,KEY_A2,其中KEY_A1是A的私有密鑰,KEY_A2是A的公共密鑰。
B,擁有KEY_B1,KEY_B2,其中KEY_B1是B的私有密鑰,KEY_B2是B的公共密鑰。

公共密鑰和私有密鑰的特點是,經過其中任何一把加密過的明文,只能用另外一把才能夠解開。也就是說經過KEY_A1加密過的明文,只有KEY_A2才能夠解密,反之亦然。

通信過程如下:

A-------->;KEY_A2------------>;B
A<--------KEY_B2<------------A

這個過程叫做公共密鑰交換,老外管這叫keyexchange.之後A和B就分別用對方的公共密鑰加密,用自己的私有密鑰解密。

一般公共密鑰是要發佈出去的,然後你通過自己的私有密鑰加密明文,人家用你的公共密鑰解密,如果能解開,那麼說明你是加密人,這就是SSL使用的驗證機制。

常用的不對稱加密一般有RSA,DSA,DH等。我們一般使用RSA.

數字簽名也是不對稱加密算法的一個重要應用,理解它對於理解SSL很重要的,放在這裏一起介紹一下。


簽名是什麼大家都很熟悉吧?證明該東西是你寫的,是你發佈的,你就用簽名搞定。看看那些重要文件都要頭頭簽名。數字簽名就是數字化的簽名了。記得公用密鑰和私有密鑰的特徵嗎?只有你一個人有你自己的私有密鑰。而你的公用密鑰是其他人都知道的了。那麼你在寫完一封郵件之後,用自己的私有密鑰加密自己的名字,接收人用你的公共密鑰解開一看,哦,是你發的。這就是你的數字簽名過程了。

上面的解釋是很簡化的了,其實數字簽名比這個複雜多了,但我們沒有了解的必要,知道數字簽名是這麼一回事就可以了。


還有一種我們需要知道的加密算法,其實我不覺得那是加密算法,應該叫哈希算法,英文是messagedigest,是用來把任何長度的一串明文以一定規則變成固定長度的一串字符串。它在SSL中的作用也很重要,以後會慢慢提及的。一般使用的是MD5,SHA.

base64不是加密算法,但也是SSL經常使用的一種算法,它是編碼方式,用來把asc碼和二進制碼轉來轉去的。

具體的加密解密過程我們不需要了解,因爲SSL根本不關心。但瞭解加密算法的一些基本原理是必要的,否則很難理解SSL。

對加密算法的細節有興趣的同志,可以去網絡上找這些加密算法的原理的文章和實現的程序來研究,不過先學數論吧。


 wingger 回覆於:2005-01-07 09:55:13

標題:openssl簡介--協議

發信站:BBS水木清華站(FriNov1020:30:492000)

引用請指明原作/譯者[email protected]



SSL(SecureSocketLayer)是netscape公司提出的主要用於web的安全通信標準,分爲2.0版和3.0版.TLS(TransportLayerSecurity)是IETF的TLS工作組在SSL3.0基礎之上提出的安全通信標準,目前版本是1.0,即RFC2246.SSL/TLS提供的安全機制可以保證應用層數據在互聯網絡傳輸不被監聽,僞造和竄改.

一般情況下的網絡協議應用中,數據在機器中經過簡單的由上到下的幾次包裝,就進入網絡,如果這些包被截獲的話,那麼可以很容易的根據網絡協議得到裏面的數據.由網絡監聽工具可以很容易的做到這一點。

SSL就是爲了加密這些數據而產生的協議,可以這麼理解,它是位與應用層和TCP/IP之間的一層,數據經過它流出的時候被加密,再往TCP/IP送,而數據從TCP/IP流入之後先進入它這一層被解密,同時它也能夠驗證網絡連接倆端的身份。


它的主要功能就是倆個:
一:加密解密在網絡中傳輸的數據包,同時保護這些數據不被修改,和僞造。
二:驗證網絡對話中雙方的身份

SSL協議包含倆個子協議,一個是包協議,一個是握手協議。包協議是說明SSL的數據包應該如何封裝的。握手協議則是說明通信雙方如何協商共同決定使用什麼算法以及算法使用的key。很明顯包協議位於握手協議更下一層。我們暫時對包協議的內容沒有興趣。

SSL握手過程說簡單點就是:通信雙方通過不對稱加密算法來協商好一個對稱加密算法以及使用的key,然後用這個算法加密以後所有的數據完成應用層協議的數據交換。


握手一般都是由client發起的,SSL也不例外。

1client送給server它自己本身使用的ssl的version(ssl一共有三個version),加密算法的一些配置,和一些隨機產生的數據,以及其他在SSL協議中需要用到的信息。

2server送給client它自己的SSL的version,加密算法的配置,隨機產生的數據,還會用自己的私有密鑰加密SERVER-HELLO信息。Server還同時把自己的證書文件給送過去。同時有個可選的項目,就是server可以要求需要客戶的certificate。

3client就用server送過來的certificate來驗證server的身份。如果server身份驗證沒通過,本次通信結束。通過證書驗證之後,得到server的公共密鑰,解開server送來的被其用私有密鑰加密過的SERVER-HELLO信息,看看對頭與否。如果不對,說明對方只有該server的公共密鑰而沒有私有密鑰,必是假的。通信告吹。

4client使用到目前爲止所有產生了的隨機數據(sharedsecret),client產生本次握手中的premastersecret(這個步驟是有可能有server的參與的,由他們使用的加密算法決定),並且把這個用server的公共密鑰加密,送回給server.如果server要求需要驗證client,那麼client也需要自己把自己的證書送過去,同時送一些自己簽過名的數據過去。

SSL協議有倆種技術來產生sharedsecret(真不好意思,又是一個很難意譯的詞組),
一種是RSA,一種是EDH.

RSA就是我們上一章說過的一種不對稱加密算法。首先server把自己的RSA公共密鑰送給client,client於是用這個key加密一個隨機產生的值(這個隨機產生的值就是sharedsecret),再把結果送給server.

EDH也是一種不對稱加密算法,但它與RSA不同的是,它好象沒有自己固定的公共密鑰和私有密鑰,都是在程序跑起來的時候產生的,用完就K掉。其他的步驟倆者就差不多了。

RSA,DSA,DH三種不對稱加密算法的區別也就在這裏。RSA的密鑰固定,後倆個需要一個參數來臨時生成key.DH甚至要求雙方使用同樣的參數,這個參數要事先指定。如果SSL庫沒有load進這個參數,DH算法就沒辦法用。DSA沒研究過。

5Server驗證完client的身份之後,然後用自己的私有密鑰解密得到premastersecret然後雙方利用這個premastersecret來共同協商,得到mastersecret.

6雙方用master一起產生真正的sessionkey,着就是他們在剩下的過程中的對稱加密的key了。這個key還可以用來驗證數據完整性。雙方再交換結束信息。握手結束。

接下來雙方就可以用協商好的算法和key來用對稱加密算法繼續下面的過程了。

很簡單吧?其實要複雜一些的,我簡化了很多來說。

不過還是有個問題,喜歡搗蛋的人雖然看不懂他們在交流些什麼,但篡改總可以吧?
記得我們在加密算法裏面介紹過的哈希算法嗎?就是爲了對付這種搗蛋者的。在每次送信息的時候,附帶把整條信息的哈希值也送過去,接收方收到信息的時候,也把收到的內容哈希一把,然後和對方送來的哈希值對比一下,看看是否正確。搗蛋者如果亂改通信內容,哈希出來的值是不同的,那麼就很容易被發現了。


但這樣子,搗蛋者至少可以學舌。他可以把之前監聽到的內容重複發給某一方,而這些內容肯定是正確的,無法驗證出有問題的。哎,SSL是怎麼對付這種人的我還沒看出來。有篇文章說:多放點隨機數在信息裏可以對付,我也沒去研究這句話是什麼意思。


 wingger 回覆於:2005-01-07 11:03:26

openssl簡介-入門
實現了SSL的軟件不多,但都蠻優秀的。首先,netscape自己提出來的概念,當然自己會實現一套了。netscape的技術蠻優秀的,不過我沒用過他們的ssl-toolkit.甚至連名字都沒搞清楚。 
    1995年,eric.young開始開發openssl, 那時候叫ssleay.一直到現在,openssl還在不停的修改和新版本的發行之中。openssl真夠大的,我真佩服eric的水平和興趣。這些open/free的鬥士的精神是我寫這個系列的主要動力,雖然寫的挺煩的。
ps: eric現在去了RSA公司做,做了一個叫SSL-C的toolkit, 其實和openssl差不多。估計應該比openssl穩定,區別是這個是要銀子的,而且幾乎所有低層的函數都不提供直接調用了。那多沒意思。 
    去www.openssl.org down openssl吧,最新的是0.9.6版。 
    安裝是很簡單的。我一直用的是sun sparc的機器,所以用sun sparc的機器做例子。 
    gunzip -d openssl.0.9.6.tar.gz 
    tar -xf openssl.0.9.6.tar 
    mv openssl.0.9.6 openssl 
    cd openssl 
    ./configure --prefix=XXXXX --openssldir=XXXXXXXX 
    (這裏prefix是你想安裝openssl的地方, openssldir就是你tar開的openssl源碼的地方。好象所有的出名點的free software都是這個操行,configure, make , make test, make install, 搞定。) 
    ./make(如果機器慢,這一步的時候可以去洗個澡,換套衣服) 
    ./make test 
    ./make install 
    OK, 如果路上沒有什麼問題的話,搞定。 
    經常有人報bug, 在hp-ux, sgi上裝openssl出問題,我沒試過,沒發言權。 
    現在可以開始玩openssl了。 
    注意: 我估計openssl最開始是在linux下開發的。大家可以看一看在linxu下有這麼一個文件:/dev/urandom, 在sparc下沒有。這個文件有什麼用?你可以隨時找它要一個隨機數。在加密算法產生key的時候,我們需要一顆種子:seed。這個seed就是找/dev/urandom要的那個隨機數。那麼在sparc下,由於沒有這麼一個設備,很多openssl的函數會報錯:"PRNG not seeded". 解決方法是:在你的~/.profile裏面添加一個變量$RANDFILE, 設置如下: 
    $RANDFILE=$HOME/.rnd 
    然後在$HOME下vi .rnd, 隨便往裏面亂輸入一些字符,起碼倆行。 
    很多openssl的函數都會把這個文件當seed, 除了openssl rsa, 希望openssl儘快修改這個bug. 
    如果用openssl做toolkit編程, 則有其他不太安全的解決方法。以後講到openssl編程的章節會詳細介紹。 
    先生成自己的私有密鑰文件,比如叫server.key 
    openssl genrsa -des3 -out server.key 1024 
    genras表示生成RSA私有密鑰文件,-des3表示用DES3加密該文件,1024是我們的key的長度。一般用512就可以了,784可用於商業行爲了,1024可以用於軍事用途了。 
    當然,這是基於現在的計算機的速度而言,可能沒過幾年1024是用於開發測試,2048用於一般用途了。 
    生成server.key的時候會要你輸入一個密碼,這個密鑰用來保護你的server.key文件,這樣即使人家偷走你的server.key文件,也打不開,拿不到你的私有密鑰。 
    openssl rsa -noout -text -in server.key 
    可以用來看看這個key文件裏面到底有些什麼東西(不過還是看不懂) 
    如果你覺得server.key的保護密碼太麻煩想去掉的話: 
    openssl rsa -in server.key -out server.key.unsecure 
    不過不推薦這麼做 
    
下一步要得到證書了。得到證書之前我們要生成一個Certificate Signing Request. 
    CA只對CSR進行處理。 
    openssl req -new -key server.key -out server.csr 
    生成CSR的時候屏幕上將有提示,依照其指示一步一步輸入要求的信息即可. 
    生成的csr文件交給CA簽名後形成服務端自己的證書.怎麼交給CA簽名? 
    自己去www.verisign.com慢慢看吧。 
    
    如果是自己玩下,那麼自己來做CA吧。openssl有很簡單的方法做CA.但一般只好在開發的時候或者自己玩的時候用,真的做出產品,還是使用正規的CA簽發給你的證書吧 
    在你make install之後,會發現有個misc的目錄,進去,運行CA.sh -newca,他會找你要CA需要的一個CA自己的私有密鑰密碼文件。沒有這個文件?按回車創建,輸入密碼來保護這個密碼文件。之後會要你的一個公司信息來做CA.crt文件。最後在當前目錄下多了一個./demoCA這樣的目錄../demoCA/private/cakey.pem就是CA的key文件啦, 
    ./demoCA/cacert.pem就是CA的crt文件了。把自己創建出來的server.crt文件copy到misc目錄下,mv成newreq.pem,然後執行CA.sh -sign, ok, 
    得到回來的證書我們命名爲server.crt. 
    
    看看我們的證書裏面有些什麼吧 
    openssl x509 -noout -text -in server.crt 
    玩是玩過了,openssl的指令繁多,就象天上的星星。慢慢一個一個解釋吧。


 wingger 回覆於:2005-01-10 23:32:33

openssl簡介-指令 verify
用法: 
    
    openssl verify 【-CApath directory】 【-CAfile file】 【-purpose purpose】【-untrusted file】 【-help】 【-issuer_checks】 【-verbose】  【-】 【certificates】 
    
     說明: 
    
     證書驗證工具。 

     
    選項 
     -CApath directory 
    我們信任的CA的證書存放目錄。這些證書的名稱應該是這樣的格式: 
    xxxxxxxx.0( xxxxxxxx代表證書的哈希值。 參看x509指令的-hash) 
    你也可以在目錄裏touch一些這樣格式文件名的文件,符號連接到真正的證書。 
    那麼這個xxxxxxxx我怎麼知道怎麼得到?x509指令有說明。 
    其實這樣子就可以了: 
    openssl x509 -hash -in server.crt 
    
    -CAfile file 
    我們信任的CA的證書,裏面可以有多個CA的證書。 
    
    -untrusted file 
    我們不信任的CA的證書。 
    
    -purpose purpose 
    證書的用途。如果這個option沒有設置,那麼不會對證書的CA鏈進行驗證。 
    
    現在這個option的參數有以下幾個: 
    sslclinet 
    sslserver 
    nssslserver 
    smimesign 
    smimeencrypt 
    等下會詳細解釋的。 
    
    -help 
    打印幫助信息。 
    
-verbose 
    
     打印出詳細的操作信息。 
    
-issuer_checks 
    打印出我們驗證的證書的簽發CA的證書的之間的聯繫。 
    要一次驗證多個證書,把那些證書名都寫在後面就好了。 
        
    驗證操作解釋: 
    S/MIME和本指令使用完全相同的函數進行驗證。 
    我們進行的驗證和真正的驗證有個根本的區別: 
    在我們對整個證書鏈進行驗證的時候,即使中途有問題,我們也會驗證到最後,而真實的驗證一旦有一個環節出問題,那麼整個驗證過程就告吹。 
    驗證操作包括幾個獨立的步驟。 
    首先建立證書鏈,從我們目前的證書爲基礎,一直上溯到Root CA的證書. 
    如果中間有任何問題,比如找不到某個證書的頒發者的證書,那麼這個步驟就掛。有任何一個證書是字簽名的,就被認爲是Root CA的證書。 
    尋找一個證書的頒發CA也包過幾個步驟。在openssl0.9.5a之前的版本,如果一個證書的頒發者和另一個證書的擁有着相同,就認爲後一個證書的擁有者就是前一個證書的簽名CA. 
    openssl0.9.6及其以後的版本中,即使上一個條件成立,還要進行更多步驟的檢驗。包括驗證系列號等。到底有哪幾個我也沒看明白。 
    得到CA的名稱之後首先去看看是否是不信任的CA, 如果不是,那麼纔去看看是否是信任的CA. 尤其是Root CA, 更是必須是在信任CA列表裏面。 
    現在得到鏈條上所有CA的名稱和證書了,下一步是去檢查第一個證書的用途是否和簽發時候批准的一樣。其他的證書則必須都是作爲CA證書而頒發的。 
    證書的用途在x509指令裏會詳細解釋。 
    過了第二步,現在就是檢查對Root CA的信任了。可能Root CA也是每個都負責不同領域的證書籤發。缺省的認爲任何一個Root CA都是對任何用途的證書有簽發權。 
    最後一步,檢查整條證書鏈的合法性。比如是否有任何一個證書過期了?簽名是否是正確的?是否真的是由該證書的頒發者簽名的? 
    任何一步出問題,所有該證書值得懷疑,否則,證書檢驗通過。 
    
     如果驗證操作有問題了,那麼打印出來的結果可能會讓人有點模糊。 
    一般如果出問題的話,會有類似這樣子的結果打印出來: 
    server.pem: /C=AU/ST=Queensland/O=CryptSoft Pty Ltd/CN=Test CA (1024 bit) 
    error 24 at 1 depth lookup:invalid CA certificate 
    第一行說明哪個證書出問題,後面是其擁有者的名字,包括幾個字段。 
    第二行說明錯誤號,驗證出錯在第幾層的證書,以及錯誤描述。 
    下面是錯誤號及其描述的詳細說明,注意,有的錯誤雖然有定義, 
    但真正使用的時候永遠不會出現。用unused標誌. 
    0 X509_V_OK 
    驗證操作沒有問題 
    2 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT 
    找不到該證書的頒發CA的證書。 
    3 X509_V_ERR_UNABLE_TO_GET_CRL (unused) 
   找不到和該證書相關的CRL 
   4 X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE 
   無法解開證書裏的簽名。 
    5 X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE (unused) 
    無法解開CRLs的簽名。 
    6 X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY 
    無法得到證書裏的公共密鑰信息。 
    7 X509_V_ERR_CERT_SIGNATURE_FAILURE 
    證書籤名無效 
    8 X509_V_ERR_CRL_SIGNATURE_FAILURE (unused) 
    證書相關的CRL簽名無效 
    9 X509_V_ERR_CERT_NOT_YET_VALID 
    證書還沒有到有效開始時間 
    10 X509_V_ERR_CRL_NOT_YET_VALID (unused) 
    與證書相關的CRL還沒有到有效開始時間 
    11 X509_V_ERR_CERT_HAS_EXPIRED 
    證書過期 
    12 X509_V_ERR_CRL_HAS_EXPIRED (unused) 
    與證書相關的CRL過期 
    13 X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD 
    證書的notBefore字段格式不對,就是說那個時間是非法格式。 
    14 X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD 
    證書的notAfter字段格式不對,就是說那個時間是非法格式。 
    15 X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD (unused) 
    CRL的lastUpdate字段格式不對。 
    16 X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD (unused) 
    CRL的nextUpdate字段格式不對 
    17 X509_V_ERR_OUT_OF_MEM 
    操作時候內存不夠。這和證書本身沒有關係。 
    18 X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT 
    需要驗證的第一個證書就是字簽名證書,而且不在信任CA證書列表中。 
    19 X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN 
    可以建立證書鏈,但在本地找不到他們的根?? 
    
    : self signed certificate in certificate chain 
    the certificate chain could be built up using the untrusted certificates 
    but the root could not be found locally. 
    20 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY 
    有一個證書的簽發CA的證書找不到。這說明可能是你的Root CA的證書列表不齊全。 
    21 X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE 
    證書鏈只有一個item, 但又不是字簽名的證書。 
    22 X509_V_ERR_CERT_CHAIN_TOO_LONG (unused) 
    證書鏈太長。 
    23 X509_V_ERR_CERT_REVOKED (unused) 
    證書已經被CA宣佈收回。 
    24 X509_V_ERR_INVALID_CA 
    某CA的證書無效。 
    25 X509_V_ERR_PATH_LENGTH_EXCEEDED 
    參數basicConstraints pathlentgh超過規定長度 
    26 X509_V_ERR_INVALID_PURPOSE 
    提供的證書不能用於請求的用途。 
    比如鏈條中某個證書應該是用來做CA證書的,但證書裏面的該字段說明該證書不是用做CA證書的,就是這樣子的情況。 
    27 X509_V_ERR_CERT_UNTRUSTED 
    Root CA的證書如果用在請求的用途是不被信任的。 
    28 X509_V_ERR_CERT_REJECTED 
    CA的證書根本不可以用做請求的用途。 
    29 X509_V_ERR_SUBJECT_ISSUER_MISMATCH 
    證書頒發者名稱和其CA擁有者名稱不相同。-issuer_checks被set的時候可以檢驗出來。 
    30 X509_V_ERR_AKID_SKID_MISMATCH 
    證書的密鑰標誌和其頒發CA爲其指定的密鑰標誌不同. 
    31 X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH 
    證書系列號與起頒發CA爲其指定的系列號不同。 
    32 X509_V_ERR_KEYUSAGE_NO_CERTSIGN 
    某CA的證書用途不包括爲其他證書籤名。 
    50 X509_V_ERR_APPLICATION_VERIFICATION 
    應用程序驗證出錯。


 wingger 回覆於:2005-01-10 23:39:26

openssl簡介-指令asn1parse

     用法:openssl asn1parse [-inform PEM|DER] [-in filename] [-out filename] 
    
     [-noout] [-offset number] [-length number] [-i] [- structure filename] 
    
     [-strparse offset] 
    
用途:一個診斷工具,可以對ASN1結構的東東進行分析。
 
    ASN1是什麼?一個用來描述對象的標準。要解釋的話,文章可以比解釋openssl結構的文章更長。有興趣的話自己去網絡上找來看吧。 
    
-inform DER|PEM|TXT 
    輸入的格式,DER是二進制格式,PEM是base64編碼格式,TXT不用解釋了吧 
    
-in filename 
    輸入文件的名稱,缺省爲標準輸入。 
    
    -out filename 
    輸入文件的名稱,輸入一般都是DER數據。如果沒這個項,就沒有東西輸入咯。該項一般都要和-strparse一起使用。 
    
    -noout 
    不要輸出任何東西(不明白有什麼用) 
    
-offset number 
    從文件的那裏開始分析,看到offset就應該知道是什麼意思了吧。 
    
    -length number 
    一共分析輸入文件的長度的多少,缺省是一直分析到文件結束。 
    
    -i 
    根據輸出的數據自動縮進。 
    
    - structure filename 
    當你輸入的文件包含有附加的對象標誌符的時候,使用這個。 
    這種文件的格式在後面會介紹。 
    
    -strparse offset 
    從由offset指定的偏移量開始分析ASN1對象。當你碰到一個嵌套的對象時,可以反覆使用這個項來一直進到裏面的結構捏出你需要的東東。 
    一般分析完之後輸入的東東如下: 
    openssl asn1parse -out temp.ans -i -inform pem < server.crt 
    
     0:d=0 hl=4 l= 881 cons: SEQUENCE 
    
     4:d=1 hl=4 l= 730 cons: SEQUENCE 
    
     ... .... 
    
     172:d=3 hl=2 l= 13 prim: UTCTIME :000830074155Z 
    
     187:d=3 hl=2 l= 13 prim: UTCTIME :010830074155Z 
    
     202:d=2 hl=3 l= 136 cons: SEQUENCE 
    
     205:d=3 hl=2 l= 11 cons: SET 
    
     ... ... 
    
     359:d=3 hl=3 l= 141 prim: BIT STRING 
    
     ... ... 
    本例是一個自簽名的證書。每一行的開始是對象在文件裏的偏移量。d=xx是結構嵌套的深度。知道ASN1結構的人應該知道,每一個SET或者SEQUENCE都會讓嵌套深度增加1. 
    hl=xx表示當前類型的header的長度。1=xx表示內容的八進制的長度。 
    -i可以讓輸出的東西容易懂一點。 
    如果沒有ASN.1的知識,可以省略看這一章。 
    本例中359行就是證書裏的公共密鑰。可以用-strparse來看看 
    openssl asn1parse -out temp.ans -i -inform pem -strparse 359 < server.crt 
    
     0:d=0 hl=3 l= 137 cons: SEQUENCE 
    
     3:d=1 hl=3 l= 129 prim: INTEGER :C0D802B4C084B20569C619C0FDF 
    
     466EEB7980920A408D51DA22C20427AC32488665D931C41E3274912DE2F25C8CA9C97B75 
    
     415C01794B622DBEADD92DA068C140C3AD387BF5FDC9A8D2FCEE7F7F3E36B0194994FD67 
    
     07897C8969F16F6ECB3F03BF985E910817160FE5DCBF874B1C0DBD06A568E130DA7C9FE3 
    
     9FE7A7F421369 
    
     135:d=1 hl=2 l= 3 prim: INTEGER :010001 
    不要試圖去看temp.ans的內容,是二進制來的,看不懂的。


 wingger 回覆於:2005-01-10 23:41:07

openssl簡介-指令ca

用途: 
    模擬CA行爲的工具.有了它,你就是一個CA,不過估計是nobody trusted CA.可以用來給各種格式的CSR簽名,用來產生和維護CRL(不記得CRL是什麼了?去看證書那一章).他還維護着一個文本數據庫,記錄了所有經手頒發的證書及那些證書的狀態。 
    用法: 
     openssl ca [-verbose] [-config filename] [-name section] [-gencrl] 
    
     [-revoke file] [-crldays days] [-crlhours hours] [-crlexts section] 
    
     [-startdate date] [-enddate date] [-days arg] [-md arg] [-policy arg] 
    
     [-keyfile arg] [-key arg] [-passin arg] [-cert file] [-in file] 
    
     [-out file] [-notext] [-outdir dir] [-infiles] [-spkac file] 
    
     [-ss_cert file] [-preserveDN] [-batch] [-msie_hack] [-extensions section] 

     哇噻,好複雜也。不過用過GCC的人應該覺得這麼點flag還是小case. 
    
-config filename 
    指定使用的configure文件。 
    
    -in filename 
    要簽名的CSR文件。 
    
    -ss_cert filename 
    一個有自簽名的證書,需要我們CA簽名,就從這裏輸入文件名。 
    
    -spkac filename 
    這一段實在沒有看懂,也沒興趣,估計和SPKAC打交道可能性不大,奉送上英文原文。 
    a file containing a single Netscape signed public key and challenge and additional field values to be signed by the CA. 
SPKAC FORMAT 
    The input to the -spkac command line option is a Netscape signed public key and challenge. This will usually come from the KEYGEN tag in an HTML form to create a new private key. It is however possible to create SPKACs using the spkac utility. 
    The file should contain the variable SPKAC set to the value of the SPKAC and also the required DN components as name value pairs. If you need to include the same component twice then it can be preceded by a number and a . 
    -infiles 
    如果你一次要給幾個CSR簽名,就用這個來輸入,但記得這個選項一定要放在最後。這個項後面的所有東東都被認爲是CSR文件名參數。 
    -out filename 
    簽名後的證書文件名。證書的細節也會給寫進去。 
    -outdir directory 
    擺證書文件的目錄。證書名就是該證書的系列號,後綴是.pem 
    -cert 
    CA本身的證書文件名 
    -keyfile filename 
    CA自己的私有密鑰文件 
    -key password 
    CA的私有密鑰文件的保護密碼。 
    在有的系統上,可以用ps看到你輸入的指令,所以這個參數要小心點用。 
    -passin arg 
    也是一個輸入私有密鑰保護文件的保護密碼的一種方式,可以是文件名,設備名或者是有名管道。程序會把該文件的第一行作爲密碼讀入。(也蠻危險的)。 
    -verbose 
    操作過程被詳細printf出來 
    -notext 
    不要把證書文件的明文內容輸出到文件中去。 
    -startdate date 
    指明證書的有效開始日期。格式是YYMMDDHHMMSSZ, 同ASN1的UTCTime結構相同。 
    -enddate date 
    指明證書的有效截止日期,格式同上。 
    -days arg 
    指明給證書的有效時間,比如365天。 
    -md alg 
    簽名用的哈希算法,比如MD2, MD5等。 
    -policy arg 
    指定CA使用的策略。其實很簡單,就是決定在你填寫信息生成CSR的時候,哪些信息是我們必須的,哪些不是。看看config文件裏面的policy這個item就明白了。 
    -msie_hack 
    爲了和及其古老的證書版本兼容而做出的犧牲品,估計沒人會用的,不解釋了。 
    -preserveDN 
    和-msie_hack差不多的一個選項。 
    -batch 
    設置爲批處理的模式,所有的CSR會被自動處理。 
    -extensions section 
    我們知道一般我們都用X509格式的證書,X509也有幾個版本的。如果你在這個選項後面帶的那個參數在config文件裏有同樣名稱的key,那麼就頒發X509V3證書,否則頒發X509v1證書。 
    還有幾個關於CRL的選項,但我想一般很少人會去用。我自己也沒興趣去研究。 
    有興趣的自己看看英文吧。 
        
     CRL OPTIONS 
    
     -gencrl 
    
     this option generates a CRL based on information in the index file. 
      -crldays num 
    
     the number of days before the next CRL is due. That is the days from 
    
     now to place in the CRL nextUpdate field. 
    
-crlhours num 
    
     the number of hours before the next CRL is due. 
        
     -revoke filename 
    
     a filename containing a certificate to revoke. 
        
     -crlexts section 
    
     the section of the configuration file containing CRL extensions to 
    
     include. If no CRL extension section is present then a V1 CRL is created, 
    
     if the CRL extension section is present (even if it is empty) then a V2 
    
     CRL is created. The CRL extensions specified are CRL extensions and not 
    
     CRL entry extensions. It should be noted that some software (for example 
    
     Netscape) can't handle V2 CRLs. 
    
    相信剛纔大家都看到很多選項都和config文件有關,那麼我們來解釋一下config文件make install之後,openssl會生成一個全是缺省值的config文件:openssl.cnf.也長的很,貼出來有賺篇幅之嫌,xgh不屑。簡單解釋一下其中與CA有關的key.
與CA有關的key都在ca這個section之中。 
    [ ca ] 
    default_ca = CA_default 
    [ CA_default ] 
    dir = ./demoCA # Where everything is kept 
    certs = $dir/certs # Where the issued certs are kept 
    crl_dir = $dir/crl # Where the issued crl are kept 
    database = $dir/index.txt # database index file. 
    new_certs_dir = $dir/newcerts # default place for new certs. 
    certificate = $dir/cacert.pem # The CA certificate 
    serial = $dir/serial # The current serial number 
    crl = $dir/crl.pem # The current CRL 
    private_key = $dir/private/cakey.pem# The private key 
    RANDFILE = $dir/private/.rand # private random number file 
    x509_extensions = usr_cert # The extentions to add to the cert 
    # Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs 
    # so this is commented out by default to leave a V1 CRL. 
    # crl_extensions = crl_ext 
    default_days = 365 # how long to certify for 
    default_crl_days= 30 # how long before next CRL 
    default_md = md5 # which md to use. 
    preserve = no # keep passed DN ordering 
    # A few difference way of specifying how similar the request should look 
    # For type CA, the listed attributes must be the same, and the optional 
    # and supplied fields are just that :-) 
    policy = policy_match 
    # For the CA policy 
    [ policy_match ] 
    countryName = match 
    stateOrProvinceName = match 
    organizationName = match 
    organizationalUnitName = optional 
    commonName = supplied 
    emailAddress = optional 
    # At this point in time, you must list all acceptable 'object' 
    # types. 
    [ policy_anything ] 
    countryName = optional 
    stateOrProvinceName = optional 
    localityName = optional 
    organizationName = optional 
    organizationalUnitName = optional 
    commonName = supplied 
    emailAddress = optional 
    config文件裏CA section裏面的很多key都和命令行參數是對應的。 
    如果某個key後面標明mandatory,那就說明這個參數是必須提供的,無論你通過命令行還是通過config文件去提供。 

 new_certs_dir 
    本key同命令行的 -outdir意義相同。(mandatory) 
    certificate 
    同命令行的 -cert意義相同。(mandatory) 
    private_key 
    同命令行-keyfile意義相同.(mandatory) 
    RANDFILE 
    指明一個用來讀寫時候產生random key的seed文件。具體意義在以後的RAND的API再給出解釋。(不是我擺譜,我覺得重複解釋沒有必要) 
    default_days 
    意義和命令行的 -days相同。 
    default_startdate 
    意義同命令行的 -startdate相同。如果沒有的話那麼就使用產生證書的時間。 
    default_enddate 
    意義同命令行的 -enddate相同。(mandatory). 
    crl_extensions 
    preserve 
    default_crl_hours default_crl_days 
    CRL的東西.....自己都沒弄懂..... 
    default_md 
    同命令行的-md意義相同. (mandatory) 
    database 
    記得index.txt是什麼文件嗎?不記得自己往前找。這個key就是指定index.txt的。初始化是空文件。 
    serialfile 
    指明一個txt文件,裏面必須包含下一個可用的16進制數字,用來給下一個證書做系列號。(mandatory) 
    x509_extensions 
    意義同 -extensions相同。 
    msie_hack 
    意義同-msie_hack相同。 
    policy 
    意義同-policy相同。自己看看這一塊是怎麼回事。(mandatory) 
    [ policy_match ] 
    countryName = match 
    stateOrProvinceName = match 
    organizationName = match 
    organizationalUnitName = optional 
    commonName = supplied 
    emailAddress = optional 
    其實如果你做過CSR就會明白,這些項就是你做CSR時候填寫的那些東西麻。 
    後面的"match", "supplied"等又是什麼意思呢?"match"表示說明你填寫的這一欄一定要和CA本身的證書裏面的這一欄相同。supplied表示本欄必須,optional就表示本欄可以不填寫。 
    舉例時間到了: 
    注意,本例中我們先要在 $OPENSSL/misc下面運行過CA.sh -newca,建立好相應的目錄,所有需要的文件,包括CA的私有密鑰文件,證書文件,系列號文件,和一個空的index文件。並且文件都已經各就各位。放心把,產生文件和文件就位都由CA.sh搞定,你要做的就是運行CA.sh -nweca就行了,甚至在你的系列號文件中還有個01,用來給下一個證書做系列號。 
    給一個CSR簽名: 
    openssl ca -in req.pem -out newcert.pem 
    給一個CSR簽名, 產生x509v3證書: 
    openssl ca -in req.pem -extensions v3_ca -out newcert.pem 
    同時給數個CSR簽名: 
    openssl ca -infiles req1.pem req2.pem req3.pem 
    注意: 
    index.txt文件是整個處理過程中很重要的一部分,如果這玩意壞了,很難修復。理論上根據已經頒發的證書和當前的CRL當然是有辦法修復的啦,但openssl沒提供這個功能。:( 
    openssl還有倆大類指令: crl, crl2pkcs7, 都是和CRL有關的, 
    由於我們對這個沒有興趣,所以這倆大類不做翻譯和解釋。


 wingger 回覆於:2005-01-10 23:42:18

openssl簡介-指令cipher
說明:cipher就是加密算法的意思。ssl的cipher主要是對稱加密算法和不對稱加密算法的組合。 本指令是用來展示用於SSL加密算法的工具。它能夠把所有openssl支持的加密算法按照一定規律排列(一般是加密強度)。這樣可以用來做測試工具,決定使用什麼加密算法。 
    
    
    用法: 
    openssl ciphers [-v] [-ssl2] [-ssl3] [-tls1] [cipherlist] 
        
    COMMAND OPTIONS 
    -v 
    詳細列出所有符合的cipher的所有細節。列出該cipher使用的ssl的版本,公共密鑰交換算法,身份驗證方法,對稱加密算法以及哈希算法。還列出該算法是否可以出口。
 
    算法出口? 趁這個機會可以給大家來點革命教育。米國的加密算法研究是世界上最先進的,其國家安全局(NSA)在這方面的研究水平已經多次證明比"最先進水平"領先10到15年。他們的預算據說是每年200億美圓。他們的數學家比你知道的還多,他們還是全世界最大的計算機硬件買家。DES就是他們最先弄出來的。到了70年代,IBM也有人在實現室弄出這個算法。都弄出來30年了,還使用的這麼廣泛。 
    該算法的最隱蔽的是一個叫S匣的東西,是一個常數矩陣。研究DES你就會知道這玩意。因爲NSA和IBM都沒有給出這個S匣的解釋,所以大家都懷疑使用這個東西是否是NSA和IBM搞出來的後門? 
    一直到了90年代,纔有倆個以色列人發現了原因,這個是爲了對付一種叫什麼微分密碼分析的破解法而如此設置的,對S匣的任何改動都將使微分密碼分析比較容易的將DES給K掉。S匣不僅不是後門,還是最大限度的增加了加密強度。 
    說遠了,大意就是:老米在這方面領先的可怕。但他們怕他們的研究成果給其他國家的人用,搞的自己也破解不了,那就麻煩了。所以他們用法律規定了,一定強度以上的加密算法禁止給其他國家用。那些加密強度很弱的就可以出口。 
    這個故事教育我們,爲了中國的崛起,還有很多路要走吶。 
   如果沒有-v這個參數, 很多cipher可能重複出現,因爲他們可以同時被不同版本的SSL協議使用。 
    
     -ssl3 
    只列出SSLv3使用的ciphers 
     -ssl2 
    只列出SSLv2使用的ciphers 
    -tls1 
    只列出TLSv1使用的ciphers 
    -h, -? 
    打印幫助信息 
    cipherlist 
   列出一個cipher list的詳細內容。一般都這麼用: 
   openssl -v XXXXX 
   這個XXXXX就是cipher list.如果是空的話,那麼XXXXX代表所有的cipher. 
   CIPHER LIST 的格式 
   cipher list由許多cipher string組成,由冒號,逗號或者空格分隔開。但一般最常用的是用冒號。 
   cipher string又是什麼? 
   它可以僅僅包含一個cipher, 比如RC4-SHA. 
   它也可以僅僅包含一個加密算法,比如SHA, 那就表示所有用到SHA的cipher都得列出來。 
    你還可以使用三個符號來捏合各種不同的cipher,做出cipher string.這三個符號是 +, -, !。我想這個很好理解吧,MD5+DES表示同時使用了這倆種算法的cipher,!SHA就表示所有沒有有用到SHA的cipher, IDEA-CBC就表示使用了IDEA而沒有使用CBC的所有cipher. 
    openssl還缺省的定義了一些通用的cipher string, 有: 
    DEFAULT: 缺省的cipher list. 
    ALL: 所有的cipher 
    HIGH, LOW, MEDIUM: 分別代表 高強度,中等強度和底強度的cipher list.具體一點就是對稱加密算法的key的長度分別是 >;128bit <128bit和 ==128bit的cipher. 
    EXP, EXPORT, EXPORT40: 老米的壟斷體現,前倆者代表法律允許出口的加密算法,包括40bit, 56bit長度的key的算法,後者表示只有40bit長度的key的加密算法。 
    eNULL, NULL: 表示不加密的算法。(那也叫加密算法嗎?) 
    aNULL: 不提供身份驗證的加密算法。目前只有DH一種。該算法很容易被監聽者,路由器等中間設備攻擊,所以不提倡使用。 
    
    下表列出了SSL/TLS使用的cipher, 以及openssl裏面如何表示這些cipher. 
    SSL v3.0 cipher suites OPENLLS表示方法 
    
     SSL_RSA_WITH_NULL_MD5 NULL-MD5 
    
     SSL_RSA_WITH_NULL_SHA NULL-SHA 
    
     SSL_RSA_EXPORT_WITH_RC4_40_MD5 EXP-RC4-MD5 
    
     SSL_RSA_WITH_RC4_128_MD5 RC4-MD5 
    
     SSL_RSA_WITH_RC4_128_SHA RC4-SHA 
    
     SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5 EXP-RC2-CBC-MD5 
    
     SSL_RSA_WITH_IDEA_CBC_SHA IDEA-CBC-SHA 
    
     SSL_RSA_EXPORT_WITH_DES40_CBC_SHA EXP-DES-CBC-SHA 
    
     SSL_RSA_WITH_DES_CBC_SHA DES-CBC-SHA 
    
     SSL_RSA_WITH_3DES_EDE_CBC_SHA DES-CBC3-SHA 
        
     SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA Not implemented. 
    
     SSL_DH_DSS_WITH_DES_CBC_SHA Not implemented. 
    
     SSL_DH_DSS_WITH_3DES_EDE_CBC_SHA Not implemented. 
    
     SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA Not implemented. 
    
     SSL_DH_RSA_WITH_DES_CBC_SHA Not implemented. 
    
     SSL_DH_RSA_WITH_3DES_EDE_CBC_SHA Not implemented. 
    
     SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA EXP-EDH-DSS-DES-CBC-SHA 
    
     SSL_DHE_DSS_WITH_DES_CBC_SHA EDH-DSS-CBC-SHA 
    
     SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA EDH-DSS-DES-CBC3-SHA 
    
     SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA EXP-EDH-RSA-DES-CBC-SHA 
    
     SSL_DHE_RSA_WITH_DES_CBC_SHA EDH-RSA-DES-CBC-SHA 
    
     SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA EDH-RSA-DES-CBC3-SHA 
    
     
     SSL_DH_anon_EXPORT_WITH_RC4_40_MD5 EXP-ADH-RC4-MD5 
    
     SSL_DH_anon_WITH_RC4_128_MD5 ADH-RC4-MD5 
    
     SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA EXP-ADH-DES-CBC-SHA 
    
     SSL_DH_anon_WITH_DES_CBC_SHA ADH-DES-CBC-SHA 
    
     SSL_DH_anon_WITH_3DES_EDE_CBC_SHA ADH-DES-CBC3-SHA 
    
     
    
     SSL_FORTEZZA_KEA_WITH_NULL_SHA Not implemented. 
    
     SSL_FORTEZZA_KEA_WITH_FORTEZZA_CBC_SHA Not implemented. 
    
     SSL_FORTEZZA_KEA_WITH_RC4_128_SHA Not implemented. 
    
     
    
     TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA EXP1024-DES-CBC-SHA 
    
     TLS_RSA_EXPORT1024_WITH_RC4_56_SHA EXP1024-RC4-SHA 
    
     TLS_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA EXP1024-DHE-DSS-DES-CBC-SHA 
    
     TLS_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA EXP1024-DHE-DSS-RC4-SHA 
    
     TLS_DHE_DSS_WITH_RC4_128_SHA DHE-DSS-RC4-SHA 
    
     
    
     
    
    TLS v1.0 cipher suites. 
    
     TLS_RSA_WITH_NULL_MD5 NULL-MD5 
    
     TLS_RSA_WITH_NULL_SHA NULL-SHA 
    
     TLS_RSA_EXPORT_WITH_RC4_40_MD5 EXP-RC4-MD5 
    
     TLS_RSA_WITH_RC4_128_MD5 RC4-MD5 
    
     TLS_RSA_WITH_RC4_128_SHA RC4-SHA 
    
     TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 EXP-RC2-CBC-MD5 
    
     TLS_RSA_WITH_IDEA_CBC_SHA IDEA-CBC-SHA 
    
     TLS_RSA_EXPORT_WITH_DES40_CBC_SHA EXP-DES-CBC-SHA 
    
     TLS_RSA_WITH_DES_CBC_SHA DES-CBC-SHA 
    
     TLS_RSA_WITH_3DES_EDE_CBC_SHA DES-CBC3-SHA 
    
     
    
     TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA Not implemented. 
    
     TLS_DH_DSS_WITH_DES_CBC_SHA Not implemented. 
    
     TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA Not implemented. 
    
     TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA Not implemented. 
    
     TLS_DH_RSA_WITH_DES_CBC_SHA Not implemented. 
    
     TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA Not implemented. 
    
     TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA EXP-EDH-DSS-DES-CBC-SHA 
    
     TLS_DHE_DSS_WITH_DES_CBC_SHA EDH-DSS-CBC-SHA 
    
     TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA EDH-DSS-DES-CBC3-SHA 
    
     TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA EXP-EDH-RSA-DES-CBC-SHA 
    
     TLS_DHE_RSA_WITH_DES_CBC_SHA EDH-RSA-DES-CBC-SHA 
    
     TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA EDH-RSA-DES-CBC3-SHA 
    
     
    
     TLS_DH_anon_EXPORT_WITH_RC4_40_MD5 EXP-ADH-RC4-MD5 
    
     TLS_DH_anon_WITH_RC4_128_MD5 ADH-RC4-MD5 
    
     TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA EXP-ADH-DES-CBC-SHA 
    
     TLS_DH_anon_WITH_DES_CBC_SHA ADH-DES-CBC-SHA 
    
     TLS_DH_anon_WITH_3DES_EDE_CBC_SHA ADH-DES-CBC3-SHA 
    
    NOTES 
    DH算法由於老米沒有允許人家使用,所有openssl都沒有實現之。 
    舉例時間: 
    詳細列出所有openssl支持的ciphers,包括那些eNULL ciphers: 
    openssl ciphers -v 'ALL:eNULL' 
    按加密強度列出所有加密算法: 
    openssl ciphers -v 'ALL:!ADH:@STRENGTH' 
    詳細列出所有同時使用了3DES和RSA的ciphers 
    openssl ciphers -v '3DES:+RSA'


 wingger 回覆於:2005-01-10 23:43:15

openssl簡介-指令dgst
用法: 
    
    openssl dgst [md5|md2|sha1|sha|mdc2|ripemd160] [-c] [-d] [file...] 
    
    說明:這個指令可以用來哈希某個文件內容的,
以前的版本還可以用來做數字簽名和認證。這個工具本來有很多選項的,可是不知道爲什麼,現在版本的openssl刪掉了很多。表示你用什麼算法來哈希該文件內容 
    
OPTIONS 
    -md5 -sha那些就不用結實了吧,都是一些哈希算法的名稱 
    -c 
    打印出哈希結果的時候用冒號來分隔開。 
    -d 
    詳細打印出調試信息 
    file... 
    你要哈希的文件,如果沒有指定,就使用標準輸入。 
    舉例時間: 
    要哈希一個叫fordesign.txt文件的內容,使用SHA算法 
    openssl dgst -sha -c fordesign.txt 
    SHA(fordesign.txt)= 
    57:37:dc:a5:8c:bd:12:aa:43:45:fe:2a:19:f5:05:a3:be:e9:08:cc


 wingger 回覆於:2005-01-10 23:44:05

openssl簡介-指令dhparam

    用法: 
    
    openssl dhparam [-inform DER|PEM] [-outform DER|PEM] [-in filename] 
    
    [-out filename] [-dsaparam] [-noout] [-text] [-C] [-2] [-5] 
    
    [-rand file(s)] [numbits] 
    
     
    描述: 
    本指令用來維護DH的參數文件。 

    
    OPTIONS: 
    -inform DER|PEM 
    指定輸入的格式是DEM還是DER. DER格式採用ASN1的DER標準格式。一般用的多的都是PEM格式,就是base64編碼格式.你去看看你做出來的那些.key, .crt文件一般都是PEM格式的,第一行和最後一行指明內容,中間就是經過編碼的東西。 
    -outform DER|PEM 
    和上一個差不多,不同的是指定輸出格式 
    -in filename 
    要分析的文件名稱。 
    -out filename 
    要輸出的文件名。 
    -dsaparam 
    如果本option被set, 那麼無論輸入還是輸入都會當做DSA的參數。它們再被轉化成DH的參數格式。這樣子產生DH參數和DH key都會塊很多。會使SSL握手的時間縮短。當然時間是以安全性做犧牲的,所以如果這樣子最好每次使用不同的參數,以免給人K破你的key. 
     -2, -5 
    使用哪個版本的DH參數產生器。版本2是缺省的。如果這倆個option有一個被set, 那麼將忽略輸入文件。 
    
     -rand file(s) 
    產生key的時候用過seed的文件,可以把多個文件用冒號分開一起做seed. 
    numbits 
    指明產生的參數的長度。必須是本指令的最後一個參數。如果沒有指明,則產生512bit長的參數。 
    
     
    -noout 
    不打印參數編碼的版本信息。 
    -text 
    將DH參數以可讀方式打印出來。 
    -C 
    將參數轉換成C代碼方式。這樣可以用get_dhnumbits()函數調用這些參數。 
    
    openssl還有倆個指令, dh, gendh, 現在都過時了,全部功能由dhparam實現。 
    現在dh, gendh這倆個指令還保留,但在將來可能會用做其他用途。


 wingger 回覆於:2005-01-10 23:44:38

openssl簡介-指令enc

    用法: 
    
    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編碼。 

    
    OPTIONS 
    -in filename 
    要加密/解密的輸入文件,缺省爲標準輸入。 
    -out filename 
    要加密/解密的輸出文件,缺省爲標準輸出。 
    -pass arg 
    輸入文件如果有密碼保護,在這裏輸入密碼。 
    -salt 
    爲了和openssl0.9.5以後的版本兼容,必須set這個option.salt大概又是密碼學裏的一個術語,具體是做什麼的我也沒弄的很明白。就我的理解,這是加密過後放在密碼最前面的一段字符串, 用途也是爲了讓破解更難.如果理解錯了,請密碼學高手指正. 
    -nosalt 
    想和openssl0.9.5以前的版本兼容,就set這個option 
    -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。 
    
    本指令支持的加密算法 
    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


 wingger 回覆於:2005-01-10 23:45:41

openssl簡介-指令gendsa
 
    用法: 
    
    openssl gendsa [-out filename] [-des] [-des3] [-idea] 
    
    [-rand file(s)] [paramfile] 
    
     
        
    描述: 
    
    本指令由DSA參數來產生DSA的一對密鑰。dsa參數可以用dsaparam來產生。
 
    
    OPTIONS 
    -des|-des3|-idea 
    採用什麼加密算法來加密我們的密鑰。一般會要你輸入保護密碼。 
    如果這三個中一個也沒set, 我們的密鑰將不被加密而輸入。 
    -rand file(s) 
    產生key的時候用過seed的文件,可以把多個文件用冒號分開一起做seed. 
    paramfile 
    指定使用的DSA參數文件。


 wingger 回覆於:2005-01-10 23:46:22

openssl簡介-指令genrsa
 
    用法: 
    
    openssl genrsa [-out filename] [-passout arg] [-des] [-des3] [-idea] 
    
    [-f4] [-3] [-rand file(s)] [numbits] 
    
     
    DESCRIPTION 
    生成RSA私有密鑰的工具。
 
    
    
    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.


 wingger 回覆於:2005-01-10 23:46:59

openssl簡介-指令passwd
 
    SYNOPSIS 
    
    openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] 
    
    [-quiet] [-table] {password} 
    
     
    
    說明: 
    本指令計算用來哈希某個密碼,也可以用來哈希文件內容。
 
    本指令支持三種哈希算法: 
    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


 wingger 回覆於:2005-01-10 23:47:31

openssl簡介-指令pkcs7
  用法: 
    openssl pkcs7 [-inform PEM|DER] [-outform PEM|DER] [-in filename] 
    
    [-out filename] [-print_certs] [-text] [-noout] 
    
    
    說明: 
    處理PKCS#7文件的工具, 

    
    OPTIONS 
    -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.


 wingger 回覆於:2005-01-10 23:48:02

 openssl簡介-指令rand
 
    用法: 
    
    openssl rand [-out file] [-rand file(s)] [-base64] num 
    
        
    描述: 
    用來產生僞隨機字節. 隨機數字產生器需要一個seed, 先已經說過了,在沒有/dev/srandom系統下的解決方法是自己做一個~/.rnd文件.如果該程序能讓隨機數字產生器很滿意的被seeded,程序寫回一些怪怪的東西回該文件. 

    
    OPTIONS 
   -out file 
   輸出文件. 
   -rand file(s) 
   產生隨機數字的時候用過seed的文件,可以把多個文件用冒號分開一起做seed. 
   -base64 
   對產生的東西進行base64編碼 
   num 
  指明產生多少字節隨機數.


 wingger 回覆於:2005-01-10 23:48:58

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] 
    
    [-newkey dsa] [-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. 

         
    OPTIONS 
    -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 
    [email protected] 
    就說只包括了字段和值。這樣子可以可以讓其他外部程序生成一個摸板文件,包含所有字段和值, 把這些值提出來.等下舉例時間會有詳細說明.如果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 = [email protected] 
    [ 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來指定.


 wingger 回覆於:2005-01-10 23:49:37

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的差不多. 

    
    OPTIONS 
    -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


 wingger 回覆於:2005-01-10 23:50:18

openssl簡介-指令rsautl
    用法: 
    
    openssl rsautl [-in file] [-out file] [-inkey file] [-pubin] [-certin] 
    
    [-sign] [-verify] [-encrypt] [-decrypt] [-pkcs] [-ssl] [-raw] [-hexdump] 
    
    [-asn1parse] 
    
     
    描述: 
    本指令能夠使用RSA算法簽名,驗證身份, 加密/解密數據。
 
    
    OPTIONS 
    -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 -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


 wingger 回覆於:2005-01-10 23:51:13

openssl簡介-指令s_client
  
    用法: 
    
    openssl s_client [-connect host:port>;] [-verify depth] [-cert filename] 
    
    [-key filename] [-CApath directory] [-CAfile filename] [-reconnect] 
    
    [-pause] [-showcerts] [-debug] [-nbio_test] [-state] [-nbio] [-crlf] 
    
    [-ign_eof] [-quiet] [-ssl2] [-ssl3] [-tls1] [-no_ssl2] [-no_ssl3] 
    
    [-no_tls1] [-bugs] [-cipher cipherlist] 
    
    描述: 
    用於模擬一個普通的SSL/TLS client, 對於調試和診斷SSL server很有用。 

    
    OPTIONS 
    -connect host:port 
    這個不用解釋了吧, 連接的ip:port. 
    -cert certname 
    使用的證書文件。如果server不要求要證書,這個可以省略。 
    -key keyfile 
    使用的私有密鑰文件 
    -verify depth 
    指定驗證深度。記得CA也是分層次的吧?如果對方的證書的簽名CA不是Root CA,那麼你可以再去驗證給該CA的證書籤名的CA, 一直到Root CA. 目前的驗證操作即使這條CA鏈上的某一個證書驗證有問題也不會影響對更深層的CA的身份的驗證。所以整個CA鏈上的問題都可以檢查出來。當然CA的驗證出問題並不會直接造成連接馬上斷開,好的應用程序可以讓你根據驗證結果決定下一步怎麼走。 
    -CApath directory 
    一個目錄。裏面全是CA的驗證資料,該目錄必須是"哈希結構". verify指令裏會詳細說明。在建立client的證書鏈的時候也有用到這個指令。 
    -CAfile file 
    某文件,裏面是所有你信任的CA的證書的內容。當你要建立client的證書鏈的時候也需要用到這個文件。 
    -reconnect 
    使用同樣的session-id連接同一個server五次,用來測試server的session緩衝功能是否有問題。 
    -pause 
    每次讀寫操作後都挺頓一秒。 
    -showcerts 
    顯示整條server的證書的CA的證書鏈。否則只顯示server的證書。 
    -prexit 
    當程序退出的時候打印session的信息。即使連接失敗,也會打印出調試信息。一般如果連接成功的話,調試信息將只被打出來一次。本option比較有用,因爲在一次SSL連接中,cipher也可能改變,或者連接可能失敗。要注意的是:有時候打印出來的東西並不一定準確。(這樣也行??eric, 言重了.) 
    -state 
    打印SSL session的狀態, ssl也是一個協議,當然有狀態。 
    -debug 
    打印所有的調試信息。 
    -nbio_test 
    檢查非阻塞socket的I/O運行情況。 
    -nbio 
    使用非阻塞socket 
    -crlf 
    回把你在終端輸入的換行回車轉化成/r/n送出去。 
    -ign_eof 
   當輸入文件到達文件尾的時候並不斷開連接。 
   -quiet 
   不打印出session和證書的信息。同時會打開-ign_eof這個option. 
   -ssl2, -ssl3, -tls1, -no_ssl2, -no_ssl3, -no_tls1 
   選擇用什麼版本的協議。很容易理解,不用多解釋了吧。 
   注意,有些很古老的server就是不能處理TLS1, 所以這個時候要關掉TLS1.n. 
   -bugs 
   SSL/TLS有幾處衆所周知的bug, set了這個option使出錯的可能性縮小。 
   -cipher cipherlist 
   由我們自己來決定選用什麼cipher,儘管是由server來決定使用什麼cipher,但它一般都會採用我們送過去的cipher列表裏的第一個cipher. 
    有哪些cipher可用?指令cipher對這個解釋的更清楚。 
    一旦和某個SSL server建立連接之後,所有從server得到的數據都會被打印出來,所有你在終端上輸入的東西也會被送給server. 這是人機交互式的。這時候不能set -quiet和 -ign_eof這倆個option。如果輸入的某行開頭字母是R,那麼在這裏session會renegociate, 如果輸入的某行開頭是Q, 那麼連接會被斷開。你完成整個輸入之後連接也會被斷開。 
    If a connection is established with an SSL server then any data received from the server is displayed and any key presses will be sent to the server. When used interactively (which means neither -quiet nor -ign_eof have been given), the session will be renegociated if the line begins with an R, and if the line begins with a Q or if end of file is reached, the connection will be closed down. 
    本指令主要是來debug一個SSL server的。如果想連接某個SSL HTTP server,輸入下一條指令: 
   openssl s_client -connect servername:443 
   如果連接成功,你可以用HTTP的指令,比如"GET /"什麼的去獲得網頁了。 
    如果握手失敗,原因可能有以下幾種: 
    1. server需要驗證你的證書,但你沒有證書 
    2.如果肯定不是原因1, 那麼就慢慢一個一個set以下幾個option 
    -bugs, -ssl2, -ssl3, -tls1, -no_ssl2, -no_ssl3, -no_tls1 
    這可能是因爲對方的server處理SSL有bug. 
    有的時候,client會報錯:沒有證書可以使用,或者供選擇的證書列表是空的。這一般是因爲Server沒有把給你簽名的CA的名字列進它自己認爲可以信任的CA列表,你可以用檢查一下server的信任CA列表。有的http server只在 client給出了一個URL之後才驗證client的證書,這中情況下要set -prexit這個option, 並且送給server一個頁面請求。 
    即使使用-cert指明使用的證書,如果server不要求驗證client的證書,那麼該證書也不會被驗證。所以不要以爲在命令行里加了-cert 的參數又連接成功就代表你的證書沒有問題。 
    如果驗證server的證書沒有問題,就可以set -showcerts來看看server的證書的CA鏈了。 
    其實這個工具並不好用, 自己寫一個client的會方便很多。 
    舉例時間: 
    注意,中間的pop3協議的指令是我通過終端輸入的。其他都是程序輸出的對話 
    過程。具體的每行意義不用解釋了。


openssl s_client -key server.key -verify 1 -showcerts -prexit -state \ 
    -crlf -connect 127.0.0.1:5995 
    verify depth is 1 
    CONNECTED(00000003) 
    SSL_connect:before/connect initialization 
    SSL_connect:SSLv2/v3 write client hello A 
    SSL_connect:SSLv3 read server hello A 
    depth=0 /C=AU/ST=Some-State/L=gz/O=ai ltd/OU=sw/CN=fordesign/ 
    [email protected] 
    verify error:num=20:unable to get local issuer certificate 
    verify return:1 
    depth=0 /C=AU/ST=Some-State/L=gz/O=ai ltd/OU=sw/CN=fordesign/ 
    [email protected] 
    verify error:num=27:certificate not trusted 
    verify return:1 
    depth=0 /C=AU/ST=Some-State/L=gz/O=ai ltd/OU=sw/CN=fordesign/ 
    [email protected] 
    verify error:num=21:unable to verify the first certificate 
    verify return:1 
    SSL_connect:SSLv3 read server certificate A 
    SSL_connect:SSLv3 read server done A 
    SSL_connect:SSLv3 write client key exchange A 
    SSL_connect:SSLv3 write change cipher spec A 
    SSL_connect:SSLv3 write finished A 
    SSL_connect:SSLv3 flush data 
    SSL_connect:SSLv3 read finished A 
    Certificate chain 
    0 s:/C=AU/ST=Some-State/L=gz/O=ai ltd/OU=sw/CN=fordesign/[email protected] 
    i:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=fordesign/ 
    [email protected] 
    ----BEGIN CERTIFICATE----- 
    MIIDdzCCAuCgAwIBAgIBATANBgkqhkiG9w0BAQQFADB8MQswCQYDVQQGEwJBVTET 
    MBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQ 
    dHkgTHRkMRIwEAYDVQQDEwlmb3JkZXNpZ24xITAfBgkqhkiG9w0BCQEWEmZvcmRl 
    aXNnbkAyMWNuLmNvbTAeFw0wMDExMTIwNjE5MDNaFw0wMTExMTIwNjE5MDNaMH0x 
    CzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMQswCQYDVQQHEwJnejEP 
    MA0GA1UEChMGYWkgbHRkMQswCQYDVQQLEwJzdzESMBAGA1UEAxMJZm9yZGVzaWdu 
    MRowGAYJKoZIhvcNAQkBFgt4eHhAeHh4LnhvbTCBnzANBgkqhkiG9w0BAQEFAAOB 
    jQAwgYkCgYEAuQVRVaCyF+a8/927cA9CjlrSEGOL17+Fk1U6rqZ8fJ6UR+kvhUUk 
    fgyMmzrw4bhnZlk2NV5afZEhiiNdRri9f8loklGRXRkDfmhyUWtjiFWUDtzkuQoT 
    6jhWfoqGNCKh/92cjq2wicJpp40wZGlfwTwSnmjN9/eNVwEoXigSy5ECAwEAAaOC 
    AQYwggECMAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJh 
    dGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBS+WovE66PrvCAtojYMV5pEUYZtjzCB 
    pwYDVR0jBIGfMIGcgBRpQYdVvVKZ0PXsEX8KAVNYTgt896GBgKR+MHwxCzAJBgNV 
    BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX 
    aWRnaXRzIFB0eSBMdGQxEjAQBgNVBAMTCWZvcmRlc2lnbjEhMB8GCSqGSIb3DQEJ 
    ARYSZm9yZGVpc2duQDIxY24uY29tggEAMA0GCSqGSIb3DQEBBAUAA4GBADDOp/O/ 
    o3mBZV4vc3mm2C6CcnB7rRSYEoGm6T6OZsi8mxyF5w1NOK5oI5fJU8xcf8aYFVoi 
    0i4LlsiQw+EwpnjUXfUBxp/g4Cazlv57mSS6h1t4a/BPOIwzcZGpo/R3g/fOPwsF 
    F/2RC++81s6k78iezFrTs9vnsm/G4vRjngLI 
    -----END CERTIFICATE----- 
    --- 
    Server certificate 
    subject=/C=AU/ST=Some-State/L=gz/O=ai ltd/OU=sw/CN=fordesign/ 
    [email protected] 
    issuer=/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=fordesign/ 
    [email protected] 
    --- 
    No client certificate CA names sent 
    --- 
    SSL handshake has read 1069 bytes and written 342 bytes 
    --- 
    New, TLSv1/SSLv3, Cipher is DES-CBC3-SHA 
    Server public key is 1024 bit 
    SSL-Session: 
    Protocol : SSLv3 
    Cipher : DES-CBC3-SHA 
    Session-ID: E1EC3B051F5DB8E2E3D3CD10E4C0412501DDD6641ACA932B65 
    DC25DCD0A3A86E 
    Session-ID-ctx: 
    Master-Key: 47DB3A86375DB2E99982AFD8F5B382B4316385694B01B74BFC3 
    FA26C7DBD489CABE0EE1B20CE8E95E4ABF930099084B0 
    Key-Arg : None 
    Start Time: 974010506 
    Timeout : 300 (sec) 
    Verify return code: 0 (ok) 
    --- 
    +OK AIMC POP service (sol7.gzai.com) is ready. 
    user ssltest0 
    +OK Please enter password for user <ssltest0>;. 
    pass ssltest0 
    +OK ssltest0 has 12 message (282948 octets) 
    list 
    +OK 12 messages (282948 octets) 
    1 21230 
    2 21230 
    3 21230 
    4 21230 
    5 21229 
    6 21230 
    7 21230 
    8 21230 
    9 111511 
    10 136 
    11 141 
    12 1321 
     . 
    quit 
    +OK Pop server at (sol7.gzai.com) signing off. 
    read:errno=0 
    SSL3 alert write:warning:close notify 
    --- 
    Certificate chain 
    0 s:/C=AU/ST=Some-State/L=gz/O=ai ltd/OU=sw/CN=fordesign/ 
    [email protected] 
    i:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=fordesign/ 
    [email protected] 
    -----BEGIN CERTIFICATE----- 
    MIIDdzCCAuCgAwIBAgIBATANBgkqhkiG9w0BAQQFADB8MQswCQYDVQQGEwJBVTET 
    MBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQ 
    dHkgTHRkMRIwEAYDVQQDEwlmb3JkZXNpZ24xITAfBgkqhkiG9w0BCQEWEmZvcmRl 
    aXNnbkAyMWNuLmNvbTAeFw0wMDExMTIwNjE5MDNaFw0wMTExMTIwNjE5MDNaMH0x 
    CzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMQswCQYDVQQHEwJnejEP 
    MA0GA1UEChMGYWkgbHRkMQswCQYDVQQLEwJzdzESMBAGA1UEAxMJZm9yZGVzaWdu 
    MRowGAYJKoZIhvcNAQkBFgt4eHhAeHh4LnhvbTCBnzANBgkqhkiG9w0BAQEFAAOB 
    jQAwgYkCgYEAuQVRVaCyF+a8/927cA9CjlrSEGOL17+Fk1U6rqZ8fJ6UR+kvhUUk 
    fgyMmzrw4bhnZlk2NV5afZEhiiNdRri9f8loklGRXRkDfmhyUWtjiFWUDtzkuQoT 
    6jhWfoqGNCKh/92cjq2wicJpp40wZGlfwTwSnmjN9/eNVwEoXigSy5ECAwEAAaOC 
    AQYwggECMAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJh 
    dGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBS+WovE66PrvCAtojYMV5pEUYZtjzCB 
    pwYDVR0jBIGfMIGcgBRpQYdVvVKZ0PXsEX8KAVNYTgt896GBgKR+MHwxCzAJBgNV 
    BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX 
    aWRnaXRzIFB0eSBMdGQxEjAQBgNVBAMTCWZvcmRlc2lnbjEhMB8GCSqGSIb3DQEJ 
    ARYSZm9yZGVpc2duQDIxY24uY29tggEAMA0GCSqGSIb3DQEBBAUAA4GBADDOp/O/ 
    o3mBZV4vc3mm2C6CcnB7rRSYEoGm6T6OZsi8mxyF5w1NOK5oI5fJU8xcf8aYFVoi 
    0i4LlsiQw+EwpnjUXfUBxp/g4Cazlv57mSS6h1t4a/BPOIwzcZGpo/R3g/fOPwsF 
    F/2RC++81s6k78iezFrTs9vnsm/G4vRjngLI 
    -----END CERTIFICATE----- 
    --- 
    Server certificate 
    subject=/C=AU/ST=Some-State/L=gz/O=ai ltd/OU=sw/CN=fordesign/ 
    [email protected] 
    issuer=/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=fordesign/ 
    [email protected] 
    --- 
    No client certificate CA names sent 
    --- 
    SSL handshake has read 1579 bytes and written 535 bytes 
    --- 
    New, TLSv1/SSLv3, Cipher is DES-CBC3-SHA 
    Server public key is 1024 bit 
    SSL-Session: 
    Protocol : SSLv3 
    Cipher : DES-CBC3-SHA 
    Session-ID: E1EC3B051F5DB8E2E3D3CD10E4C0412501DDD6641ACA932B65DC2 
    5DCD0A3A86E 
    Session-ID-ctx: 
    Master-Key: 47DB3A86375DB2E99982AFD8F5B382B4316385694B01B74BFC3FA 
    26C7DBD489CABE0EE1B20CE8E95E4ABF930099084B0 
    Key-Arg : None 
    Start Time: 974010506 
    Timeout : 300 (sec) 
    Verify return code: 0 (ok)


 wingger 回覆於:2005-01-10 23:51:54

openssl簡介-指令s_server
 用法: 
    
    openssl s_server [-accept port] [-context id] [-verify depth] 
    
    [-Verify depth] [-cert filename] [-key keyfile] [-dcert filename] 
    
    [-dkey keyfile] [-dhparam filename] [-nbio] [-nbio_test] [-crlf] 
    
    [-debug] [-state] [-CApath directory] [-CAfile filename] [-nocert] 
    
    [-cipher cipherlist] [-quiet] [-no_tmp_rsa] [-ssl2] [-ssl3] [-tls1] 
    
    [-no_ssl2] [-no_ssl3] [-no_tls1] [-no_dhe] [-bugs] [-hack] [-www] 
    
    [-WWW] [-engine id] 
    
    
    
    說明: 
    和s_client是反義詞, 模擬一個實現了SSL的server. 

    
    
    OPTIONS 
    -accept port 
    監聽的TCP端口。缺省爲4433. 
    -context id 
    設置SSL context的id, 可以設置爲任何值。SSL context是什麼?編程的章節會詳細介紹的。你也可以不set這個option, 有缺省的給你用的。 
    -cert certname 
    使用的證書文件名。缺省使用 ./server.pem 
    -key keyfile 
    使用的私有密鑰文件。如果沒有指定,那麼證書文件會被使用。???? 
    The private key to use. If not specified then the certificate 
    file will be used. 
    -dcert filename, -dkey keyname 
    指定一個附加的證書文件和私有密鑰文件。不同的cipher需要不同的證書和 私有密鑰文件。這個不同的cipher主要指cipher裏面的不對稱加密算法不同  比如基於RSA的cipher需要的是RSA的私有密鑰文件和證書,而基於DSA的算法  則需要的是DSA的私有密鑰文件和證書.這個option可以讓這樣我們的server同時支持倆種算法的cipher成爲可能。 
    -nocert 
    如果server不想使用任何證書,set這個option. 
    目前只有anonymous DH算法有需要這麼做。 
    -dhparam filename 
    使用的DH參數文件名。如果沒有set, 那麼server會試圖去從證書文件裏面獲得這些參數。如果證書裏面沒有這麼參數,一些hard code的參數就被調用。 
    -nodhe 
    禁止使用基於EDH的cipher. 
    -no_tmp_rsa 
    現在的出口cipher有時會使用臨時RSA密鑰。那就是說每次對話的時候臨時生成密鑰對。本optio就是用來禁止這種情況的。 
    -verify depth, -Verify depth 
    意義和s_client的這個option一樣,但同時表示必須驗證client的證書。不記得server對client的證書驗證是可以選的嗎?-verify表示向client要求證書,但client還是可以選擇不發送證書,-Verify表示一定要client的證書驗證,否則握手告吹。 
    -CApath directory 
    -CAfile file 
    -state 
    -debug 
    -nbio_test 
    -nbio 
    -crlf 
    -quiet 
    -ssl2, -ssl3, -tls1, -no_ssl2, -no_ssl3, -no_tls1 
    -bugs 
    -cipher cipherlist 
    這些option於s_client的同名option意義相同。 
    下面倆個指令模擬一個簡單的http server. 
    -www 
    當client連接上來的時候,發回一個網頁,內容就是SSL握手的一些內容。 
    -WWW 
    用來把具體某個文件當網頁發回給client的請求。比如client的URL請求是 https://myhost/page.html ,就把 ./page.html發回給client.如果沒有set -www, -WWW這倆個option, 當一個ssl client連接上來的話它所發過來的任何東西都會顯示出來,你在終端輸入的任何東西都會發回 給client.你可以通過在終端輸入的行的第一個字母控制一些行爲 
    q: 
    中斷當前連接,但不關閉server. 
    Q 
    中斷當前連接,退出程序。 
    r 
    進行renegotiate行爲。 
    R 
    進行renegotiate行爲, 並且要求client的證書 。 
    P 
    在TCP層直接送一些明文。這會使client認爲我們沒有按協議的遊戲規則進行通信而斷開連接。 
    S 
    打印出session-cache的狀態信息。session-cache在編程章節會詳細介紹。 
    NOTES 
    用於調試ssl client. 
    下一條指令用來模擬一個小的http server, 監聽443端口。 
    openssl s_server -accept 443 -www 
    session的參數可以用sess_id指令打印。 
    我對這條指令實在沒有興趣,一般使用openssl都是用做server, 沒有機會調試client.我甚至沒有用過這個指令。


 wingger 回覆於:2005-01-10 23:52:26

openssl簡介-指令sess_id

    用法: 
    
    openssl sess_id [-inform PEM|DER] [-outform PEM|DER] [-in filename] 
    
     [-out filename] [-text] [-noout] [-context ID] 
    
    
    說明: 
    本指令是處理SSL_SESSION結構的,可以打印出其中的細節。這也是一個調試工具。 

    -inform DER|PEM 
    指定輸入格式是DER還是PEM. 
    -outform DER|PEM 
    指定輸出格式是DER還是PEM 
   -in filename 
   指定輸入的含有session信息的文件名,可以通過標準輸入得到。 
   -out filename 
   指定輸出session信息的文件名 
   -text 
   打印出明文的密鑰的各個部件。 
   -cert 
   set本option將會把session中使用的證書打印出來。如果-text也被set, 那麼將會把其用文本格式打印出來。 
    -noout 
    不打印出session的編碼版本。 
    -context ID 
    設置session id. 不常用的一個option. 
    本指令的典型的輸出是: 
    SSL-Session: 
    Protocol : TLSv1 
    Cipher : 0016 
    Session-ID: 871E62626C554CE95488823752CBD5F3673A3EF3DCE9 
    C67BD916C809914B40ED 
    Session-ID-ctx: 01000000 
    Master-Key: A7CEFC571974BE02CAC305269DC59F76EA9F0B180CB66 
    42697A68251F2D2BB57E51DBBB4C7885573192AE9AEE220FACD 
    Key-Arg : None 
    Start Time: 948459261 
   Timeout : 300 (sec) 
    Verify return code 0 (ok) 
    Protocol 
    使用的協議版本信息。 
    Cipher 
    使用的cipher, 這裏是原始的SSL/TLS裏定義的代碼。 
    Session-ID 
    16進制的session id 
    Session-ID-ctx 
    session-id-ctx的16進制格式。 
    Master-Key 
    ssl session master key. 
    Key-Arg 
    key的參數,只用於SSLv2 
    Start Time 
    session開始的時間。標準的unix格式。 
    Timeout 
    session-timeout時間。 
    Verify return code 
    證書驗證返回值. 
    ssl session文件的pem標準格式的第一行和最後一行是: 
    ---BEGIN SSL SESSION PARAMETERS----- 
    -----END SSL SESSION PARAMETERS----- 
    因爲ssl session輸出包含握手的重要信息:master key, 所以一定要用一定的加密算法把起輸出加密。一般是禁止在實際應用中把session的信息輸出。我沒用過這個工具。研究source的時候這個可能有點用。


 wingger 回覆於:2005-01-10 23:53:00

openssl簡介-指令speed
用法: 
    
    openssl speed [-elapsed] [md2] [mdc2] [md5] [hmac] [sha1] [rmd160] 
    
     [idea-cbc] [rc2-cbc] [rc5-cbc] [bf-cbc] [des-cbc] [des-ede3] 
    
     [rc4] [rsa512] [rsa1024] [rsa2048] [rsa4096] [dsa512] 
    
     [dsa1024] [dsa2048] [idea] [rc2] [des] [rsa] [blowfish] 
    
     說明: 
    算法在你的機器上的測試工具。 

    
    OPTIONS 
    -elapsed 
    set了這個option將使測試結果是我們比較容易懂的時間格式,否則將是和time指令那樣子顯示的cpu時間。 
    其他的option都是算法了。


 wingger 回覆於:2005-01-10 23:53:30

openssl簡介-指令version
用法: 
    
    openssl version [-a] [-v] [-b] [-o] [-f] [-p] 
    
    
    說明: 
    用來打印版本信息的。最沒用的指令和最簡單的指令。
 
    
    OPTIONS 
    -a 
    打印所有信息, 相當於把其他option全set起來。 
    當你向openssl官方站點報bug的時候,需要把這個指令列出來的東西也告訴他們 
    -v 
    打印當前openssl的版本信息。 
    -b 
    打印當前版本的openssl是什麼時候弄出來的 
    -o 
    建立庫的時候的各種於加密算法和機器字節有關的信息。 
    -c 
    編譯時候的編譯其的參數 
    -p 
    平臺信息


 wingger 回覆於:2005-01-10 23:54:26

openssl簡介-指令x509

    用法: 
    
    openssl x509 [-inform DER|PEM|NET] [-outform DER|PEM|NET] 
    
     [-keyform DER|PEM][-CAform DER|PEM] [-CAkeyform DER|PEM] 
    
     [-in filename][-out filename] [-serial] [-hash] [-subject] 
    
     [-issuer] [-nameopt option] [-email] [-startdate] [-enddate] 
    
     [-purpose] [-dates] [-modulus] [-fingerprint] [-alias] 
    
     [-noout] [-trustout] [-clrtrust] [-clrreject] [-addtrust arg] 
    
     [-addreject arg] [-setalias arg] [-days arg] 
    
     [-signkey filename][-x509toreq] [-req] [-CA filename] 
    
     [-CAkey filename] [-CAcreateserial] [-CAserial filename] 
    
     [-text] [-C] [-md2|-md5|-sha1|-mdc2] [-clrext] 
    
     [-extfile filename] [-extensions section] 
    
    
    說明: 
    本指令是一個功能很豐富的證書處理工具。可以用來顯示證書的內容,轉換其格式,給CSR簽名等等。由於功能太多,我們按功能分成幾部分來講。 

    輸入,輸出等一些一般性的option 
    -inform DER|PEM|NET 
    指定輸入文件的格式。 
    -outform DER|PEM|NET 
    指定輸出文件格式 
    -in filename 
    指定輸入文件名 
    -out filename 
    指定輸出文件名 
    -md2|-md5|-sha1|-mdc2 
    指定使用的哈希算法。缺省的是MD5於打印有關的option 
    -text 
    用文本方式詳細打印出該證書的所有細節。 
    -noout 
    不打印出請求的編碼版本信息。 
    -modulus 
    打印出公共密鑰的係數值。沒研究過RSA就別用這個了。 
    -serial 
    打印出證書的系列號。 
    -hash 
    把證書的擁有者名稱的哈希值給打印出來。 
    -subject 
    打印出證書擁有者的名字。 
    -issuer 
    打印證書頒發者名字。 
    -nameopt option 
    指定用什麼格式打印上倆個option的輸出。 
    後面有詳細的介紹。 
    -email 
    如果有,打印出證書申請者的email地址 
    -startdate 
    打印證書的起始有效時間 
    -enddate 
    打印證書的到期時間 
    -dates 
    把上倆個option都給打印出來 
    -fingerprint 
    打印DER格式的證書的DER版本信息。 
    -C 
    用C代碼風格打印結果。 
    與證書信任有關的option 
    一個可以信任的證書的就是一個普通證書,但有一些附加項指定其可以用於哪些用途和不可以用於哪些用途, 該證書還應該有一個"別名"。 
    一般來說驗證一個證書的合法性的時候,相關的證書鏈上至少有一個證書必須是一個可以信任的證書。缺省的認爲如果該證書鏈上的Root CA的證書可以信任,那麼整條鏈上其他證書都可以用於任何用途。 
    以下的幾個option只用來驗證Root CA的證書。CA在頒發證書的時候可以控制該證書的用途,比如頒發可以用於SSL client而不能用於SSL server的證書。 
    -trustout 
    打印出可以信任的證書。 
    -setalias arg 
    設置證書別名。比如你可以把一個證書叫"fordesign's certificate", 那麼以後就可以使用這個別名來引用這個證書。 
    -alias 
    打印證書別名。 
   -clrtrust 
   清除證書附加項裏所有有關用途允許的內容。 
   -clrreject 
   清除證書附加項裏所有有關用途禁止的內容。 
   -addtrust arg 
   添加證書附加項裏所有有關用途允許的內容。 
   -addreject arg 
   添加證書附加項裏所有有關用途禁止的內容。 
   -purpose 
   打印出證書附加項裏所有有關用途允許和用途禁止的內容。 
    
與簽名有關的otpion 
    本指令可以用來處理CSR和給證書籤名,就象一個CA 
    -signkey filename 
    使用這個option同時必須提供私有密鑰文件。這樣把輸入的文件變成字簽名的證書。 
    如果輸入的文件是一個證書,那麼它的頒發者會被set成其擁有者.其他相關的項也會被改成符合自簽名特徵的證書項。 
    如果輸入的文件是CSR, 那麼就生成自簽名文件。 
    -clrext 
    把證書的擴展項刪除。 
    -keyform PEM|DER 
    指定使用的私有密鑰文件格式。 
    -days arg 
    指定證書的有效時間長短。缺省爲30天。 
    -x509toreq 
    把一個證書轉化成CSR.用-signkey指定私有密鑰文件 
    -req 
    缺省的認爲輸入文件是證書文件,set了這個option說明輸入文件是CSR. 
    -CA filename 
    指定簽名用的CA的證書文件名。 
    -CAkey filename 
    指定CA私有密鑰文件。如果這個option沒有參數輸入,那麼缺省認爲私有密鑰在CA證書文件裏有。 
    -CAserial filename 
    指定CA的證書系列號文件。證書系列號文件在前面介紹過,這裏不重複了。 
    -CAcreateserial filename 
    如果沒有CA系列號文件,那麼本option將生成一個。 
    -extfile filename 
    指定包含證書擴展項的文件名。如果沒有,那麼生成的證書將沒有任何擴展項。 
    -extensions section 
   指定文件中包含要增加的擴展項的section 
    上面倆個option有點難明白是吧?後面有舉例。 
    與名字有關的option.這些option決定證書擁有者/頒發者的打印方式。缺省方式是印在一行中。 
    這裏有必要解釋一下這個證書擁有者/頒發者是什麼回事。它不是我們常識裏的一個名字,而是一個結構,包含很多字段。 
    英文分別叫subject name/issuer name.下面是一個subject name的例子 
    subject= 
    countryName = AU 
    stateOrProvinceName = Some-State 
    localityName = gz 
    organizationName = ai ltd 
    organizationalUnitName = sw 
    commonName = fordesign 
    emailAddress = [email protected]


-nameopt 
    這個option後面的參數就是決定打印的方式,其參數有以下可選: 
    compat 
    使用以前版本的格式,等於沒有設置任何以下option 
    RFC2253 
    使用RFC2253規定的格式。 
    oneline 
    所有名字打印在一行裏面。 
   multiline 
    名字裏的各個字段用多行打印出來。 
    上面那幾個是最常用的了,下面的這些我怎麼用怎麼不對,也許以後研究source在完善這裏了。 
    esc_2253 esc_ctrl esc_msb use_quote utf8 no_type show_type dump_der 
    dump_nostr dump_all dump_unknown sep_comma_plus sep_comma_plus_space 
    sep_semi_plus_space sep_multiline dn_rev nofname, sname, lname, oid spc_eq 
    舉例時間: 
    打印出證書的內容: 
    openssl x509 -in cert.pem -noout -text 
    打印出證書的系列號 
    openssl x509 -in cert.pem -noout -serial 
    打印出證書的擁有者名字 
    openssl x509 -in cert.pem -noout -subject 
    以RFC2253規定的格式打印出證書的擁有者名字 
    openssl x509 -in cert.pem -noout -subject -nameopt RFC2253 
    在支持UTF8的終端一行過打印出證書的擁有者名字 
    openssl x509 -in cert.pem -noout -subject -nameopt oneline -nameopt -escmsb 
    打印出證書的MD5特徵參數 
    openssl x509 -in cert.pem -noout -fingerprint 
    打印出證書的SHA特徵參數 
    openssl x509 -sha1 -in cert.pem -noout -fingerprint 
    把PEM格式的證書轉化成DER格式 
    openssl x509 -in cert.pem -inform PEM -out cert.der -outform DER 
    把一個證書轉化成CSR 
    openssl x509 -x509toreq -in cert.pem -out req.pem -signkey key.pem 
    給一個CSR進行處理,頒發字簽名證書,增加CA擴展項 
    openssl x509 -req -in careq.pem -extfile openssl.cnf -extensions v3_ca -signkey key.pem -out cacert.pem 
    給一個CSR簽名,增加用戶證書擴展項 
    openssl x509 -req -in req.pem -extfile openssl.cnf -extensions v3_usr -CA cacert.pem -CAkey key.pem -CAcreateserial 
    把某證書轉化成用於SSL client可信任證書, 增加別名alias 
    openssl x509 -in cert.pem -addtrust sslclient -alias "Steve's Class 1 CA" -out trust.pem 
    上面有很多地方涉及到證書擴展/證書用途,這裏解釋一下: 
   我們知道一個證書是包含很多內容的,除了基本的那幾個之外,還有很多擴展的項。比如證書用途,其實也只是證書擴展項中的一個。 
    我們來看看一個CA證書的內容: 
    openssl x509 -in ca.crt -noout -text 
    Certificate: 
    Data: 
    Version: 3 (0x2) 
    Serial Number: 0 (0x0) 
    Signature Algorithm: md5WithRSAEncryption 
    Issuer: C=AU, ST=Some-State, O=Internet Widgits Pty Ltd, 
    CN=fordesign/[email protected] 
    Validity 
    Not Before: Nov 9 04:02:07 2000 GMT 
    Not After : Nov 9 04:02:07 2001 GMT 
    Subject: C=AU, ST=Some-State, O=Internet Widgits Pty Ltd, 
    CN=fordesign/[email protected] 
    Subject Public Key Info: 
    Public Key Algorithm: rsaEncryption 
    RSA Public Key: (1024 bit) 
    Modulus (1024 bit): 
    00:e7:62:1b:fb:78:33:d7:fa:c4:83:fb:2c:65:c1: 
    08:03:1f:3b:79:b9:66:bb:31:aa:77:d4:47:ac:be: 
    e5:20:ce:ed:1f:b2:b5:4c:79:c9:9b:ad:1d:0b:7f: 
    84:49:03:6b:79:1a:fd:05:ca:36:b3:90:b8:5c:c0: 
    26:93:c0:02:eb:78:d6:8b:e1:91:df:85:39:33:fc: 
    3d:59:e9:7f:58:34:bf:be:ef:bd:22:a5:be:26:c0: 
    16:9b:41:36:45:05:fe:f9:b2:05:42:04:c9:3b:28: 
    c1:0a:48:f4:c7:d6:a8:8c:f9:2c:c1:1e:f5:8b:dc: 
    19:59:7c:47:f7:91:cc:5d:75 
    Exponent: 65537 (0x10001) 
    X509v3 extensions: 
    X509v3 Subject Key Identifier: 
    69:41:87:55:BD:52:99:D0:F5:EC:11:7F:0A:01:53:58:4E:0B:7C:F7 
    X509v3 Authority Key Identifier: 
    keyid:69:41:87:55:BD:52:99:D0:F5:EC:11:7F:0A:01:53:58: 
    4E:0B:7C:F7 
    DirName:/C=AU/ST=Some-State/O=Internet Widgits Pty 
    Ltd/CN=fordesign/[email protected] 
    serial:00 
    X509v3 Basic Constraints: 
    CA:TRUE 
    Signature Algorithm: md5WithRSAEncryption 
    79:14:99:4a:8f:64:63:ab:fb:ad:fe:bc:ba:df:53:97:c6:92: 
    41:4d:de:fc:59:98:39:36:36:8e:c6:05:8d:0a:bc:49:d6:20: 
    02:9d:a2:5f:0f:03:12:1b:f2:af:23:90:7f:b1:6a:86:e8:3e: 
    0b:2c:fd:11:89:86:c3:21:3c:25:e2:9c:de:64:7a:14:82:32: 
    22:e1:35:be:39:90:f5:41:60:1a:77:2e:9f:d9:50:f4:81:a4: 
    67:b5:3e:12:e5:06:da:1f:d9:e3:93:2d:fe:a1:2f:a9:f3:25: 
    05:03:00:24:00:f1:5d:1f:d7:77:8b:c8:db:62:82:32:66:fd: 
    10:fa 
    是否看到我們先提到過的subject name/issuer name.本證書中這倆個字段是一樣的,明顯是自簽名證書,是一個Root CA的證書。從X509v3 extension開始就是證書擴展項了。 
    這裏有個X509v3 Basic constraints. 裏面的CA字段決定該證書是否可以做CA的證書,這裏是TURE。如果這個字段沒有,那麼會根據其他內容決定該證書是否可以做CA證書。 
    如果是X509v1證書,又沒有這個擴展項,那麼只要subject name和issuer name相同,就認爲是Root CA證書了。 
    本例的證書沒有證書用途擴展項,它是一個叫keyUseage的字段。 
    舉個例子就可以看出該字段目前可以有以下值 
    openssl x509 -purpose -in server.crt 
    Certificate purposes: 
    SSL client : Yes 
    SSL client CA : No 
    SSL server : Yes 
    SSL server CA : No 
    Netscape SSL server : Yes 
    Netscape SSL server CA : No 
    S/MIME signing : Yes 
     S/MIME signing CA : No 
    S/MIME encryption : Yes 
     S/MIME encryption CA : No 
     CRL signing : Yes 
    CRL signing CA : No 
    Any Purpose : Yes 
    Any Purpose CA : Yes 
    SSL Client 
    SSL Client CA 
    
    每個值的具體意義應該可以看名字就知道了吧? 
    X509指令在轉化證書成CSR的時候沒有辦法把證書裏的擴展項轉化過去給CSR簽名做證書的時候,如果使用了多個option,應該自己保證這些option沒有衝突。

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