openssl的man中文文档(转)

openssl简介-指令s_client
  
    用法:
   
    openssl s_client [-connect host:port>;] [-verify depth] [-cert filename]
   
    [-key filename] [-CApath directory] [-CAfile filename] [-reconnect]
   
    [-pause] [-showcerts] [-debug] [-nbio_test] [-state] [-nbio] [-crlf]
   
    [-ign_eof] [-quiet] [-ssl2] [-ssl3] [-tls1] [-no_ssl2] [-no_ssl3]
   
    [-no_tls1] [-bugs] [-cipher cipherlist]
   
    描述:
    用于模拟一个普通的SSL/TLS client, 对于调试和诊断SSL server很有用。
   
    OPTIONS
    -connect host:port
    这个不用解释了吧, 连接的ip:port.
    -cert certname
    使用的证书文件。如果server不要求要证书,这个可以省略。
    -key keyfile
    使用的私有密钥文件
    -verify depth
    指定验证深度。记得CA也是分层次的吧?如果对方的证书的签名CA不是Root CA,那么你可以再去验证给该CA的证书签名的CA, 一直到Root CA. 目前的验证操作即使这条CA链上的某一个证书验证有问题也不会影响对更深层的CA的身份的验证。所以整个CA链上的问题都可以检查出来。当然CA的验证出问题并不会直接造成连接马上断开,好的应用程序可以让你根据验证结果决定下一步怎么走。
    -CApath directory
    一个目录。里面全是CA的验证资料,该目录必须是"哈希结构". verify指令里会详细说明。在建立client的证书链的时候也有用到这个指令。
    -CAfile file
    某文件,里面是所有你信任的CA的证书的内容。当你要建立client的证书链的时候也需要用到这个文件。
    -reconnect
    使用同样的session-id连接同一个server五次,用来测试server的session缓冲功能是否有问题。
    -pause
    每次读写操作后都挺顿一秒。
    -showcerts
    显示整条server的证书的CA的证书链。否则只显示server的证书。
    -prexit
    当程序退出的时候打印session的信息。即使连接失败,也会打印出调试信息。一般如果连接成功的话,调试信息将只被打出来一次。本option比较有用,因为在一次SSL连接中,cipher也可能改变,或者连接可能失败。要注意的是:有时候打印出来的东西并不一定准确。(这样也行??eric, 言重了.)
    -state
    打印SSL session的状态, ssl也是一个协议,当然有状态。
    -debug
    打印所有的调试信息。
    -nbio_test
    检查非阻塞socket的I/O运行情况。
    -nbio
    使用非阻塞socket
    -crlf
    回把你在终端输入的换行回车转化成/r/n送出去。
    -ign_eof
   当输入文件到达文件尾的时候并不断开连接。
   -quiet
   不打印出session和证书的信息。同时会打开-ign_eof这个option.
   -ssl2, -ssl3, -tls1, -no_ssl2, -no_ssl3, -no_tls1
   选择用什么版本的协议。很容易理解,不用多解释了吧。
   注意,有些很古老的server就是不能处理TLS1, 所以这个时候要关掉TLS1.n.
   -bugs
   SSL/TLS有几处众所周知的bug, set了这个option使出错的可能性缩小。
   -cipher cipherlist
   由我们自己来决定选用什么cipher,尽管是由server来决定使用什么cipher,但它一般都会采用我们送过去的cipher列表里的第一个cipher.
    有哪些cipher可用?指令cipher对这个解释的更清楚。
    一旦和某个SSL server建立连接之后,所有从server得到的数据都会被打印出来,所有你在终端上输入的东西也会被送给server. 这是人机交互式的。这时候不能set -quiet和 -ign_eof这俩个option。如果输入的某行开头字母是R,那么在这里session会renegociate, 如果输入的某行开头是Q, 那么连接会被断开。你完成整个输入之后连接也会被断开。
    If a connection is established with an SSL server then any data received from the server is displayed and any key presses will be sent to the server. When used interactively (which means neither -quiet nor -ign_eof have been given), the session will be renegociated if the line begins with an R, and if the line begins with a Q or if end of file is reached, the connection will be closed down.
    本指令主要是来debug一个SSL server的。如果想连接某个SSL HTTP server,输入下一条指令:
   openssl s_client -connect servername:443
   如果连接成功,你可以用HTTP的指令,比如"GET /"什么的去获得网页了。
    如果握手失败,原因可能有以下几种:
    1. server需要验证你的证书,但你没有证书
    2.如果肯定不是原因1, 那么就慢慢一个一个set以下几个option
    -bugs, -ssl2, -ssl3, -tls1, -no_ssl2, -no_ssl3, -no_tls1
    这可能是因为对方的server处理SSL有bug.
    有的时候,client会报错:没有证书可以使用,或者供选择的证书列表是空的。这一般是因为Server没有把给你签名的CA的名字列进它自己认为可以信任的CA列表,你可以用检查一下server的信任CA列表。有的http server只在 client给出了一个URL之后才验证client的证书,这中情况下要set -prexit这个option, 并且送给server一个页面请求。
    即使使用-cert指明使用的证书,如果server不要求验证client的证书,那么该证书也不会被验证。所以不要以为在命令行里加了-cert 的参数又连接成功就代表你的证书没有问题。
    如果验证server的证书没有问题,就可以set -showcerts来看看server的证书的CA链了。
    其实这个工具并不好用, 自己写一个client的会方便很多。
    举例时间:
    注意,中间的pop3协议的指令是我通过终端输入的。其他都是程序输出的对话
    过程。具体的每行意义不用解释了。


openssl s_client -key server.key -verify 1 -showcerts -prexit -state \
    -crlf -connect 127.0.0.1:5995
    verify depth is 1
    CONNECTED(00000003)
    SSL_connect:before/connect initialization
    SSL_connect:SSLv2/v3 write client hello A
    SSL_connect:SSLv3 read server hello A
    depth=0 /C=AU/ST=Some-State/L=gz/O=ai ltd/OU=sw/CN=fordesign/
    Email=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)
openssl简介-指令s_server
用法:
   
    openssl s_server [-accept port] [-context id] [-verify depth]
   
    [-Verify depth] [-cert filename] [-key keyfile] [-dcert filename]
   
    [-dkey keyfile] [-dhparam filename] [-nbio] [-nbio_test] [-crlf]
   
    [-debug] [-state] [-CApath directory] [-CAfile filename] [-nocert]
   
    [-cipher cipherlist] [-quiet] [-no_tmp_rsa] [-ssl2] [-ssl3] [-tls1]
   
    [-no_ssl2] [-no_ssl3] [-no_tls1] [-no_dhe] [-bugs] [-hack] [-www]
   
    [-WWW] [-engine id]
   
   
   
    说明:
    和s_client是反义词, 模拟一个实现了SSL的server.
   
   
    OPTIONS
    -accept port
    监听的TCP端口。缺省为4433.
    -context id
    设置SSL context的id, 可以设置为任何值。SSL context是什么?编程的章节会详细介绍的。你也可以不set这个option, 有缺省的给你用的。
    -cert certname
    使用的证书文件名。缺省使用 ./server.pem
    -key keyfile
    使用的私有密钥文件。如果没有指定,那么证书文件会被使用。????
    The private key to use. If not specified then the certificate
    file will be used.
    -dcert filename, -dkey keyname
    指定一个附加的证书文件和私有密钥文件。不同的cipher需要不同的证书和 私有密钥文件。这个不同的cipher主要指cipher里面的不对称加密算法不同  比如基于RSA的cipher需要的是RSA的私有密钥文件和证书,而基于DSA的算法  则需要的是DSA的私有密钥文件和证书.这个option可以让这样我们的server同时支持俩种算法的cipher成为可能。
    -nocert
    如果server不想使用任何证书,set这个option.
    目前只有anonymous DH算法有需要这么做。
    -dhparam filename
    使用的DH参数文件名。如果没有set, 那么server会试图去从证书文件里面获得这些参数。如果证书里面没有这么参数,一些hard code的参数就被调用。
    -nodhe
    禁止使用基于EDH的cipher.
    -no_tmp_rsa
    现在的出口cipher有时会使用临时RSA密钥。那就是说每次对话的时候临时生成密钥对。本optio就是用来禁止这种情况的。
    -verify depth, -Verify depth
    意义和s_client的这个option一样,但同时表示必须验证client的证书。不记得server对client的证书验证是可以选的吗?-verify表示向client要求证书,但client还是可以选择不发送证书,-Verify表示一定要client的证书验证,否则握手告吹。
    -CApath directory
    -CAfile file
    -state
    -debug
    -nbio_test
    -nbio
    -crlf
    -quiet
    -ssl2, -ssl3, -tls1, -no_ssl2, -no_ssl3, -no_tls1
    -bugs
    -cipher cipherlist
    这些option于s_client的同名option意义相同。
    下面俩个指令模拟一个简单的http server.
    -www
    当client连接上来的时候,发回一个网页,内容就是SSL握手的一些内容。
    -WWW
    用来把具体某个文件当网页发回给client的请求。比如client的URL请求是 https://myhost/page.html ,就把 ./page.html发回给client.如果没有set -www, -WWW这俩个option, 当一个ssl client连接上来的话它所发过来的任何东西都会显示出来,你在终端输入的任何东西都会发回 给client.你可以通过在终端输入的行的第一个字母控制一些行为
    q:
    中断当前连接,但不关闭server.
    Q
    中断当前连接,退出程序。
    r
    进行renegotiate行为。
    R
    进行renegotiate行为, 并且要求client的证书 。
    P
    在TCP层直接送一些明文。这会使client认为我们没有按协议的游戏规则进行通信而断开连接。
    S
    打印出session-cache的状态信息。session-cache在编程章节会详细介绍。
    NOTES
    用于调试ssl client.
    下一条指令用来模拟一个小的http server, 监听443端口。
    openssl s_server -accept 443 -www
    session的参数可以用sess_id指令打印。
    我对这条指令实在没有兴趣,一般使用openssl都是用做server, 没有机会调试client.我甚至没有用过这个指令。
openssl简介-指令sess_id

    用法:
   
    openssl sess_id [-inform PEM|DER] [-outform PEM|DER] [-in filename]
   
     [-out filename] [-text] [-noout] [-context ID]
   
   
    说明:
    本指令是处理SSL_SESSION结构的,可以打印出其中的细节。这也是一个调试工具。
    -inform DER|PEM
    指定输入格式是DER还是PEM.
    -outform DER|PEM
    指定输出格式是DER还是PEM
   -in filename
   指定输入的含有session信息的文件名,可以通过标准输入得到。
   -out filename
   指定输出session信息的文件名
   -text
   打印出明文的密钥的各个部件。
   -cert
   set本option将会把session中使用的证书打印出来。如果-text也被set, 那么将会把其用文本格式打印出来。
    -noout
    不打印出session的编码版本。
    -context ID
    设置session id. 不常用的一个option.
    本指令的典型的输出是:
    SSL-Session:
    Protocol : TLSv1
    Cipher : 0016
    Session-ID: 871E62626C554CE95488823752CBD5F3673A3EF3DCE9
    C67BD916C809914B40ED
    Session-ID-ctx: 01000000
    Master-Key: A7CEFC571974BE02CAC305269DC59F76EA9F0B180CB66
    42697A68251F2D2BB57E51DBBB4C7885573192AE9AEE220FACD
    Key-Arg : None
    Start Time: 948459261
   Timeout : 300 (sec)
    Verify return code 0 (ok)
    Protocol
    使用的协议版本信息。
    Cipher
    使用的cipher, 这里是原始的SSL/TLS里定义的代码。
    Session-ID
    16进制的session id
    Session-ID-ctx
    session-id-ctx的16进制格式。
    Master-Key
    ssl session master key.
    Key-Arg
    key的参数,只用于SSLv2
    Start Time
    session开始的时间。标准的unix格式。
    Timeout
    session-timeout时间。
    Verify return code
    证书验证返回值.
    ssl session文件的pem标准格式的第一行和最后一行是:
    ---BEGIN SSL SESSION PARAMETERS-----
    -----END SSL SESSION PARAMETERS-----
    因为ssl session输出包含握手的重要信息:master key, 所以一定要用一定的加密算法把起输出加密。一般是禁止在实际应用中把session的信息输出。我没用过这个工具。研究source的时候这个可能有点用。
openssl简介-指令speed
用法:
   
    openssl speed [-elapsed] [md2] [mdc2] [md5] [hmac] [sha1] [rmd160]
   
     [idea-cbc] [rc2-cbc] [rc5-cbc] [bf-cbc] [des-cbc] [des-ede3]
   
     [rc4] [rsa512] [rsa1024] [rsa2048] [rsa4096] [dsa512]
   
     [dsa1024] [dsa2048] [idea] [rc2] [des] [rsa] [blowfish]
   
     说明:
    算法在你的机器上的测试工具。
   
    OPTIONS
    -elapsed
    set了这个option将使测试结果是我们比较容易懂的时间格式,否则将是和time指令那样子显示的cpu时间。
    其他的option都是算法了。
openssl简介-指令version
用法:
   
    openssl version [-a] [-v] [-b] [-o] [-f] [-p]
   
   
    说明:
    用来打印版本信息的。最没用的指令和最简单的指令。
   
    OPTIONS
    -a
    打印所有信息, 相当于把其他option全set起来。
    当你向openssl官方站点报bug的时候,需要把这个指令列出来的东西也告诉他们
    -v
    打印当前openssl的版本信息。
    -b
    打印当前版本的openssl是什么时候弄出来的
    -o
    建立库的时候的各种于加密算法和机器字节有关的信息。
    -c
    编译时候的编译其的参数
    -p
    平台信息
openssl简介-指令x509

    用法:
   
    openssl x509 [-inform DER|PEM|NET] [-outform DER|PEM|NET]
   
     [-keyform DER|PEM][-CAform DER|PEM] [-CAkeyform DER|PEM]
   
     [-in filename][-out filename] [-serial] [-hash] [-subject]
   
     [-issuer] [-nameopt option] [-email] [-startdate] [-enddate]
   
     [-purpose] [-dates] [-modulus] [-fingerprint] [-alias]
   
     [-noout] [-trustout] [-clrtrust] [-clrreject] [-addtrust arg]
   
     [-addreject arg] [-setalias arg] [-days arg]
   
     [-signkey filename][-x509toreq] [-req] [-CA filename]
   
     [-CAkey filename] [-CAcreateserial] [-CAserial filename]
   
     [-text] [-C] [-md2|-md5|-sha1|-mdc2] [-clrext]
   
     [-extfile filename] [-extensions section]
   
   
    说明:
    本指令是一个功能很丰富的证书处理工具。可以用来显示证书的内容,转换其格式,给CSR签名等等。由于功能太多,我们按功能分成几部分来讲。
    输入,输出等一些一般性的option
    -inform DER|PEM|NET
    指定输入文件的格式。
    -outform DER|PEM|NET
    指定输出文件格式
    -in filename
    指定输入文件名
    -out filename
    指定输出文件名
    -md2|-md5|-sha1|-mdc2
    指定使用的哈希算法。缺省的是MD5于打印有关的option
    -text
    用文本方式详细打印出该证书的所有细节。
    -noout
    不打印出请求的编码版本信息。
    -modulus
    打印出公共密钥的系数值。没研究过RSA就别用这个了。
    -serial
    打印出证书的系列号。
    -hash
    把证书的拥有者名称的哈希值给打印出来。
    -subject
    打印出证书拥有者的名字。
    -issuer
    打印证书颁发者名字。
    -nameopt option
    指定用什么格式打印上俩个option的输出。
    后面有详细的介绍。
    -email
    如果有,打印出证书申请者的email地址
    -startdate
    打印证书的起始有效时间
    -enddate
    打印证书的到期时间
    -dates
    把上俩个option都给打印出来
    -fingerprint
    打印DER格式的证书的DER版本信息。
    -C
    用C代码风格打印结果。
    与证书信任有关的option
    一个可以信任的证书的就是一个普通证书,但有一些附加项指定其可以用于哪些用途和不可以用于哪些用途, 该证书还应该有一个"别名"。
    一般来说验证一个证书的合法性的时候,相关的证书链上至少有一个证书必须是一个可以信任的证书。缺省的认为如果该证书链上的Root CA的证书可以信任,那么整条链上其他证书都可以用于任何用途。
    以下的几个option只用来验证Root CA的证书。CA在颁发证书的时候可以控制该证书的用途,比如颁发可以用于SSL client而不能用于SSL server的证书。
    -trustout
    打印出可以信任的证书。
    -setalias arg
    设置证书别名。比如你可以把一个证书叫"fordesign's certificate", 那么以后就可以使用这个别名来引用这个证书。
    -alias
    打印证书别名。
   -clrtrust
   清除证书附加项里所有有关用途允许的内容。
   -clrreject
   清除证书附加项里所有有关用途禁止的内容。
   -addtrust arg
   添加证书附加项里所有有关用途允许的内容。
   -addreject arg
   添加证书附加项里所有有关用途禁止的内容。
   -purpose
   打印出证书附加项里所有有关用途允许和用途禁止的内容。
   
与签名有关的otpion
    本指令可以用来处理CSR和给证书签名,就象一个CA
    -signkey filename
    使用这个option同时必须提供私有密钥文件。这样把输入的文件变成字签名的证书。
    如果输入的文件是一个证书,那么它的颁发者会被set成其拥有者.其他相关的项也会被改成符合自签名特征的证书项。
    如果输入的文件是CSR, 那么就生成自签名文件。
    -clrext
    把证书的扩展项删除。
    -keyform PEM|DER
    指定使用的私有密钥文件格式。
    -days arg
    指定证书的有效时间长短。缺省为30天。
    -x509toreq
    把一个证书转化成CSR.用-signkey指定私有密钥文件
    -req
    缺省的认为输入文件是证书文件,set了这个option说明输入文件是CSR.
    -CA filename
    指定签名用的CA的证书文件名。
    -CAkey filename
    指定CA私有密钥文件。如果这个option没有参数输入,那么缺省认为私有密钥在CA证书文件里有。
    -CAserial filename
    指定CA的证书系列号文件。证书系列号文件在前面介绍过,这里不重复了。
    -CAcreateserial filename
    如果没有CA系列号文件,那么本option将生成一个。
    -extfile filename
    指定包含证书扩展项的文件名。如果没有,那么生成的证书将没有任何扩展项。
    -extensions section
   指定文件中包含要增加的扩展项的section
    上面俩个option有点难明白是吧?后面有举例。
    与名字有关的option.这些option决定证书拥有者/颁发者的打印方式。缺省方式是印在一行中。
    这里有必要解释一下这个证书拥有者/颁发者是什么回事。它不是我们常识里的一个名字,而是一个结构,包含很多字段。
    英文分别叫subject name/issuer name.下面是一个subject name的例子
    subject=
    countryName = AU
    stateOrProvinceName = Some-State
    localityName = gz
    organizationName = ai ltd
    organizationalUnitName = sw
    commonName = fordesign
    emailAddress = 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:990:F5:EC:11:7F:0A:01:53:58:4E:0B:7C:F7
    X509v3 Authority Key Identifier:
    keyid:69:41:87:55:BD:52:990: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没有冲突。
好铁!
你也太酷了!把翻译工作都作了!!!
我已经阵亡了 ,兄弟你好牛
JJ好棒哦...