阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

OpenSSL 证书请求和自签名命令req详解

154次阅读
没有评论

共计 7653 个字符,预计需要花费 20 分钟才能阅读完成。

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

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

第一步:生成客户端的密钥,即客户端的公私钥对,且要保证私钥只有客户端自己拥有。

第二步:以客户端的密钥和客户端自身的信息 (国家、机构、域名、邮箱等) 为输入,生成证书请求文件。其中客户端的公钥和客户端信息是明文保存在证书请求文件中的,而客户端私钥的作用是对客户端公钥及客户端信息做签名,自身是不包含在证书请求中的。然后把证书请求文件发送给 CA 机构。

第三步:CA 机构接收到客户端的证书请求文件后,首先校验其签名,然后审核客户端的信息,最后 CA 机构使用自己的私钥为证书请求文件签名,生成证书文件,下发给客户端。此证书就是客户端的身份证,来表明用户的身份。

至此客户端申请证书流程结束,其中涉及到证书签发机构 CA,CA 是被绝对信任的机构。如果把客户端证书比作用户身份证,那么 CA 就是颁发身份证的机构,我们以 https 为例说明证书的用处。

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

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

2、req 指令说明

上一节(见 http://www.linuxidc.com/Linux/2016-04/130492.htm)我们看到了申请证书流程,生成密钥对我们已经知道,那么如何生成证书请求呢,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 密钥生成证书请求文件,输入主体相关信息*/
linuxidc@linuxidc:
~/test$ openssl req –new -key RSA.pem -passin pass:123456out 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 followingextra attributes
to be sent with your certificate request
A challenge password []:
12345
An optional company name []:BJ
/*使用原有的 RSA 密钥生成证书请求文件,指定 -batch 选项,主体信息从配置文件读取 */
linuxidc@linuxidc:
~/test$ openssl req –new -key RSA.pem -passin pass:123456out client.pem –batch
/* 使用原有的 RSA 密钥生成证书请求文件,指定 -batch 选项,主体信息由命令行 subj 指定 */
linuxidc@linuxidc:
~/test$ openssl req –new -key RSA.pem -passin pass:123456out client.pem -subj /C=AU/ST=Some-State/O=Internet
/* 使用原有的 RSA 密钥生成证书请求文件,指定 -batch 选项,主体信息由命令行 subj 指定,且输出公钥 */
linuxidc@linuxidc:
~/test$ openssl req –new -key RSA.pem -passin pass:123456out client.pem -subj /C=AU/ST=Some-State/O=Internet –pubkey
/* 可以看到公钥和请求信息*/
linuxidc@linuxidc:
~/test$ 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—–
linuxidc@linuxidc:
~/test$

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

/*自动 1024 位 RSA 密钥,并生成证书请求文件 */
linuxidc@linuxidc:
~/test$ openssl req –new -newkey rsa:1024out 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 文件,密钥文件不加密 */
linuxidc@linuxidc:
~/test$ openssl req –new -newkey rsa:1024out client.pem -keyout RSA.pem -batch –nodes
Generating a
1024 bit RSA private key
..
++++++
…………………….
++++++
writing
new private key to RSA.pem
—–
/* 生成 1024 位 DSA 密钥参数 */
linuxidc@linuxidc:
~/test$ openssl dsaparam –out DSA.param 1024
Generating DSA parameters,
1024 bit long prime
This could take some time
+.+..+.+++++++++++++++++++++++++++++++++++++++++++++++++++*
…………….
+………..+……+.+………….+.+…..+.+++++++++++++++++++++++++++++++++++++++++++++++++++*
/* 自动 1024 位 DSA 密钥,并生成证书请求文件,指定 -nodes 文件,密钥文件不加密*/
linuxidc@linuxidc:
~/test$ 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
—–
OpenSSL 证书请求和自签名命令 req 详解

3、生成自签名证书

OpenSSL 证书请求和自签名命令 req 详解
/*生成自签名证书,与 req 参数一样,只需要把 req 修改为 x509 即可*/
linuxidc@linuxidc:~/test$ 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'
-----
/*查看证书文件*/
linuxidc@linuxidc:~/test$ 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
linuxidc@linuxidc:~/test$

4、查看证书请求内容

/*生成证书请求 */
linuxidc@linuxidc:
~/test$ openssl req –new -newkey rsa:1024out client.req -keyout RSA.pem -batch –nodes
Generating a
1024 bit RSA private key
………………………………………………………
++++++
………………….
++++++
writing
new private key to RSA.pem
—–
/* 查看证书请求内容,subject 指定输出主体*/
linuxidc@linuxidc:
~/test$ 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 指令,校验证书请求文件,其操作时提取请求文件中的公钥来验证签名信息*/
linuxidc@linuxidc:~/test$ openssl req -verify -in client.req -noout
verify OK
linuxidc@linuxidc:~/test$

4、小结

req 命令参数纷繁多杂,上文中没有完全介绍,而且还涉及到 openssl.cnf 配置文件的内容,是一个复杂而强大的指令。

为了方便记忆,不妨就记住它了两个主要功能:生成证书请求文件和生成自签名证书,对比上述的主要参数定义,足可以应付大多数场景。

更多 OpenSSL 相关内容可以查看以下的有用链接

使用 OpenSSL 命令行构建 CA 及证书  http://www.linuxidc.com/Linux/2015-10/124682.htm

Ubuntu 安装 OpenSSL  http://www.linuxidc.com/Linux/2015-10/124001.htm

通过 OpenSSL 提供 FTP+SSL/TLS 认证功能,并实现安全数据传输 http://www.linuxidc.com/Linux/2013-05/84986.htm

Linux 下使用 OpenSSL 生成证书 http://www.linuxidc.com/Linux/2015-05/117034.htm

利用 OpenSSL 签署多域名证书 http://www.linuxidc.com/Linux/2014-10/108222.htm

在 OpenSSL 中添加自定义加密算法  http://www.linuxidc.com/Linux/2015-08/121749.htm

OpenSSL 的详细介绍:请点这里
OpenSSL 的下载地址
:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-04/130491.htm

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-21发表,共计7653字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中