活到老学到老  

记录遇到问题的点点滴滴。

OpenSSL命令---req

8年前发布  · 1457 次阅读
  openssl  req 

用途:

本指令用来创建和处理PKCS#10格式的证书。它还能够建立自签名证书,做Root CA。

用法:

openssl  req [-inform PEM|DER] [-outform PEM|DER] [-in filename] [-out filename] [-text] [-pubkey]   
[-noout] [-verify] [-modulus] [-nodes] [-subject] [-passin arg] [-passout arg] [-key filename]   
[-keyform PEM|DER] [-keyout filename] [-rand file(s)] [-newkey rsa:bits] [-newkey dsa:file] [-newkey ec:file]   
[-digest] [-config filename] [-subj arg] [-multivalue-rdn] [-new] [-batch] [-x509] [-days n] [-set_serial n]   
[-newhdr][-asn1-kludge][ -no-asn1-kludge][-extensions section] [-reqexts section] [-utf8] [-nameopt option]   
[-reqopt option][-verbose] [-engine id]

选项说明:

-inform PEM|DER::输入文件格式,DER或者PEM格式。DER格式采用ASN1的DER标准格式。一般用的多的都是PEM格式,就是base64编码格式。

-outform DER|PEM:输出文件格式,DER或者PEM格式。

-in filename:输入的证书请求文件,默认为标准输入。只有-new和-newkey俩个选项没有被设置,本选项才有效。

-out filename:输出证书请求文件,默认为标准输出。

-text:将CSR文件里的内容以可读方式打印出来。

-pubkey:打印出公钥值。

-noout:不打印参数编码的版本信息。

-verify:验证请求信息中的签名信息值。

-modulus:输出证书请求文件的模数值。

-nodes:如果该选项被指定,如果私钥文件已经被创建则不用加密。

-subject:打印出请求信息中申请者的信息值(如果-x509被指定,则是证书申请者的信息值)。

-passin arg:指定私钥口令来源。

-passout arg:输出文件口令保护存放方式。

-key filename:证书私钥文件的来源。允许该文件的格式是PKCS#8。

-keyform PEM|DER:私钥文件的格式,一般默认为PEM。

-keyout filename:指明创建的新的私有密钥文件的文件名。如果该选项没有被设置,,将使用config文件里面指定的文件名。

-rand file(s):指定随机数种子文件,多个文件间用分隔符分开,windows用“;”,OpenVMS用“,“,其他系统用“:”。

-newkey rsa:bits:用于生成新的rsa密钥以及证书请求。如果用户不知道生成的私钥文件名称,默认采用privkey.pem,生成的证书请求。如果用户不指定输出文件(-out),则将证书请求文件打印在屏幕上。生成的私钥文件可以用-keyout来指定。生成过程中需要用户输入私钥的保护口令以及证书申请中的一些信息。

-newkey dsa:file:用file中的dsa密钥参数来产生一个DSA密钥。

-newkey ec:file:用file中的密钥参数来产生一个EC密钥。

-digest:指明签发的证书使用什么哈希算法。如果没有被设置,将使用config文件里的相应item的设置。但DSA的CSR将忽略这个选项,而采用SHA1哈希算法。

-config filename:使用的config文件的名称。本选项如果没有设置,将使用缺省的config文件。配置的写法可以参考openssl.cnf,其中有关于生成证书请求的设置。

-subj arg:用于指定生成的证书请求的用户信息,或者处理证书请求时用指定参数替换。生成证书请求时,如果不指定此选项,程序会提示用户来输入各个用户信息,包括国名、组织等信息,如果采用此选择,则不需要用户输入了。比如:-subj /CN=china/OU=test/O=abc/CN=forxy,注意这里等属性必须大写。

-multivalue-rdn:当采用-subj arg选项时,允许多值rdn名,比如arg参数写作:/CN=china/OU=test/O=abc/UID=123456+CN=forxy。

-new:本选项产生一个新的CSR,它会要用户输入创建CSR的一些必须的信息。至于需要哪些信息,是在config文件里面定义好了的。如果-key没有被设置,,那么就将根据config文件里的信息先产生一对新的RSA密钥值。

-batch:不询问用户任何信息(私钥口令除外),采用此选项生成证书请求时,不询问证书请求当各种信息。

-x509:本选项将产生自签名的证书。一般用来错测试用,或者自己玩下做个Root CA。证书的扩展项在 config文件里面指定。

-days n:指定自签名证书的有效期限。默认为30天。

-set_serial n:设置生成证书的证书序列号,比如 -set_serial 100或 -set_serial 0x100。

-newhdr:在CSR问的第一行和最后一行中加一个单词"NEW",有的软件(netscape certificate server)和有的CA就有这样子的怪癖嗜好。如果那些必须要的选项的参数没有在命令行给出,那么就会到config文件里去查看是否有缺省值。

-asn1-kludge:缺省的req指令输出完全符合PKCS10格式的CSR,但有的CA仅仅接受一种非正常格式的CSR,这个选项的设置就可以输出那种格式的CSR。要解释这俩种格式有点麻烦,需要用到ASN1和PKCS的知识,而且现在这样子怪的CA几乎没有,所以省略解释。

-no-asn1-kludge:不输出特定格式的CSR。

-extensions section、-reqexts section:这俩个选项指定config文件里面的与证书扩展和证书请求扩展有关的俩个section的名字(如果-x509这个选项被设置)。这样你可以在config文件里弄几个不同的与证书扩展有关的section,然后为了不同的目的给CSR签名的时候指明不同的section来控制签名的行为。

-utf8:输入字符为utf8编码,默认输入为ASCII编码。

-nameopt option:该选项决定颁发者信息值和申请者信息值怎样显示。Option可以由一个组成也可以由多个组成(需要用逗号隔开)。

-reqopt option:该选项决定CSR的输出格式,与text选项一起使用。Option可以由一个组成也可以由多个组成(需要用逗号隔开)。

-verbose:打印附加信息值。

-engine id:硬件引擎。

配置文件格式:

在配置文件中req字节指定了一些配置选项。在指定的字节中如果没有值,则用最原始的值。

可利用的选项如下:

B<input_password output_password>:输入的私钥文件的密钥值和输出的私钥文件(如果创建了一个)的密钥值。命令行选项B<passin> 和 B<passout>不顾配置文件的值。

B<default_bits>:指定的默认密钥长度值。如果没有指定,则默认是512字节。如果B<-new>选项没适应,则使用它。用B<-newkey>选项可以推翻它。

B<default_keyfile>:默认的私钥文件输出。如果没有指定,则输出到标准输出中。它可以由B<-keyout>选项来推翻。

B<oid_file>:指定的文件包含附加的B<OBJECT IDENTIFIERS>。文件中的每一行由一个数字型的对象标识符组成的表单、空格、短名字、空格、长名字组成。

B<oid_section>:它指定了一个字段,该字段配置文件中包含的额外的对象标识符。每一行由对象标识符的短名字和数字表单组成。在这个选项中,短名字和长名字都是一样的值。

B<RANDFILE>:读取和写入随机数种子信息的文件,或者是一个EGD接口。

B<encrypt_key>:如果这个选项设置为no,则产生的私钥文件不加密。这个与B<-nodes>命令行选项相似。和B<encrypt_rsa_key>是一个等价的选项。

B<default_md>:这个选项指定使用的摘要算法。可能的值包含md5、sha1、mdc2。如果没有设置,则使用md5。这个选项可以被命令行推翻。

B<string_mask>:这个字符串掩饰在域中的某些字符串类型。大多数用户不需要改变此选项的值。它可以设置为很多值:PrintableStrings、T61Strings以及 BMPStrings;如果B<pkix>的值被使用,仅仅只有PrintableStrings 和 BMPStrings的值可以使用。在RFC2459中建议使用PKIX。如果B<utf8only>选项被使用,则仅仅能够使用UTF8Strings:在2003年后的RFC2459中建议使用PKIX。最后B<nombstr>选项仅仅能够使用PrintableStrings、T61Strings:特别的是Netscape。

B<req_extensions>:它指定了配置文件中字节包含了一系列的额外信息,这些额外信息将会被添加到证书请求信息中。它可以被B<-reqexts>命令行所推翻。可以查看L<x509v3_config(5)|x509v3_config(5)>配置手册来查看额外信息的字节格式。

B<x509_extensions>::它指定了配置文件中字节包含了一系列的扩展信息,当B<-x509>选项使用时,这些额外信息将会被添加到证书中。它可以被B<- extensions>命令行所推翻。

B<prompt>:如果值设置为no,它是证书域失去能力。仅仅能够从配置文件目录中提取信息值。它也改变了B<distinguished_name> 和 B<attributes>字节的输出格式。

B<utf8>:如果设置为yes,则域的值将转换为utf8格式。默认的是ASCII格式。这就意味着这些域值不能从终端获取值,只能从配置文件中获取,还必须是可利用的UTF8字符串。

B<attributes>:这个指定了包含很多请求属性的字节:格式和B<distinguished_name>一样。具有代表性的是包含challengePassword 或 unstructuredName 类型。目前来说,他们是被OpenSSL的请求签名实体所忽略了的,但是一些CA有可能需要他们。

B<distinguished_name>:这个指定了包含distinguished名字域,当产生一个证书或证书请求时,有提示。格式描述在下一字段中。

DISTINGUISHED NAME 和 ATTRIBUTE SECTION 的格式:

对DISTINGUISHED NAME 和 ATTRIBUTE SECTION来说,它有两种分隔格式。如果B<prompt>的值设置为no且仅仅传输到req命令中。

如果不设置B<prompt>的值或者不设置为no,则文件包含提示信息。由下面的表单组成:

fieldName="prompt"

fieldName_default="default field value"

fieldName_min= 2

fieldName_max= 4

"fieldName"是所使用的域的名字,例如commonName(或CN)。"prompt"字符串适用于回答用户的相关说明。如果用户没有收入数据,则如果默认值被提出并且域被省略了的,则默认值将会被使用。如果默认的值是‘.’字符,则域可以被省略。

输入的字节数必须在fieldName_min和fieldName_max之间:有可能根据域有一些附加的限制。

有些域有可能不止用一次(例如DN)。提出的问题是因为配置文件中敬爱那个不识别同样地名字两次。为了避免这个问题,如果域名字包含同样地字节则遵循一个全的停止,它们将会被忽略。例如一个第二次的organizationName可以这样输入:"1.organizationName"。

实际上所许可的域名字是一些对象标识符的短或长名字。它们在OpenSSL中编译和包含常用的值例如as commonName、countryName、localityName、 organizationName、organizationUnitName、stateOrProvinceName。此外emailAddress也包含name、 surname、givenName initials 和 dnQualifier。

附加的对象标识符可以在配置文件中的B<oid_file> 或B<oid_section>中定义。附加的域将会被当做一个DirectoryString来对待。

实例:

检查和验证证书请求文件:

openssl req -in req.pem -text -verify –noout 
openssl genrsa -out key.pem 1024  
openssl req -new -key key.pem -out req.pem  

用req来实现产生一个私钥文件并利用它产生一个证书请求文件:

openssl req -newkey rsa:1024 -keyout key.pem -out req.pem

产生一个自签名的根证书:

openssl req -x509 -newkey rsa:1024 -keyout key.pem -out req.pem

指向B<oid_file>选项的一个实例:

1.2.3.4         shortName          A longer Name  
1.2.3.6         otherName         Other longer Name  

指向B<oid_section>选项,并用它产生一个可利用的扩展:

testoid1=1.2.3.5  
testoid2=${testoid1}.6  

配置文件中域名字提示实例:

[ 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格式的头部和底部如下:

-----BEGIN CERTIFICATE REQUEST-----  
-----END CERTIFICATE REQUEST-----  

有些软件(一些Netscape格式的服务器)用下面的来替代:

-----BEGIN NEW CERTIFICATE REQUEST-----  
-----END NEW CERTIFICATE REQUEST-----  

用B<-newhdr>选项产生的值是一个另外的兼容。在出入的时候可以通过转换来接受。

通过MSIE 类型的B<Xenroll>命令产生的证书请求文件是由扩展信息添加的。包括B<keyUsage>扩展信息,它是由密钥类型(仅仅又能够与签名或一般用途)来决定的,通过extendedKeyUsage扩展的脚本来输入一些附加的OIDs 。

DIAGNOSTICS:

下面的消息被频繁的被回答:

Using configuration from /some/path/openssl.cnf

Unable to load config info

过一段时间后:

unable to find 'distinguished_name' in config

problems making Certificate Request

第一个错误的线索是:不能够找到配置文件!几个操作(检查证书请求)不需要一个配置文件,则不会执行使用。证书或请求文件的产生,无论怎样都需要一个配置文件。这个有可能被当做一个BUG。

另外的使迷惑的信息是:

Attributes:

            a0:00

当没有属性被提出且请求包含了一个空的B<SET OF>结构(DER编码的数据为0xa0 0x00)就这样显示。如果你仅仅看到:

Attributes:

则B<SET OF>结构丢失,编码是无效的。可以看命令行B<-asn1-kludge>的描述获得更多的信息。

环境变量:

B<OPENSSL_CONF>的变量被定义,则允许指定配置文件的位置。这样就可以拒绝B<-config>所使用的命令行。对一些兼容性原因来说,B<SSLEAY_CONF>的环境变量有相同的目的但用的不好。

BUGs:

OpenSSL处理T61Strings是失败的:它将会被作为ISO-8859-1来对待(拉丁语 1)。Netscape 和 MSIE有相同的行为。它们可以造成的问题是:需要一个字节,但是它们当中的PrintableStrings不可被使用,而你又不想用BMPStrings。

具有重大意义的T61String的处理仅仅通过在OpenSSL中强调字节,用BMPStrings字符差un的问题是:目前Netscape格式的证书不被支持。如果你想在Netscape 和 MSIE中用一个强调字符,则你需要使用无效的T61String表单。

 

目前的提示不是很友好。它不允许你去确认哪里需要输入。其他的事情例如在证书请求文件中的扩展信息被静态的定义在配置文件中。还有一些问题就像一个邮件地址在subjectAltName中必须由用户输入。