<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    心有多大舞臺便有多大

    Embrace changes, pursue excellence, share niceness.

    (轉載)openssl的man中文文檔

    發信站: BBS 水木清華站 (Fri Nov 10 20:19:30 2000)  [/b:631992e780]
        
        
        不久前接到有關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
    [b:2f84c104e9]標題:openssl簡介--證書[/b:2f84c104e9]

    [b:2f84c104e9]發信站:BBS水木清華站(FriNov1020:29:282000)

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

    二證書[/b:2f84c104e9]


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

    證書用來保證不對稱加密算法的合理性。想想吧,如果沒有證書記錄,那么假設某倆人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
    [b:242ac5a08e]標題:openssl簡介--加密算法

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

    引用請指明原作/譯者fordesign@21cn.com[/b:242ac5a08e]


    一加密算法的一些常識


    要理解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
    [b:05702c99bc]標題:openssl簡介--協議

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

    引用請指明原作/譯者fordesign@21cn.com[/b:05702c99bc]


    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
    [b:258940505f]openssl簡介-指令 verify
    用法: 
        
        openssl verify 【-CApath directory】 【-CAfile file】 【-purpose purpose】【-untrusted file】 【-help】 【-issuer_checks】 【-verbose】  【-】 【certificates】 
        
         說明: 
        
         證書驗證工具。 [/b:258940505f]
         
        選項 
         -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
    [b:710d397eff]openssl簡介-指令asn1parse

         用法:openssl asn1parse [-inform PEM|DER] [-in filename] [-out filename] 
        
         [-noout] [-offset number] [-length number] [-i] [- structure filename] 
        
         [-strparse offset] 
        
    用途:一個診斷工具,可以對ASN1結構的東東進行分析。[/b:710d397eff] 
        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
    [b:f3a6bcf2f5]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] [/b:f3a6bcf2f5]
         哇噻,好復雜也。不過用過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
    [b:75001d2270]openssl簡介-指令cipher
    說明:cipher就是加密算法的意思。ssl的cipher主要是對稱加密算法和不對稱加密算法的組合。 本指令是用來展示用于SSL加密算法的工具。它能夠把所有openssl支持的加密算法按照一定規律排列(一般是加密強度)。這樣可以用來做測試工具,決定使用什么加密算法。 
        
        
        用法: 
        openssl ciphers [-v] [-ssl2] [-ssl3] [-tls1] [cipherlist] 
            
        COMMAND OPTIONS 
        -v 
        詳細列出所有符合的cipher的所有細節。列出該cipher使用的ssl的版本,公共密鑰交換算法,身份驗證方法,對稱加密算法以及哈希算法。還列出該算法是否可以出口。[/b:75001d2270] 
        算法出口? 趁這個機會可以給大家來點革命教育。米國的加密算法研究是世界上最先進的,其國家安全局(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
    [b:a33ea4edd2]openssl簡介-指令dgst
    用法: 
        
        openssl dgst [md5|md2|sha1|sha|mdc2|ripemd160] [-c] [-d] [file...] 
        
        說明:這個指令可以用來哈希某個文件內容的,[/b:a33ea4edd2]以前的版本還可以用來做數字簽名和認證。這個工具本來有很多選項的,可是不知道為什么,現在版本的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
    [b:02e2b109b9]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的參數文件。 [/b:02e2b109b9]
        
        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
    [b:5c505c4c1d]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編碼。 [/b:5c505c4c1d]
        
        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
    [b:3ff9640d43]openssl簡介-指令gendsa
     
        用法: 
        
        openssl gendsa [-out filename] [-des] [-des3] [-idea] 
        
        [-rand file(s)] [paramfile] 
        
         
            
        描述: 
        
        本指令由DSA參數來產生DSA的一對密鑰。dsa參數可以用dsaparam來產生。[/b:3ff9640d43] 
        
        OPTIONS 
        -des|-des3|-idea 
        采用什么加密算法來加密我們的密鑰。一般會要你輸入保護密碼。 
        如果這三個中一個也沒set, 我們的密鑰將不被加密而輸入。 
        -rand file(s) 
        產生key的時候用過seed的文件,可以把多個文件用冒號分開一起做seed. 
        paramfile 
        指定使用的DSA參數文件。

     wingger 回復于:2005-01-10 23:46:22
    [b:e2fe605c7d]openssl簡介-指令genrsa
     
        用法: 
        
        openssl genrsa [-out filename] [-passout arg] [-des] [-des3] [-idea] 
        
        [-f4] [-3] [-rand file(s)] [numbits] 
        
         
        DESCRIPTION 
        生成RSA私有密鑰的工具。[/b:e2fe605c7d] 
        
        
        OPTIONS 
        -out filename 
        私有密鑰輸入文件名,缺省為標準輸出。 
        the output filename. If this argument is not specified then standard output is uused. 
        -passout arg 
        參看指令dsa里面的passout參數說明 
        -des|-des3|-idea 
        采用什么加密算法來加密我們的密鑰。一般會要你輸入保護密碼。 
        如果這三個中一個也沒set, 我們的密鑰將不被加密而輸入。 
        -F4|-3 
        使用的公共組件,一種是3, 一種是F4, 我也沒弄懂這個option是什么意思。 
        -rand file(s) 
        產生key的時候用過seed的文件,可以把多個文件用冒號分開一起做seed. 
        numbits 
        指明產生的參數的長度。必須是本指令的最后一個參數。如果沒有指明,則產生512bit長的參數。 
        研究過RSA算法的人肯定知道,RSA的私有密鑰其實就是三個數字,其中倆個是質數。這倆個呢,就叫prime numbers.產生RSA私有密鑰的關鍵就是產生這倆。還有一些其他的參數,引導著整個私有密鑰產生的過程。因為產生私有密鑰過程需要很多隨機數,這個過程的時間是不固定的。 
        產生prime numbers的算法有個bug, 它不能產生短的primes. key的bits起碼要有64位。一般我們都用1024bit的key.

     wingger 回復于:2005-01-10 23:46:59
    [b:da40679049]openssl簡介-指令passwd
     
        SYNOPSIS 
        
        openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] 
        
        [-quiet] [-table] {password} 
        
         
        
        說明: 
        本指令計算用來哈希某個密碼,也可以用來哈希文件內容。[/b:da40679049] 
        本指令支持三種哈希算法: 
        UNIX系統的標準哈希算法(crypt) 
        MD5-based BSD(1) 
        
        OPTIONS 
       -crypt -1 -apr1 
        這三個option中任意選擇一個作為哈希算法,缺省的是-crypt 
        -salt string 
        輸入作為salt的字符串。 
        -in file 
        要哈希的文件名稱 
        -stdin 
        從標準輸入讀入密碼 
        -quiet 
        當從標準輸入讀密碼,輸入的密碼太長的時候,程序將自動解短它。這個option的 
        set將不在情況下發出警告。 
        -table 
        在輸出列的時候,先輸出明文的密碼,然后輸出一個TAB,再輸出哈希值. 
        舉例時間: 
        openssl passwd -crypt -salt xx password xxj31ZMTZzkVA. 
        openssl passwd -1 -salt xxxxxxxx password $1$xxxxxxxx$8XJIcl6ZXqBMCK0qFevqT1. 
        openssl passwd -apr1 -salt xxxxxxxx password $apr1$xxxxxxxx$dxHfLAsjHkDRmG83UXe8K0

     wingger 回復于:2005-01-10 23:47:31
    [b:6d30603c82]openssl簡介-指令pkcs7
      用法: 
        openssl pkcs7 [-inform PEM|DER] [-outform PEM|DER] [-in filename] 
        
        [-out filename] [-print_certs] [-text] [-noout] 
        
        
        說明: 
        處理PKCS#7文件的工具, [/b:6d30603c82]
        
        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
    [b:55d4e97ab2] openssl簡介-指令rand
     
        用法: 
        
        openssl rand [-out file] [-rand file(s)] [-base64] num 
        
            
        描述: 
        用來產生偽隨機字節. 隨機數字產生器需要一個seed, 先已經說過了,在沒有/dev/srandom系統下的解決方法是自己做一個~/.rnd文件.如果該程序能讓隨機數字產生器很滿意的被seeded,程序寫回一些怪怪的東西回該文件. [/b:55d4e97ab2]
        
        OPTIONS 
       -out file 
       輸出文件. 
       -rand file(s) 
       產生隨機數字的時候用過seed的文件,可以把多個文件用冒號分開一起做seed. 
       -base64 
       對產生的東西進行base64編碼 
       num 
      指明產生多少字節隨機數.

     wingger 回復于:2005-01-10 23:48:58
    [b:866f672f5a]openssl簡介-指令req
     
        用法: 
        
        openssl req [-inform PEM|DER] [-outform PEM|DER] [-in filename] 
        
        [-passin arg] [-out filename] [-passout arg] [-text] [-noout] 
        
        [-verify] [-modulus] [-new] [-rand file(s)] [-newkey rsa:bits] 
        
        [-newkey dsa:file] [-nodes] [-key filename] [-keyform PEM|DER] 
        
        [-keyout filename] [-[md5|sha1|md2|mdc2]] [-config filename] 
        
        [-x509] [-days n] [-asn1-kludge] [-newhdr] [-extensions section] 
        
        [-reqexts section] 
        
         描述: 
        本指令用來創建和處理PKCS#10格式的證書.它還能夠建立自簽名證書,做Root CA. [/b:866f672f5a]
             
        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 
        emailAddress=someone@somewhere.org 
        就說只包括了字段和值。這樣子可以可以讓其他外部程序生成一個摸板文件,包含所有字段和值, 把這些值提出來.等下舉例時間會有詳細說明.如果prompt沒有被set成no, 那么這個section的格式則如下: 
        fieldName="please input ur name" 
        
         fieldName_default="fordesign" 
        
         fieldName_min= 3 
        
         fieldName_max= 18 
        
        "fieldname"就是字段名, 比如commonName(或者CN). fieldName(本例中是"prompt")是用來提示用戶輸入相關的資料的.如果用戶什么都不輸, 那么就使用確省值.如果沒有缺省值, 那么該字段被忽略.用戶如果輸入 '.' ,也可以讓該字段被忽略. 
        用戶輸入的字節數必須在fieldName_min和fieldName_max之間. 不同的section還可能對輸入的字符有特殊規定,比如必須是可打印字符.那么在本例里面, 程序的表現將如下: 
        首先把fieldName打印出來給用戶以提示 
        please input ur name: 
        之后如果用戶必須輸入3到18之間的一個長度的字符串, 如果用戶什么也不輸入,那么就把fieldName_default里面的值"fordesign"作為該字段的值添入. 
        有的字段可以被重復使用.這就產生了一個問題, config文件是不允許同樣的section文件里面有多于一個的相同的key的.其實這很容易解決,比如把它們的名字分別叫做 "1.organizationName", "2.organizationName" 
        openssl在編譯的時候封裝了最必須的幾個字段, 比如commonName, countryName, localityName, organizationName,organizationUnitName, stateOrPrivinceName還增加了emailAddress surname, givenName initials 和 dnQualifier. 
        舉例時間: 
        就使用確省值.如果沒有缺省值, 那么該字段被忽略.用戶如果輸入 '.' ,也可以讓該字段被忽略.用戶輸入的字節數必須在fieldName_min和fieldName_max之間. 不同的section還可能對輸入的字符有特殊規定,比如必須是可打印字符.那么在本例里面, 程序的表現將如下: 
        首先把fieldName打印出來給用戶以提示 
        please input ur name: 
        之后如果用戶必須輸入3到18之間的一個長度的字符串, 如果用戶什么也不輸入,那么就把fieldName_default里面的值"fordesign"作為該字段的值添入. 
        有的字段可以被重復使用.這就產生了一個問題, config文件是不允許同樣的section文件里面有多于一個的相同的key的.其實這很容易解決,比如把它們的名字分別叫做 "1.organizationName", "2.organizationName" openssl在編譯的時候封裝了最必須的幾個字段,比如commonName,countryName,localityName, organizationName,organizationUnitName, stateOrPrivinceName還增加了emailAddress surname, givenName initials 和 dnQualifier. 
        舉例時間: 
        Examine and verify certificate request: 
        檢查和驗證CSR文件. 
        openssl req -in req.pem -text -verify -noout 
        做自己的私有密鑰文件, 然后用這個文件生成CSR文件. 
        openssl genrsa -out key.pem 1024 
        openssl req -new -key key.pem -out req.pem 
        也可以一步就搞定: 
        openssl req -newkey rsa:1024 -keyout key.pem -out req.pem 
        做一個自簽名的給Root CA用的證書: 
        openssl req -x509 -newkey rsa:1024 -keyout key.pem -out crt.pem 
        下面是與本指令有關的config文件中相關的部分的一個例子: 
        [ req ] 
        default_bits = 1024 
        default_keyfile = privkey.pem 
        distinguished_name = req_distinguished_name 
        attributes = req_attributes 
        x509_extensions = v3_ca 
        dirstring_type = nobmp 
        [ req_distinguished_name ] 
        countryName = Country Name (2 letter code) 
        countryName_default = AU 
        countryName_min = 2 
        countryName_max = 2 
        localityName = Locality Name (eg, city) 
        organizationalUnitName = Organizational Unit Name (eg, section) 
        commonName = Common Name (eg, YOUR name) 
        commonName_max = 64 
        emailAddress = Email Address 
        emailAddress_max = 40 
        [ req_attributes ] 
        challengePassword = A challenge password 
        challengePassword_min = 4 
        challengePassword_max = 20 
         [ v3_ca ] 
         subjectKeyIdentifier=hash 
        authorityKeyIdentifier=keyid:always,issuer:always 
        basicConstraints = CA:true 
        RANDFILE = $ENV::HOME/.rnd 
        [ req ] 
        default_bits = 1024 
        default_keyfile = keyfile.pem 
        distinguished_name = req_distinguished_name 
        attributes = req_attributes 
        prompt = no 
        output_password = mypass 
        [ req_distinguished_name ] 
        C = GB 
        ST = Test State or Province 
        L = Test Locality 
        O = Organization Name 
        OU = Organizational Unit Name 
        CN = Common Name 
        emailAddress = test@email.address 
        [ req_attributes ] 
        challengePassword = A challenge password 
        一般的PEM格式的CSR文件的開頭和結尾一行如下 
        -----BEGIN CERTIFICATE REQUEST---- 
        -----END CERTIFICATE REQUEST---- 
        但個把變態軟件和CA硬是需要CSR的文件要這樣子: 
        -----BEGIN NEW CERTIFICATE REQUEST---- 
        -----END NEW CERTIFICATE REQUEST---- 
        用-newhdr就可以啦, 或者你自己手工加也中.openssl對倆種格式都承認. 
        openssl的config文件也可以用環境變量OPENSSL_CONF或者SSLEAY_CONF來指定.

     wingger 回復于:2005-01-10 23:49:37
    [b:ac3cf3a933]openssl簡介-指令rsa
        用法 
        
        openssl rsa [-inform PEM|NET|DER] [-outform PEM|NET|DER] [-in filename] 
        
        [-passin arg] [-out filename] [-passout arg] [-sgckey] [-des] [-des3] 
        
        [-idea] [-text] [-noout] [-modulus] [-check] [-pubin] [-pubout] 
        
        
        說明: 
       rsa指令專門處理RSA密鑰.其實其用法和dsa的差不多. [/b:ac3cf3a933]
        
        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
    [b:86b8dd1e33]openssl簡介-指令rsautl
        用法: 
        
        openssl rsautl [-in file] [-out file] [-inkey file] [-pubin] [-certin] 
        
        [-sign] [-verify] [-encrypt] [-decrypt] [-pkcs] [-ssl] [-raw] [-hexdump] 
        
        [-asn1parse] 
        
         
        描述: 
        本指令能夠使用RSA算法簽名,驗證身份, 加密/解密數據。[/b:86b8dd1e33] 
        
        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
    [b:255918d001]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很有用。 [/b:255918d001]
        
        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=xxx@xxx.xom 
        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=xxx@xxx.xom 
        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=xxx@xxx.xom 
        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=xxx@xxx.xom 
        i:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=fordesign/ 
        Email=fordeisgn@21cn.com 
        ----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=xxx@xxx.xom 
        issuer=/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=fordesign/ 
        Email=fordeisgn@21cn.com 
        --- 
        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=xxx@xxx.xom 
        i:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=fordesign/ 
        Email=fordeisgn@21cn.com 
        -----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=xxx@xxx.xom 
        issuer=/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=fordesign/ 
        Email=fordeisgn@21cn.com 
        --- 
        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
    [b:9bb4dda710]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. [/b:9bb4dda710]
        
        
        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
    [b:bd4a94ad46]openssl簡介-指令sess_id

        用法: 
        
        openssl sess_id [-inform PEM|DER] [-outform PEM|DER] [-in filename] 
        
         [-out filename] [-text] [-noout] [-context ID] 
        
        
        說明: 
        本指令是處理SSL_SESSION結構的,可以打印出其中的細節。這也是一個調試工具。 [/b:bd4a94ad46]
        -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
    [b:739ad57266]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] 
        
         說明: 
        算法在你的機器上的測試工具。 [/b:739ad57266]
        
        OPTIONS 
        -elapsed 
        set了這個option將使測試結果是我們比較容易懂的時間格式,否則將是和time指令那樣子顯示的cpu時間。 
        其他的option都是算法了。

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

     wingger 回復于:2005-01-10 23:54:26
    [b:92d418ddf0]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簽名等等。由于功能太多,我們按功能分成幾部分來講。 [/b:92d418ddf0]
        輸入,輸出等一些一般性的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 = xxx@xxx.xom


    -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=fordeisgn@21cn.com 
        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=fordeisgn@21cn.com 
        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=fordeisgn@21cn.com 
        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沒有沖突。

    posted on 2008-04-25 10:07 pony 閱讀(3583) 評論(0)  編輯  收藏 所屬分類: 轉載的文章

    主站蜘蛛池模板: 美女羞羞视频免费网站| 亚洲日韩中文无码久久| 亚洲免费在线观看视频| 一级毛片免费视频| 亚洲国产二区三区久久| 久久精品国产这里是免费| 亚洲第一AV网站| 99在线视频免费观看| 亚洲国产精品国自产拍AV| 久久免费高清视频| 日韩精品一区二区亚洲AV观看| 污视频在线免费观看| 亚洲精品视频在线播放| 久草视频在线免费| 456亚洲人成影院在线观| 在线观看无码AV网站永久免费| 亚洲综合色一区二区三区| 国产色爽免费视频| a级毛片免费观看网站| 亚洲一区二区三区在线观看精品中文| 国产精品免费久久久久电影网| 亚洲精品国产精品乱码不99| 免费播放一区二区三区| 亚洲AV无码久久久久网站蜜桃| 午夜dj免费在线观看| igao激情在线视频免费| 午夜影视日本亚洲欧洲精品一区| 91免费国产在线观看| 亚洲av无码无线在线观看 | 国产一级a毛一级a看免费视频| 亚洲乱码国产乱码精品精| 91精品免费久久久久久久久| 亚洲色精品三区二区一区| 亚洲视频在线一区二区| 美女内射无套日韩免费播放| 亚洲一本一道一区二区三区| 亚洲国产精品人人做人人爱| 日韩插啊免费视频在线观看| 亚洲AV无码专区在线观看成人| 国产l精品国产亚洲区在线观看| 在线观看日本免费a∨视频|