欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

Linux下OpenSSL客户端中使用req命令来生成证书的教程

程序员文章站 2022-05-24 15:34:02
这篇文章主要介绍了Linux下OpenSSL客户端中使用req命令来生成证书的教程,详细讲解了自动生成密钥和生成自签名证书的方法,需要的朋友可以参考下... 16-04-22...

openssl req 用于生成证书请求,以让第三方权威机构ca来签发,生成我们需要的证书。req 命令也可以调用x509命令,以进行格式转换及显示证书文件中的text,modulus等信息。如果你还没有密钥对,req命令可以一统帮你生成密钥对和证书请求,也可以指定是否对私钥文件进行加密。

1、密钥、证书请求、证书概要说明

在证书申请签发过程中,客户端涉及到密钥、证书请求、证书这几个概念,初学者可能会搞不清楚三者的关系,网上有的根据后缀名来区分三者,更让人一头雾水。我们以申请证书的流程说明三者的关系。客户端(相对于ca)在申请证书的时候,大体上有三个步骤:

第一步:生成客户端的密钥,即客户端的公私钥对,且要保证私钥只有客户端自己拥有。
第二步:以客户端的密钥和客户端自身的信息(国家、机构、域名、邮箱等)为输入,生成证书请求文件。其中客户端的公钥和客户端信息是明文保存在证书请求文件中的,而客户端私钥的作用是对客户端公钥及客户端信息做签名,自身是不包含在证书请求中的。然后把证书请求文件发送给ca机构。
第三步:ca机构接收到客户端的证书请求文件后,首先校验其签名,然后审核客户端的信息,最后ca机构使用自己的私钥为证书请求文件签名,生成证书文件,下发给客户端。此证书就是客户端的身份证,来表明用户的身份。
至此客户端申请证书流程结束,其中涉及到证书签发机构ca,ca是被绝对信任的机构。如果把客户端证书比作用户身份证,那么ca就是颁发身份证的机构,我们以https为例说明证书的用处。

为了数据传输安全,越来越多的网站启用https。在https握手阶段,服务器首先把自己的证书发送给用户(浏览器),浏览器查看证书中的发证机构,然后在机器内置的证书中(在pc或者手机上,内置了世界上著名的ca机构的证书)查找对应ca证书,然后使用内置的证书公钥校验服务器的证书真伪。如果校验失败,浏览器会提示服务器证书有问题,询问用户是否继续。

例如12306网站,它使用的自签名的证书,所以浏览器会提示证书有问题,在12306的网站上有提示下载安装根证书,其用户就是把自己的根证书安装到用户机器的内置证书中,这样浏览器就不会报证书错误。但是注意,除非特别相信某个机构,否则不要在机器上随便导入证书,很危险。

2、req指令说明

上一节我们看到了申请证书流程,生成密钥对我们已经知道,那么如何生成证书请求呢,req指令就该上场了,我们可以查看req的man手册,如下:

openssl req [-inform pem|der] [-outform pem|der] [-in filename] [-passin arg] [-out filename] [-passout arg] [-text] [-pubkey] [-noout] [-verify] [-modulus] [-new] [-rand file(s)] [-newkey rsa:bits][-newkey alg:file] [-nodes] [-key filename] [-keyform pem|der] [-keyout filename] [-keygen_engine id] [-[digest]] [-config filename] [-subj arg] [-multivalue-rdn] [-x509] [-days n] [-set_serial n][-asn1-kludge] [-no-asn1-kludge] [-newhdr] [-extensions section] [-reqexts section] [-utf8] [-nameopt] [-reqopt] [-subject] [-subj arg] [-batch] [-verbose] [-engine id]
发现其参数多而复杂,还有许多没有用到过的参数。但是在实际应用中我们使用到的参数很有限,我们根据req的基本功能来学习。

req的基本功能主要有两个:生成证书请求和生成自签名证书。其他还有一些校验、查看请求文件等功能,示例会简单说明下。参数说明如下

[new/x509]

当使用-new选取的时候,说明是要生成证书请求,当使用x509选项的时候,说明是要生成自签名证书。

[key/newkey/keyout]

key和newkey是互斥的,key是指定已有的密钥文件,而newkey是指在生成证书请求或者自签名证书的时候自动生成密钥,然后生成的密钥名称有keyout参数指定。

当指定newkey选项时,后面指定rsa:bits说明产生rsa密钥,位数由bits指定。指定dsa:file说明产生dsa密钥,file是指生成dsa密钥的参数文件(由dsaparam生成)

[in/out/inform/outform/keyform]

in选项指定证书请求文件,当查看证书请求内容或者生成自签名证书的时候使用

out选项指定证书请求或者自签名证书文件名,或者公钥文件名(当使用pubkey选项时用到),以及其他一些输出信息。

inform、outform、keyform分别指定了in、out、key选项指定的文件格式,默认是pem格式。

[config]

参数文件,默认是/etc/ssl/openssl.cnf(ubuntu12.04),根据系统不同位置不同。该文件包含生成req时的参数,当在命令行没有指定时,则采用该文件中的默认值。

除上述主要参数外,还有许多其他的参数,不在一一叙述,有兴趣的读者可以查看req的man手册

3、req指令使用实例

(1)使用已有私钥生成证书请求

使用原有的rsa密钥生成证书请求文件,输入主体相关信息:

复制代码
代码如下:

$ openssl req -new -key rsa.pem -passin pass:123456 -out client.pem

you are about to be asked to enter information that will be incorporated
into your certificate request.
what you are about to enter is what is called a distinguished name or a dn.
there are quite a few fields but you can leave some blank
for some fields there will be a default value,
if you enter '.', the field will be left blank.
-----
country name (2 letter code) [au]:au
state or province name (full name) [some-state]:bj
locality name (eg, city) []:bj
organization name (eg, company) [internet widgits pty ltd]:bj
organizational unit name (eg, section) []:bj
common name (e.g. server fqdn or your name) []:bj
email address []:bj
please enter the following 'extra' attributes
to be sent with your certificate request
a challenge password []:12345
an optional company name []:bj
......
使用原有的rsa密钥生成证书请求文件,指定-batch选项,主体信息从配置文件读取:

复制代码
代码如下:

$ openssl req -new -key rsa.pem -passin pass:123456 -out client.pem -batch

使用原有的rsa密钥生成证书请求文件,指定-batch选项,主体信息由命令行subj指定:

复制代码
代码如下:

openssl req -new -key rsa.pem -passin pass:123456 -out client.pem -subj /c=au/st=some-state/o=internet

使用原有的rsa密钥生成证书请求文件,指定-batch选项,主体信息由命令行subj指定,且输出公钥:

复制代码
代码如下:

$ openssl req -new -key rsa.pem -passin pass:123456 -out client.pem -subj /c=au/st=some-state/o=internet -pubkey

可以看到公钥和请求信息:

复制代码
代码如下:

$ cat client.pem

-----begin public key-----
mfwwdqyjkozihvcnaqebbqadswawsajbal6e+hk0tasylpk5xb1tlctco8wq7jmm
yq9smy4q1lipg4tdgskdfblb2uxmzzmcp+zbdk9txwtewqv7pvcvy0mcaweaaq==
-----end public key-----
-----begin certificate request-----
miibgdcbwwibada1mqswcqydvqqgewjbvtetmbega1uecawku29tzs1tdgf0zter
ma8ga1uecgwisw50zxjuzxqwxdanbgkqhkig9w0baqefaanladbiakeavp76gtrm
cxiu+tlchw0sk0i7zbdskwxhd1izlhdwwi+dhn2bkr19sshzrebpmwkn5keot23h
c17cq/s9vy9jqwidaqabockwjwyjkozihvcnaqkomrowgdajbgnvhrmeajaamasg
a1uddwqeawif4danbgkqhkig9w0baqufaanbafbib0ftuwtsofeqdtwir3kxzdhp
bgly1/nlj71dylfggrr61rkmrxgpf76akurtf+gexwlmfpo6fqlaioyee/c=
-----end certificate request-----


(2)自动生成密钥,生成证书请求文件

自动生成1024位rsa密钥,并生成证书请求文件:

复制代码
代码如下:

$ openssl req -new -newkey rsa:1024 -out client.pem -keyout rsa.pem -batch

generating a 1024 bit rsa private key
.......................................++++++
...............................++++++
writing new private key to 'rsa.pem'
enter pem pass phrase:
verifying - enter pem pass phrase:
......
自动生成1024位rsa密钥,并生成证书请求文件,指定-nodes文件,密钥文件不加密:

复制代码
代码如下:

$ openssl req -new -newkey rsa:1024 -out client.pem -keyout rsa.pem -batch -nodes

generating a 1024 bit rsa private key
..++++++
.........................++++++
writing new private key to 'rsa.pem'
......
自动生成1024位dsa密钥参数:

复制代码
代码如下:

$ openssl dsaparam -out dsa.param 1024

generating dsa parameters, 1024 bit long prime
this could take some time
...+.+..+.+++++++++++++++++++++++++++++++++++++++++++++++++++*
................+...........+......+.+.............+.+.....+.+++++++++++++++++++++++++++++++++++++++++++++++++++*
自动生成1024位dsa密钥,并生成证书请求文件,指定-nodes文件,密钥文件不加密:

复制代码
代码如下:

$ openssl req -new -newkey dsa:dsa.param -out client.pem -keyout dsa.pem -batch -nodes

generating a 1024 bit dsa private key
writing new private key to 'dsa.pem'
......


(3)生成自签名证书

生成自签名证书,与req参数一样,只需要把req修改为x509即可:

复制代码
代码如下:

$ openssl req -x509 -newkey rsa:1024 -out client.cer -keyout rsa.pem -batch -nodes

generating a 1024 bit rsa private key
.........++++++
..++++++
writing new private key to 'rsa.pem'
......
查看证书文件:

复制代码
代码如下:

$ openssl x509 -in client.cer -noout -text

certificate:
    data:
        version: 3 (0x2)
    .....
    signature algorithm: sha1withrsaencryption
         5b:d7:f5:fd:18:3a:a9:22:2a:d9:f1:fc:00:3a:cf:23:ff:d1:
         82:e5:2d:3f:7e:97:a8:38:32:e6:88:7a:ce:9f:31:cc:ea:60:
         06:d1:96:bb:c8:42:ec:ef:26:73:4e:3b:2d:fa:0f:16:c2:25:
         30:1b:a5:ca:35:bd:9b:dd:4b:41:d4:8b:95:3a:d4:7c:aa:8d:
         0d:2d:e7:f3:95:33:d2:4a:5a:7f:a2:5d:cc:48:60:9f:ca:2d:
         77:d9:ed:e9:09:f3:a1:18:96:1d:91:c6:1c:2b:7a:c1:d6:5d:
         81:87:25:0d:32:6a:55:d2:89:95:c5:32:44:cc:9d:e7:68:6f:
         d8:80


(4)查看证书请求内容

生成证书请求:

复制代码
代码如下:

$ openssl req -new -newkey rsa:1024 -out client.req -keyout rsa.pem -batch -nodes

generating a 1024 bit rsa private key
...............................................................++++++
......................++++++
writing new private key to 'rsa.pem'
......
查看证书请求内容,subject指定输出主体:

复制代码
代码如下:

$ openssl req -in client.req -noout -text -subject

certificate request:
    data:
        version: 0 (0x0)
        subject: c=au, st=some-state, o=internet widgits pty ltd
        subject public key info:
            public key algorithm: rsaencryption
                public-key: (1024 bit)
                modulus:
                ...  
             exponent: 65537 (0x10001)
        attributes:
        requested extensions:
            x509v3 basic constraints:
                ca:false
            x509v3 key usage:
                digital signature, non repudiation, key encipherment
    signature algorithm: sha1withrsaencryption
...
   subject=/c=au/st=some-state/o=internet widgits pty ltd
  
(5)校验证书请求文件

指定verify指令,校验证书请求文件,其操作时提取请求文件中的公钥来验证签名信息:

复制代码
代码如下:

$ openssl req -verify -in client.req -noout

verify ok


4、生成证书步骤小结

step 1. create key (password protected)

复制代码
代码如下:

openssl genrsa -out prvtkey.pem 1024/2038 (with out password protected)


复制代码
代码如下:

openssl genrsa -des3 -out prvtkey.pem 1024/2048 (password protected)

这个命令会生成一个1024/2048位的密钥。
step 2. create certification request

复制代码
代码如下:

openssl req -new -key prvtkey.pem -out cert.csr
openssl req -new -nodes -key prvtkey.pem -out cert.csr

这个命令将会生成一个证书请求,当然,用到了前面生成的密钥prvtkey.pem文件
这里将生成一个新的文件cert.csr,即一个证书请求文件,你可以拿着这个文件去数字证书颁发机构(即ca)申请一个数字证书。ca会给你一个新的文件cacert.pem,那才是你的数字证书。
step 3: send certificate request to certification authority (ca)
如果是自己做测试,那么证书的申请机构和颁发机构都是自己。就可以用下面这个命令来生成证书:

复制代码
代码如下:

openssl req -new -x509 -key prvtkey.pem -out cacert.pem -days 1095

这个命令将用上面生成的密钥privkey.pem生成一个数字证书cacert.pem