歡迎您光臨本站 註冊首頁

openssl的man中文文檔(轉)

←手機掃碼閱讀     火星人 @ 2014-03-04 , reply:0

openssl的man中文文檔(轉)

    標 題: openssl簡介--前言
   
    發信站: BBS 水木清華站 (Fri Nov 10 20:19:30 2000)  
   
   
    不久前接到有關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
《解決方案》

openssl的man中文文檔(轉)

標題:openssl簡介--證書

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

引用請指明原作譯者fordesign@21cn.com

二證書


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

證書用來保證不對稱加密演算法的合理性。想想吧,如果沒有證書記錄,那麼假設某倆人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的時候重複送自己的證書了。
《解決方案》

openssl的man中文文檔(轉)

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

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

引用請指明原作/譯者fordesign@21cn.com


一加密演算法的一些常識


要理解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。

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

openssl的man中文文檔(轉)

標題:openssl簡介--協議

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

引用請指明原作/譯者fordesign@21cn.com


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是怎麼對付這種人的我還沒看出來。有篇文章說:多放點隨機數在信息里可以對付,我也沒去研究這句話是什麼意思。
《解決方案》

openssl的man中文文檔(轉)

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的指令繁多,就象天上的星星。慢慢一個一個解釋吧。
《解決方案》

openssl的man中文文檔(轉)

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
    應用程序驗證出錯。
《解決方案》

openssl的man中文文檔(轉)

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的內容,是二進位來的,看不懂的。
《解決方案》

openssl的man中文文檔(轉)

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有關的,
    由於我們對這個沒有興趣,所以這倆大類不做翻譯和解釋。
《解決方案》

openssl的man中文文檔(轉)

openssl簡介-指令cipher
說明:cipher就是加密演算法的意思。ssl的cipher主要是對稱加密演算法和不對稱加密演算法的組合。 本指令是用來展示用於SSL加密演算法的工具。它能夠把所有openssl支持的加密演算法按照一定規律排列(一般是加密強度)。這樣可以用來做測試工具,決定使用什麼加密演算法。
   
   
    用法:
    openssl ciphers [-v] [-ssl2] [-ssl3] [-tls1]
        
    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'
《解決方案》

openssl的man中文文檔(轉)

openssl簡介-指令dgst
用法:
   
    openssl dgst [-c] [-d]
   
    說明:這個指令可以用來哈希某個文件內容的,以前的版本還可以用來做數字簽名和認證。這個工具本來有很多選項的,可是不知道為什麼,現在版本的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

[火星人 ] openssl的man中文文檔(轉)已經有1913次圍觀

http://coctec.com/docs/service/show-post-12236.html