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

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

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

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

  • 第一步:生成客户端的密钥,即客户端的公私钥对,且要保证私钥只有客户端自己拥有。
  • 第二步:以客户端的密钥和客户端自身的信息(国家、机构、域名、邮箱等)为输入,生成证书请求文件。其中客户端的公钥和客户端信息是明文保存在证书请求文件中的,而客户端私钥的作用是对客户端公钥及客户端信息做签名,自身是不包含在证书请求中的。然后把证书请求文件发送给CA机构。
  • 第三步:CA机构接收到客户端的证书请求文件后,首先校验其签名,然后审核客户端的信息,最后CA机构使用自己的私钥为证书请求文件签名,生成证书文件,下发给客户端。此证书就是客户端的身份证,来表明用户的身份。

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

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

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

2、req指令说明

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


  1. 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密钥生成证书请求文件,输入主体相关信息:


  1. $ openssl req -new -key RSA.pem -passin pass:123456 -out client.pem
  2. You are about to be asked to enter information that will be incorporated
  3. into your certificate request.
  4. What you are about to enter is what is called a Distinguished Name or a DN.
  5. There are quite a few fields but you can leave some blank
  6. For some fields there will be a default value,
  7. If you enter '.', the field will be left blank.
  8. -----
  9. Country Name (2 letter code) [AU]:AU
  10. State or Province Name (full name) [Some-State]:BJ
  11. Locality Name (eg, city) []:BJ
  12. Organization Name (eg, company) [Internet Widgits Pty Ltd]:BJ
  13. Organizational Unit Name (eg, section) []:BJ
  14. Common Name (e.g. server FQDN or YOUR name) []:BJ
  15. Email Address []:BJ
  16. Please enter the following 'extra' attributes
  17. to be sent with your certificate request
  18. A challenge password []:12345
  19. An optional company name []:BJ
  20. ......

使用原有的RSA密钥生成证书请求文件,指定-batch选项,主体信息从配置文件读取:


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

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


  1. openssl req -new -key RSA.pem -passin pass:123456 -out client.pem -subj /C=AU/ST=Some-State/O=Internet

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


  1. $ openssl req -new -key RSA.pem -passin pass:123456 -out client.pem -subj /C=AU/ST=Some-State/O=Internet -pubkey

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


  1. $ cat client.pem
  2. -----BEGIN PUBLIC KEY-----
  3. MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAL6e+hk0TAsYlPk5XB1tLCtCO8wQ7JMM
  4. YQ9SMy4Q1liPg4TdgSkdfbLB2UXmzzMCp+ZBDk9txwtewqv7PVcvY0MCAwEAAQ==
  5. -----END PUBLIC KEY-----
  6. -----BEGIN CERTIFICATE REQUEST-----
  7. MIIBGDCBwwIBADA1MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTER
  8. MA8GA1UECgwISW50ZXJuZXQwXDANBgkqhkiG9w0BAQEFAANLADBIAkEAvp76GTRM
  9. CxiU+TlcHW0sK0I7zBDskwxhD1IzLhDWWI+DhN2BKR19ssHZRebPMwKn5kEOT23H
  10. C17Cq/s9Vy9jQwIDAQABoCkwJwYJKoZIhvcNAQkOMRowGDAJBgNVHRMEAjAAMAsG
  11. A1UdDwQEAwIF4DANBgkqhkiG9w0BAQUFAANBAFBiB0fTUwTSoFeQdTWIr3KXzDHP
  12. bgLy1/nlJ71dYLfGGrR61RKmrXgpf76akURtF+gEXwLMfPO6FQlaIOYEe/c=
  13. -----END CERTIFICATE REQUEST-----

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

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


  1. $ openssl req -new -newkey rsa:1024 -out client.pem -keyout RSA.pem -batch
  2. Generating a 1024 bit RSA private key
  3. .......................................++++++
  4. ...............................++++++
  5. writing new private key to 'RSA.pem'
  6. Enter PEM pass phrase:
  7. Verifying - Enter PEM pass phrase:
  8. ......

自动生成1024位RSA密钥,并生成证书请求文件,指定-nodes文件,密钥文件不加密:


  1. $ openssl req -new -newkey rsa:1024 -out client.pem -keyout RSA.pem -batch -nodes
  2. Generating a 1024 bit RSA private key
  3. ..++++++
  4. .........................++++++
  5. writing new private key to 'RSA.pem'
    ......

自动生成1024位DSA密钥参数:


  1. $ openssl dsaparam -out DSA.param 1024
  2. Generating DSA parameters, 1024 bit long prime
  3. This could take some time
  4. ...+.+..+.+++++++++++++++++++++++++++++++++++++++++++++++++++*
  5. ................+...........+......+.+.............+.+.....+.+++++++++++++++++++++++++++++++++++++++++++++++++++*

自动生成1024位DSA密钥,并生成证书请求文件,指定-nodes文件,密钥文件不加密:


  1. $ openssl req -new -newkey dsa:DSA.param -out client.pem -keyout DSA.pem -batch -nodes
  2. Generating a 1024 bit DSA private key
  3. writing new private key to 'DSA.pem'
  4. ......

3、生成自签名证书

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


  1. $ openssl req -x509 -newkey rsa:1024 -out client.cer -keyout RSA.pem -batch -nodes
  2. Generating a 1024 bit RSA private key
  3. .........++++++
  4. ..++++++
  5. writing new private key to 'RSA.pem'
  6. ......

查看证书文件:


  1. $ openssl x509 -in client.cer -noout -text
  2. Certificate:
  3. Data:
  4. Version: 3 (0x2)
  5. .....
  6. Signature Algorithm: sha1WithRSAEncryption
  7. 5b:d7:f5:fd:18:3a:a9:22:2a:d9:f1:fc:00:3a:cf:23:ff:d1:
  8. 82:e5:2d:3f:7e:97:a8:38:32:e6:88:7a:ce:9f:31:cc:ea:60:
  9. 06:d1:96:bb:c8:42:ec:ef:26:73:4e:3b:2d:fa:0f:16:c2:25:
  10. 30:1b:a5:ca:35:bd:9b:dd:4b:41:d4:8b:95:3a:d4:7c:aa:8d:
  11. 0d:2d:e7:f3:95:33:d2:4a:5a:7f:a2:5d:cc:48:60:9f:ca:2d:
  12. 77:d9:ed:e9:09:f3:a1:18:96:1d:91:c6:1c:2b:7a:c1:d6:5d:
  13. 81:87:25:0d:32:6a:55:d2:89:95:c5:32:44:cc:9d:e7:68:6f:
  14. d8:80

4、查看证书请求内容

生成证书请求:


  1. $ openssl req -new -newkey rsa:1024 -out client.req -keyout RSA.pem -batch -nodes
  2. Generating a 1024 bit RSA private key
  3. ...............................................................++++++
  4. ......................++++++
  5. writing new private key to 'RSA.pem'
  6. ......

查看证书请求内容,subject指定输出主体:


  1. $ openssl req -in client.req -noout -text -subject
  2. Certificate Request:
  3. Data:
  4. Version: 0 (0x0)
  5. Subject: C=AU, ST=Some-State, O=Internet Widgits Pty Ltd
  6. Subject Public Key Info:
  7. Public Key Algorithm: rsaEncryption
  8. Public-Key: (1024 bit)
  9. Modulus:
  10. ...
  11. Exponent: 65537 (0x10001)
  12. Attributes:
  13. Requested Extensions:
  14. X509v3 Basic Constraints:
  15. CA:FALSE
  16. X509v3 Key Usage:
  17. Digital Signature, Non Repudiation, Key Encipherment
  18. Signature Algorithm: sha1WithRSAEncryption
  19. ...
  20. subject=/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd

5、校验证书请求文件

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


  1. $ openssl req -verify -in client.req -noout
  2. verify OK

4、小结

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

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

本文来自合作伙伴“Linux中国”

原文发布时间为:2013-04-02.

时间: 2024-08-17 21:06:07

openssl 证书请求和自签名命令 req 详解的相关文章

深入理解JavaScript系列(34):设计模式之命令模式详解

 这篇文章主要介绍了深入理解JavaScript系列(34):设计模式之命令模式详解,命令模式(Command)的定义是:用于将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及执行可撤销的操作,需要的朋友可以参考下     介绍 命令模式(Command)的定义是:用于将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或者记录请求日志,以及执行可撤销的操作.也就是说改模式旨在将函数的调用.请求和操作封装成一个单一的对象,然

Java命令设计模式详解_java

将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化.用于"行为请求者"与"行为实现者"解耦,可实现二者之间的松耦合,以便适应变化.分离变化与不变的因素. 一.角色Command 定义命令的接口,声明执行的方法.ConcreteCommand 命令接口实现对象,是"虚"的实现:通常会持有接收者,并调用接收者的功能来完成命令要执行的操作.Receiver 接收者,真正执行命令的对象.任何类都可能成为一个接收者,只要它能够实现命令要

Linux 下 Make 命令实例详解

  Linux 下 Make 命令实例详解          Linux 下 make 命令是系统管理员和程序员用的最频繁的命令之一.管理员用它通过命令行来编译和安装很多开源的工具,程序员用它来管理他们大型复杂的项目编译问题.本文我们将用一些实例来讨论 make 命令背后的工作机制. Make 如何工作的 对于不知道背后机理的人来说,make 命令像命令行参数一样接收目标.这些目标通常存放在以 "Makefile" 来命名的特殊文件中,同时文件也包含与目标相对应的操作.更多信息,阅读关

10个实用的电脑运行命令功能详解

  10个实用的电脑运行命令功能详解 要使用命令操作,最基本的是先需要如何打开运行操作框,主要有2种方法: 1.最快捷方法:使用 Windows + R 组合快捷键,快速呼出命令操作窗口. 2.常用方法:点击桌面左下角的"开始"然后找到并点击打开→"运行". 使用方法,打开命令操作窗口后,只要输入输入命令,然后按回车键或点击"确定"即可允许命名,实现各种功能. 了解如何打开命名操作框之后,接下来就来分享一下实用的命令吧,使用命令可以实现很多功能,

《Ansible权威指南》一2.4 Ansible系列命令用法详解与使用场景介绍

2.4 Ansible系列命令用法详解与使用场景介绍 如何获取Ansible的系列命令呢?在终端键入ansible后连续按两次Tab键,会补全所有以ansible字母开头的命令,这些命令均是Ansible系列命令.本节我们来逐一介绍Ansible的系列命令使用. ansible ansible-galaxy ansible-pull ansible-doc ansible-playbook ansible-vault ansible-console 2.4.1 ansible 命令ansible

《Ansible权威指南 》一Ansible命令用法详解

2.3 Ansible命令用法详解 Ansible命令行执行方式有Ad-Hoc.Ansible-playbook两种方式,Web化执行方式其官方提供了付费产品Tower(10台以内免费),个人的话可以基于其提供的API开发类似的Web化产品.关于命令行执行的两种方式Ad-Hoc和Ansible-playbooks.什么是Ad-Hoc及Ad-Hoc与Ansible-playbook的区别我们在第3章有详细介绍,这里不再赘述.需简要说明的是两者没有本质上的区别,Ad-Hoc主要用于临时命令的执行,A

《Ansible权威指南》一2.3 Ansible命令用法详解

2.3 Ansible命令用法详解 Ansible命令行执行方式有Ad-Hoc.Ansible-playbook两种方式,Web化执行方式其官方提供了付费产品Tower(10台以内免费),个人的话可以基于其提供的API开发类似的Web化产品.关于命令行执行的两种方式Ad-Hoc和Ansible-playbooks.什么是Ad-Hoc及Ad-Hoc与Ansible-playbook的区别我们在第3章有详细介绍,这里不再赘述.需简要说明的是两者没有本质上的区别,Ad-Hoc主要用于临时命令的执行,A

bat批处理 if 命令示例详解_DOS/BAT

if 命令示例详解 if,正如它E文中的意思,就是"如果"的意思,用来进行条件判断.翻译过来的意思就是:如果符合某一条件,便执行后面的命令. 主要用来判断,1.两个"字符串"是否相等:2.两个数值是大于.小于.等于,然后执行相应的命令. 当然还有特殊用法,如结合errorlevel:if errorlevel 1 echo error 或者结合defined(定义的意思):if defined test (echo It is defined) else echo 

Mysql导入导出工具Mysqldump和Source命令用法详解_Mysql

在PHP网站开发中,时常遇到Mysql数据库备份或数据库迁移工作,这时Mysql怎么导入导出数据库中的数据就非常关键,Mysql本身提供了命令行导出工具Mysqldump和Mysql Source导入命令进行SQL数据导入导出工作,通过Mysql命令行导出工具Mysqldump命令能够将Mysql数据导出为文本格式(txt)的SQL文件,通过Mysql Source命令能够将SQL文件导入Mysql数据库中,下面通过Mysql导入导出SQL实例详解Mysqldump和Source命令的用法. M