文章目录

  • 1 生成证书的步骤与原理
  • 2 标准的CA签发流程
    • 2.1 创建私钥(.key)
    • 2.2 基于私钥创建证书签名请求(.csr)
    • 2.3 (可选)直接同时生成私钥和证书签名请求
    • 2.4 将证书申请请求(.csr)提交给CA认证机构申请证书(.crt)
    • 2.5 CA机构生成CA证书链
  • 3 生成自签名证书
    • 3.1 创建私钥(.key)
    • 3.2 基于私钥(.key)创建证书签名请求(.csr)
    • 3.3 (可选)直接同时生成私钥(.key)和证书签名请求(.csr)
    • 3.4 使用自己的私钥(.key)签署自己的证书签名请求(.csr),生成自签名证书(.crt)
    • 3.5 (可选)直接同时生成私钥(.key)和自签名证书(.crt)
  • 4. 生成私有CA签发的证书
    • 4.1 生成CA私钥(ca.key)和CA自签名证书(ca.crt)
    • 4.2 生成Server端私钥(server.key)和证书签名请求(server.csr)
    • 4.3 使用CA证书(ca.crt)与密钥(ca.key)签署服务器的证书签名请求(server.csr),生成私有CA签名的服务器证书(server.crt)
  • 5. 附录一:openssl req命令参数说明
  • 6. 附录二:`openssl req`的`-subj`参数说明

1 生成证书的步骤与原理

要理解创建证书的每一步操作必须要先理解创建证书的流程和每一步的含义。生成证书的标准流程是这样的:

  1. 生成自己的私钥文件(.key)
  2. 基于私钥生成证书请求文件(.csr)
  3. 将证书请求文件(.csr)提交给证书颁发机构(CA),CA会对提交的证书请求中的所有信息生成一个摘要,然后使用CA根证书对应的私钥进行加密,这就是所谓的“签名”操作,完成签名后就会得到真正的签发证书(.cer或.crt)
  4. 用户拿到签发后的证书,可能需要导入到自己的密钥库中,如Java的keystore,或根据需要再进行各种格式转换(.pem .p12 .jks等等)

注意:

  1. 第1/2两步可以通过一个命令合并完成。
  2. 第3步向公认可信的CA机构申请证书是线上线下都要进行操作的一系列流程,申请的公司或组织还要提交各种资质和证明,与企业申请某种执照或办理某种手续性质类似,但企业最终拿到的就是一个CA签名的证书文件。所以,对于企业内部应用来说,完全可以自己创建自己的根证书,自己给自己签发证书,然后通过域控手段强制用户浏览器接受来自相应CA签发的证书。
  3. 再次解释一下“签名”的含义,这个概念很关键。在CA签发的证书中,包含申请者的公钥在内,几乎所有的数据都是明文的,也都是申请者自己提供的(当然CA需要审核),签发的证书唯一多出来的信息就是基于申请者提供的所有信息生成了一份摘要,然后用CA自己的私钥对摘要进行了加密,这段加密后的密文被称之为“签名”,这部分数据是返还的签发证书(.cer或.crt)中多出来的关键数据。下图是CA签发证书的原理:

汇总所有的情况来看,生成证书不外乎三种情形:

  • 标准CA签发流程
  • 生成自签名证书
  • 生成私有CA签发的证书

对于绝大多数的开发者而言,需要使用的其实是后两种:自签名证书和私有CA签发的证书。对这两种证书的差异,笔者现在理解的还不沟透彻,需要进一步研究。网上的说法是:自签名证书无法被吊销,私有CA签发的证书可以被吊销。从它们各自的命令行工具上看,后者确实有一个撤销操作openssl ca -revoke。此外,生成这两种证书的命令也是不一样的。

针对私有CA签发的证书,网上有如下的建议:

如果你的规划需要创建多个证书,那么使用私有CA的方法比较合适,因为只要给所有的客户端都安装了CA的证书,那么以该证书签名过的证书,客户端都是信任的,也就是安装一次就够了

如果你直接用自签名证书,你需要给所有的客户端安装该证书才会被信任,如果你需要第二个证书,则还的挨个给所有的客户端安装证书2才会被信任。

2 标准的CA签发流程

对应文章开头提及的证书生成流程,标准CA签发流程中的第三步是需要CA机构操作的,我们会解释CA机构要做的工作。

2.1 创建私钥(.key)

openssl genrsa -out my.key 2048

2.2 基于私钥创建证书签名请求(.csr)

openssl req -new -key my.key -out my.csr -subj "/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=domain1/CN=domain2"

这一操作有一个关键点:除了在请求中提交了申请人的一些组织信息之外,最重要的就是把上次生成的私钥作为参数传给命令行,这是因为命令行工具能根据私钥算出对应的公钥,公钥是未来证书的核心组成部分。

2.3 (可选)直接同时生成私钥和证书签名请求

上述两个操作是可以通过一条命令完成的,即同时生成my.key和my.csr两个文件:

openssl req -new -newkey rsa:2048 -nodes -keyout my.key -out my.csr -subj "/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=domain1/CN=domain2"

两个关键参数:

  • -newkey rsa:2048 -> 生成一个新的证书签名请求,同时生成一个2048位的RSA私钥
  • -nodes -> 不对新私钥加密

2.4 将证书申请请求(.csr)提交给CA认证机构申请证书(.crt)

如上所述,此为事务性的审批操作,无本地命令行操作。但是在CA机构那里,执行人员一定会使用CA自己的密钥对CSR进行签名操作,这一步操作与我们将在第4节介绍的使用私有CA证书对应的私钥进行签名性质上是一样的。

简单将:从CSR到CRT,就是一个签名过程,这个过程需要用签发方的私钥。走标准CA签发流程,是CA机构来操作,用的是他的根证书对应的私钥来签名;走自签名证书或私有CA证书的流程,用的就是自己的私钥。

2.5 CA机构生成CA证书链

绝大多书情况下,CA机构返还不是一个单一的证书,而一个证书链。关于证书链,我们会单独起一篇文章进行解释。这里先简单介绍一下:通常机构颁发的证书中会包含完整的证书链,可以直接使用。如果没有包含完整的证书链,浏览器通常会自动下载并补全上级证书,安装完成后不再显示安全警告。在颁发的证书中都会有它的上级和下级证书的相关信息,也包括下载地址,所以浏览器是可以自动下载补全的。但很多企业内网往往不允许连接到互联网,无法补全证书链。所以最好的办法是先补全证书链,再部署到网站上。

一张标准的证书,都会包含自己的颁发者名称,以及颁发者机构访问信息: Authority Info Access,其中就会有颁发者CA证书的下载地址。

通过这个URL,我们可以获得这个证书的颁发者证书,即中间证书。Windows、IOS、MAC都支持这种证书获取方式。

3 生成自签名证书

3.1 创建私钥(.key)

openssl genrsa -out my.key 2048

3.2 基于私钥(.key)创建证书签名请求(.csr)

openssl req -new -key my.key -out my.csr -subj "/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=domain1/CN=domain2"

3.3 (可选)直接同时生成私钥(.key)和证书签名请求(.csr)

openssl req -new -newkey rsa:2048 -nodes -keyout my.key -out my.csr -subj "/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=domain1/CN=domain2"

3.4 使用自己的私钥(.key)签署自己的证书签名请求(.csr),生成自签名证书(.crt)

openssl x509 -req -in my.csr -out my.crt -signkey my.key -days 3650

对于这条命令,要注意以下几点:

  1. 这个命令是openssl x509-req是参数,和前面生成证书签名请求的openssl req命令不同。
  2. -signkey my.key配置清晰地表明使用自己的私钥进行签名。

3.5 (可选)直接同时生成私钥(.key)和自签名证书(.crt)

上述三步操作也可以通过一个命令一次完成:

openssl req -x509 -newkey rsa:2048 -nodes -keyout my.key -out my.crt -days 3650  -subj "/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=domain1/CN=domain2"

这个命令要和3.3仔细区分开,3.3的命令是openssl req -new -newkey ...,这里的openssl req -x509 -newkey ...,关键的区别就是把-new改成了-x509-x509参数指明要输出的是一个证书,所以我们out文件是.crt后缀,而如果没有-x509,生成是证书签名请求,out文件就得是.csr后缀

4. 生成私有CA签发的证书

与生成自签名证书不同地方在于,生成自签名证书场景下只有一个参与方,请求证书和签发证书都是自己,而生成私有CA证书的场景里开始涉及两个角色了:

  • 签发证书的一方:CA(主要牵涉的是CA私钥和根证书)
  • 请求签发证书的一方:如服务器

为了变于区别,我们把它相关的文件分别用ca和server加以区别

4.1 生成CA私钥(ca.key)和CA自签名证书(ca.crt)

为了简化操作,我们会仿照3.5的操作,一步生成CA私钥和CA自签名证书。

openssl req -x509 -newkey rsa:2048 -nodes -keyout ca.key -out ca.crt -days 3650  -subj "/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=domain1/CN=domain2"

可以看到私有CA证书其实就是一个普通的自签名证书,至此环节时,还没有任何特殊之处。

4.2 生成Server端私钥(server.key)和证书签名请求(server.csr)

也是为了简化操作,我们仿照3.3节,一步生成成Server端私钥(server.key)和证书签名请求(server.csr)

openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.csr -subj "/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=domain1/CN=domain2"

4.3 使用CA证书(ca.crt)与密钥(ca.key)签署服务器的证书签名请求(server.csr),生成私有CA签名的服务器证书(server.crt)

接下来是关键的一步了!

openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650

对比3.4节生成自签名证书的命令行,我们可以看到,这里没有了-signkey my.key参数,而是改为了-CA ca.crt -CAkey ca.key目前让我困惑的是为什么还需要使用ca.crt文件呢?是要生成证书链吗?需验证

  • 关于-CAcreateserial
    当签署证书时,CA 需要为每个证书生成一个唯一的序列号,由于每个证书的序列号对于每个颁发者都必须是唯一的,因此颁发者需要跟踪它以前使用过哪些序列号,以确保它不会重复使用任何序列号。OpenSSL 提供了一种使用序列号文件进行跟踪的简单方法。当你指定 -CAcreateserial 时,它会将序列号 01 或一个随机数分配给签名证书,然后创建此序列号文件。在未来的签名操作中,应该使用 -CAserial 和该文件的名称,而不是-CAcreateserial,并且 OpenSSL 将为每个签名的证书增加该文件中的值。这样,你可以用一个颁发者证书签署一堆证书,并且它们的所有序列号都是唯一的。

最后,我们还可以使用如下命令来验证server.crt是否真得是由ca签发的:

openssl verify -CAfile ca.crt server.crt

如果显示OK,就是验证成功了。

5. 附录一:openssl req命令参数说明

由于创建证书的关键命令是openssl req命令,此处特别罗列一个这个命令的关键参数。

-days <n>
指定证书有效期,默认是30天,与 -x509 选项一起使用-newkey rsa:2048
生成一个新的证书申请,同时生成一个 2048 位的 RSA 私钥-keyout <keyfile>
新私钥要写入的文件-nodes
不对新私钥加密-key <keyfile>
读取指定的私钥文件.-text
同时打印纯文本版本和编码版本信息-noout
不打印编码后版本 (BASE64编码)-new
生成一个新的证书申请,会提示用户输入相关字段的值,如果没有 -key 选项,会使用指定配置文件中的信息生成一个新的 RSA 私钥.-x509
输出自签名的证书,而不是请求一个证书. 通常用于生成测试证书或自签名的根证书.-subj <arg>
申请人信息,格式是 /C=CN/O=Corp/.../CN=www.ez.com,可以使用 \ 转义,不会跳过空格.-[digets] 指定签署请求时使用的信息摘要算法,如 -md5,-sha1,-sha256

6. 附录二:openssl req-subj参数说明

/C= Country 国家
/ST= State or Province 省
/L= Location or City 城市
/O= Organization 组织或企业
/OU= Organization Unit 部门
/CN= Common Name 域名或IP

参考文章:

https://juejin.cn/post/6844904095937986568

https://iguoli.github.io/2018/07/27/Openssl-Commands.html

使用OpenSSL生成/签发证书的原理、流程与示例相关推荐

  1. 使用OpenSSL生成SSL证书的教程

    OpenSSL是一个加密软件库或工具包,它使计算机网络上的通信更加安全,可以使用其命令来创建SSL证书.OpenSSL采用apache授权许可,将工具包用于商业或非商业目的,下面就来看下CS如何利用O ...

  2. 使用openssl生成crt证书

    使用openssl生成crt证书 检查是否安装了 openssl 创建证书密钥文件 server.key 创建证书申请文件:server.csr 备份一份服务器密钥文件 server.key.org ...

  3. 利用openssl生成X509证书

    利用openssl生成X509证书 1.生成密钥 openssl genrsa -out test.key 2048 2.生成cert证书(sha512/sha256/sha1要根据实际算法) ope ...

  4. OpenSSL 生成 ssl 证书

    openssl 可以生成证书,但只是 "自制证书",我们自己来使用.因为我们生成的证书,不被各种浏览器认可,所以一般用于本机来测试.openssl 的介绍:https://segm ...

  5. openssl 生成免费证书

    1.什么是openssl? 它的作用是?应用场景是什么?什么是openssl? 它的作用是?应用场景是什么? openssl是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,它可以避免 ...

  6. http系列---OpenSSL生成根证书CA及签发子证书

    文章目录 1. 前言 2. 修改OpenSSL的配置 3. 生成根证书 4. 用根证书签发server端证书 5. 用根证书签发client端证书 6. 导出证书 7. 附项目证书目录 1. 前言 系 ...

  7. OpenSSL生成根证书CA及签发子证书

    转自:https://yq.aliyun.com/articles/40398 摘要: 系统:CentOS7 32位 目标:使用OpenSSL生成一个CA根证书,并用这个根证书颁发两个子证书serve ...

  8. Apache OpenSSL生成CA证书使用

    最近在学习SSL协议,这次是基于Apache服务器自带的openssl来实现的 TLS:传输层安全协议 SSL:安全套接字层 KEY:私钥 CSR:证书签名请求,即公钥,生成证书时需要将此提交给证书机 ...

  9. Openssl 生成多级证书

    一.前言 使用自签ca证书,给二级ca签发生成的证书默认不具备给三级证书签发的能力. 需要指定 -extensions v3_ca参数. 详细参考:http://blog.csdn.net/howev ...

最新文章

  1. mssql语句精华指令
  2. SecureCRT上传和下载文件(下载默认目录)
  3. Spark内核以及源码解析
  4. 修改telnet提示并非_iPhone修改微信提示音,iOS12可用,无需越狱详细教程
  5. linux caffe 生成lmdb,Caffe︱构建lmdb数据集与各类文件路径名设置细解
  6. JWT全面解读、使用步骤
  7. Spark SQL操作JSON字段小Tips
  8. 微信小程序--加载动画【水波涟漪效果】
  9. ONF代理执行董事Rick Bauer出走MEF
  10. 2019年8月,微信朋友圈发长文字防止被折叠成一行的方法
  11. ArcGIS生成矢量的分层设色地形图
  12. 网易推全球首个公正邮箱 破解电子邮箱出证难
  13. Python 上下文管理器和with块 二
  14. 想从事数据科学相关岗位,这些数学基础“必备”
  15. 2021牛年的春节一个人过
  16. QML应用动画(Applying Animations)
  17. 22年国家gongwuyuan考试申论题(副省级)
  18. Guava-EventBus使用详解
  19. 2019年10个最受欢迎的JavaScript动画库! 1
  20. “中投二号”今日低调挂牌

热门文章

  1. 电脑提示ISDone.dll错误怎么办?
  2. 关于1000BASE-T1 1000BASE-TX和100BASE-T1
  3. 解决Whitelabel Error Page最简单的方式
  4. 喜欢林肯公园(likin park)
  5. 数字图像处理_Matlab——车牌识别分析
  6. The machine learning algorithm cheat sheet
  7. 谷歌浏览器——新建下载任务
  8. 为什么运放一般要反比例放大?
  9. Android虚拟机是以哪种方式实现的,底层逻辑又是怎样的?
  10. Python:seaborn的散点图矩阵(Pairs Plots)可视化数据