捕风之巢

统计

留言簿(3)

java友情链接

阅读排行榜

评论排行榜

openssl简介(十八)--指令req

 

十八.     指令 req

用法 :
   
    openssl req [-inform PEM|DER] [-outform PEM|DER] [-in filename]
   
    [-passin arg] [-out filename] [-passout arg] [-text] [-noout]
   
    [-verify] [-modulus] [-new] [-rand file(s)] [-newkey rsa]
   
    [-newkey dsa] [-nodes] [-key filename] [-keyform PEM|DER]
   
    [-keyout filename] [-[md5|sha1|md2|mdc2]] [-config filename]
   
    [-x509] [-days n] [-asn1-kludge] [-newhdr] [-extensions section]
   
    [-reqexts section]
   
     
描述 :
   
本指令用来创建和处理 PKCS#10 格式的证书 . 它还能够建立自签名证书 , Root CA.
         
    OPTIONS
    -inform DER|PEM
   
指定输入的格式是 DEM 还是 DER. DER 格式采用 ASN1 DER 标准格式。一般用的多的都是 PEM 格式,就是 base64 编码格式 . 你去看看你做出来的那些 .key, .crt 文件一般都是 PEM 格式的,第一行和最后一行指明内容,中间就是经过编码的东西。
    -outform DER|PEM
   
和上一个差不多,不同的是指定输出格式
    -in filename
   
要处理的 CSR 的文件名称 , 只有 -new -newkey 俩个 option 没有被 set, option 才有效
    -passin arg
   
去看看 CA 那一章关于这个 option 的解释吧。
     -out filename
   
要输出的文件名
    -passout arg
   
参看 dsa 指令里的 passout 这个 option 的解释吧 .
   -text
   
CSR 文件里的内容以可读方式打印出来
    -noout
   
不要打印 CSR 文件的编码版本信息 .
    -modulus
   
CSR 里面的包含的公共米要的系数打印出来 .
    -verify
   
检验请求文件里的签名信息 .
    -new
   
option 产生一个新的 CSR, 它会要用户输入创建 CSR 的一些必须的信息 . 至于需要哪些信息 , 是在 config 文件里面定义好了的 . 如果 -key 没有被 set, 那么就将根据 config 文件里的信息先产生一对新的 RSA 密钥
    -rand file(s)
   
产生 key 的时候用过 seed 的文件,可以把多个文件用冒号分开一起做 seed.
    -newkey arg
   
同时生成新的私有密钥文件和 CSR 文件 . option 是带参数的 . 如果是产生 RSA 的私有密钥文件 , 参数是一个数字 , 指明私有密钥 bit 的长度 . 如果是产生 DSA 的私有密钥文件 , 参数是 DSA 密钥参数文件的文件名 .
    -key filename
   
参数 filename 指明我们的私有密钥文件名 . 允许该文件的格式是 PKCS#8.
    -keyform DER|PEM
   
指定输入的私有密钥文件的格式是 DEM 还是 DER. DER 格式采用 ASN1 DER 标准格式。一般用的多的都是 PEM 格式,就是 base64 编码格式 . 你去看看你做出来的那些 .key, .crt 文件一般都是 PEM 格式的,第一行和最后一行指明内容,中间就是经过编码的东西。
    -outform DER|PEM
   
和上一个差不多,不同的是指定输出格式
    -keyform PEM|DER
   
私有密钥文件的格式 , 缺省是 PEM
    -keyout filename
   
指明创建的新的私有密钥文件的文件名 . 如果该 option 没有被 set, 将使用 config 文件里面指定的文件名 .
    -nodes
   
option set 的话 , 生成的私有密钥文件将不会被加密 .
    -[md5|sha1|md2|mdc2]
   
指明签发的证书使用什么哈希算法 . 如果没有被 set, 将使用 config 文件里的相应 item 的设置 . DSA CSR 将忽略这个 option, 而采用 SHA1 哈希算法 .
    -config filename
   
使用的 config 文件的名称 . option 如果没有 set, 将使用缺省的 config 文件 .
    -x509
   
option 将产生自签名的证书 . 一般用来错测试用 , 或者自己玩下做个 Root CA. 证书的扩展项在 config 文件里面指定 .
   -days n
   
如果 -509 set, 那么这个 option 的参数指定我们自己的 CA 给人家签证书的有效期 . 缺省是 30 .
    -extensions section -reqexts section
   
这俩个 option 指定 config 文件里面的与证书扩展和证书请求扩展有关的俩个 section 的名字 ( 如果 -x509 这个 option set). 样你可以在 config 文件里弄几个不同的与证书扩展有关的 section, 然后为了不同的目的给 CSR 签名的时候指明不同的 section 来控制签名的行为 .
    -asn1-kludge
   
缺省的 req 指令输出完全符合 PKCS10 格式的 CSR, 但有的 CA 仅仅接受一种非正常格式的 CSR, 这个 option set 就可以输出那种格式的 CSR. 要解释这俩种格式有点麻烦 , 需要用到 ASN1 PKCS 的知识 , 而且现在这样子怪的 CA 几乎没有 , 所以省略解释
    -newhdr
   
CSR 问的第一行和最后一行中加一个单词 "NEW", 有的软件 (netscape certificate server) 和有的 CA 就有这样子的怪癖嗜好 . 如果那些必须要的 option 的参数没有在命令行给出,那么就会到 config 文件里去查看是否有缺省 值, 然后时候。 config 文件中相关的一些 KEY 的解释与本指令有关的 KEY 都在 [req] 这个 section 里面 .
    input_password output_password
   
私有密钥文件的密码和把密码输出的文件名 . 同指令的 passin, passout 的意义相同 .
    default_bits
   
指定产生的私有密钥长度 , 如果为空 , 那么就用 512. 只有 -new set, 这个设置才起作用 , 意义同 -newkey 相同 .
    default_keyfile
   
指定输出私有密钥文件名 , 如果为空 , 将输出到标准输入 , 意义同 -keyout 相同 .
    oid_file
    oid_section
   
oid 文件有关的项 , oid 不清楚是什么东西来的 .
    RANDFILE
   
产生随机数字的时候用过 seed 的文件,可以把多个文件用冒号分开一起做 seed.
    encrypt_key
   
如果本 KEY 设置为 no, 那么如果生成一个私有密钥文件 , 将不被加密 . 同命令行的 -nodes 的意义相同 .
    default_md
   
指定签名的时候使用的哈希算法 , 缺省为 MD5. 命令行里有同样的功能输入 .
    string_mask
   
屏蔽掉某些类型的字符格式 . 不要乱改这个 KEY 的值 !! 有的字符格式 netscape 不支持 , 所以乱改这个 KEY 很危险 .
    req_extensions
   
指明证书请求扩展 section, 然后由那个 secion 指明扩展的特性 . openssl 的缺省 config 文件里 , 扩展的是 X509v3, 不扩展的是 x509v1. 这个 KEY 的意义和命令行里 -reqexts 相同 .
    x509_extensions
   
同命令行的 -extension 的意义相同 . 指明证书扩展的 sesion, 由那个 section 指明证书扩展的特性 .
    prompt
   
如果这个 KEY 设置为 no, 那么在生成证书的时候需要的那些信息将从 config 文件里读入 , 而不是从标准输入由用户去输入 , 同时改变下俩个 KEY 所指明的 section 的格式 .
    attributes
   
一个过时了的东西 , 不知道也罢 . 不过它的意义和下一个 KEY 有点类似 ,
   
格式则完全相同 .

distinguished_name
   
指定一个 section, 由那个 section 指定在生成证书或者 CRS 的时候需要的资料 . section 的格式如下 :
   
其格式有俩种 , 如果 KEY prompt set no( 看看 prompt 的解释 ), 那么这个 secion 的格式看起来就是这样子的 :
     CN=My Name
    OU=My Organization
    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 来指定 .

 

posted on 2006-10-17 15:41 捕风 阅读(819) 评论(0)  编辑  收藏 所属分类: java安全


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问