柳州专业网站推广公司,nancy网站开发,海淀区seo搜索优化,行者seo目录 0. 基础理论openssl简介对称加密和非对称加密生成证书流程原理CA签发流程openssl基础操作 1. 生成证书的步骤与原理2. 标准的CA签发流程2.1 创建私钥#xff08;.key)2.2 基于私钥创建证书签名请求#xff08;.csr#xff09;2.3 #xff08;可选#xff09;直接同时… 目录 0. 基础理论openssl简介对称加密和非对称加密生成证书流程原理CA签发流程openssl基础操作 1. 生成证书的步骤与原理2. 标准的CA签发流程2.1 创建私钥.key)2.2 基于私钥创建证书签名请求.csr2.3 可选直接同时生成私钥和证书签名请求2.4 将证书申请请求.csr提交给CA认证机构申请证书.crt2.5 CA机构生成CA证书链 3. 生成自签名证书3.1 创建私钥.key3.2 基于私钥.key创建证书签名请求.csr3.3 可选直接同时生成私钥.key和证书签名请求.csr3.4 使用自己的私钥.key签署自己的证书签名请求.csr生成自签名证书.crt3.5 可选直接同时生成私钥.key和自签名证书.crt 4. 生成私有CA签发的证书4.1 生成CA私钥ca.key和CA自签名证书ca.crt4.2 生成Server端私钥server.key和证书签名请求server.csr4.3 使用CA证书ca.crt与密钥ca.key签署服务器的证书签名请求server.csr生成私有CA签名的服务器证书server.crt 5. 附录一openssl req命令参数说明6. 附录二openssl req的-subj参数说明相关实操博文案例 0. 基础理论 参考openssl证书签发流程详解 openssl简介
openssl 是目前最流行的 SSL 密码库工具其提供了一个通用、健壮、功能完备的工具套件用以支持SSL/TLS 协议的实现。
构成部分
密码算法库密钥和证书封装管理功能SSL通信API接口
用途
建立 RSA、DH、DSA key 参数建立 X.509 证书、证书签名请求(CSR)和CRLs(证书回收列表)计算消息摘要使用各种 Cipher加密/解密SSL/TLS 客户端以及服务器的测试处理S/MIME 或者加密邮件
数字证书标准
X.509版本号指出该证书使用了哪种版本的X.509标准版本号会影响证书中的一些特定信息序列号由CA给予每一个证书分配的唯一的数字型编号当证书被取消时实际上是将此证书序列号放入由CA签发的CRLCertificate Revocation List证书作废表或证书黑名单表中。这也是序列号唯一的原因签名算法标识符 用来指定CA签署证书时所使用的签名算法常见算法如RSA签发者信息颁发证书的实体的 X.500 名称信息。它通常为一个 CA证书的有效期证书起始日期和时间以及终止日期和时间指明证书在这两个时间内有效。主题信息证书持有人唯一的标识在 Internet上应该是唯一的发布者的数字签名这是使用发布者私钥生成的签名以确保这个证书在发放之后没有被撰改过。证书的公钥包括证书的公钥、算法(指明密钥属于哪种密码系统)的标识符和其他相关的密钥参数
数字证书格式
CSR证书请求文件这个并不是证书而是向证书颁发机构获得签名证书的申请文件CER存放证书文件可以是二进制编码或者BASE64编码CRT证书可以是DER编码也可以是PEM编码在linux系统中比较常见pem该编码格式在RFC1421中定义但他也同样广泛运用于密钥管理实质上是 Base64 编码的二进制内容DER用于二进制DER编码的证书。这些证书也可以用CER或者CRT作为扩展名JKSjava的密钥存储文件,二进制格式,是一种 Java 特定的密钥文件格式 JKS的密钥库和私钥可以用不同的密码进行保护p12/PFX包含所有私钥、公钥和证书。其以二进制格式存储也称为 PFX 文件在windows中可以直接导入到密钥区密钥库和私钥用相同密码进行保护
数字证书和公钥的关系
数字证书是经过权威机构CA认证的公钥通过查看数字证书可以知道该证书是由那家权威机构签发的证书使用人的信息使用人的公钥。它有以下特点
由专门的机构签发的数字证书才安全有效。签发数字证书是收费的。不会被冒充安全可信。数字证书有使用期限过了使用期限证书变为不可用。CA也可以在试用期内对证书进行作废操作。
什么是x.509
X.509 就是其中一个目录它规定了数字证书的标准。ITU 最早在 1993 年就指定了 X.509 数字证书标准它其实是作为 X.500 项目的一部分X.500 项目的作用是定义了唯一标识一个实体的方法该实体可以是机构、组织、个人或一台服务器。而 X.509 则把该实体与公钥所绑定关联起来从而提供了通信实体的鉴别机制也就是目前最流行的 X.509 数字证书。我们通常说的证书都是指 X.509 数字证书如果不加特别说明都是指 X.509 v3 版本的。简单来说v3 版本就是添加了扩展字段的证书。
对称加密和非对称加密
对称加密就是加密和解密用同一份密钥而非对称加密就是加密和解密用不同的密钥。
对称加密的问题在于需要双方都知道密钥而密钥一旦需要在通信中传递就有被窃取的可能这样加密的内容也会被窃取。对于非对称加密来说主体需要准备一对密钥一个叫做私钥自己留着一个叫做公钥发送给要通信的对象。私钥加密的数据用公钥可以解开公钥加密的数据用私钥可以解开。并且即使公钥被其他人知道远端通信的对象发送来的数据也是安全的因为公钥加密的数据公钥解不开但是此时私钥加密的数据就会被知道了。所以一般情况下私钥加密数据被用作身份验证叫做签名
对称加密 明文 --A密钥加密-- 密文 --B同一份密钥解密-- 明文
非对称加密明文 --A公钥加密-- 密文 --B私钥解密-- 明文明文 --B私钥签名-- 密文 --A公钥验签-- 明文此处公私钥由B生成非对称加密虽然解决了对称加密的问题但仍然存在着安全隐患。假如此时有一个中间人他也生成了自己的公钥和私钥并且先一步与A和B分别建立了联系获取了B的公钥又把自己的公钥给了A而A以为这个公钥是B的那么
明文 --A中间人的公钥加密 -- 密文 --中间人中间人的私钥解密-- 明文
明文 --中间人B的公钥加密 -- 密文 --BB的私钥解密-- 明文此时A和B都以为自己在和对方通信但是中间人已经获取了加密的内容甚至可以进行篡改。所以我们还要保证公钥在分发的过程中不能出现差错。
为了解决这个问题出现了另一个办法这个办法涉及到了第三方叫做证书授权机构Certificate Authority简称CA并且这个方法工作的前提是A已经正确的拥有了CA的公钥。
工作的流程是这样的
1: CA用自己的私钥生成一个自签名的证书
2: B向CA发起请求CA用自己的私钥和证书使用B的私钥为其签发证书证书中包含B的公钥信息
3: B把自己的证书发送给A同时用自己的私钥签名了一些东西也发了过去A拿着CA的证书验证B证书如果验证没有问题就从证书中拿到B的公钥然后拿这个公钥对收到的数据验证签名确定身份
4: 最后A就可以用这个公钥和B通信了 参考链接https://zhuanlan.zhihu.com/p/456089100
生成证书流程原理
1: 生成自己的私钥文件(.key)
2: 基于私钥生成证书请求文件(.csr)
3: 将证书请求文件(.csr)提交给证书颁发机构CACA会对提交的证书请求中的所有信息生成一个摘要然后使用CA根证书对应的私钥进行加密这就是所谓的“签名”操作完成签名后就会得到真正的签发证书(.cer或.crt)
4: 用户拿到签发后的证书可能需要导入到自己的密钥库中或根据需要再进行各种格式转换(.pem .p12 .jks等等)权威机构 (CACertificate Authority) 是最重要的一环只有经过它签名的公钥包含在所签发的数字证书中才是可信的。
生成证书的方式有以下三种
标准CA签发流程生成自签名证书生成私有CA签发的证书
CA签发流程
标准签发流程
1: 首先创建私钥
openssl genrsa -out server.key 20482基于私钥创建证书签名请求
openssl req -new -key server.key -out server.csr -subj /CCN/STbeijing/Lbeijing/Oceshi/OUdevops/CNtest.com# csr这一步可以使用交互式输入
# -subj格式国家/省/城市/组织/部门/名称/其他可选值
# 在请求中提交了申请人的一些组织信息之外最重要的就是把上一步中生成的私钥作为参数传给命令行这是因为命令行工具能根据私钥算出对应的公钥公钥是未来证书的核心组成部分。3将证书申请请求.csr提交给CA认证机构申请证书。这个过程在CA机构那里完成无法在本地使用命令完成。走标准CA签发流程是CA机构来操作用的是CA机构的根证书对应的私钥来签名自签名签发流程
1: 首先创建私钥
openssl genrsa -out server.key 20482基于私钥创建证书签名请求
openssl req -new -key server.key -out server.csr -subj /CCN/STbeijing/Lbeijing/Oceshi/OUdevops/CNtest.com3使用自己的私钥.key签署自己的证书签名请求.csr生成自签名证书.crt
openssl x509 -req -in server.csr -out server.crt -signkey server.key -days 3650
##走自签名证书或私有CA证书的流程用的就是自己的私钥。自签名签发流程
1: 首先创建私钥
openssl genrsa -out server.key 20482基于私钥创建证书签名请求
openssl req -new -key server.key -out server.csr -subj /CCN/STbeijing/Lbeijing/Oceshi/OUdevops/CNtest.com3使用自己的私钥.key签署自己的证书签名请求.csr生成自签名证书.crt
openssl x509 -req -in server.csr -out server.crt -signkey server.key -days 3650
##走自签名证书或私有CA证书的流程用的就是自己的私钥。生成私有CA签发的证书
首先步骤还是和自签证书一样先生成一个server.crt证书和server.key文件
1:先生成server.crt证书openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr -subj /CCN/STbeijing/Lbeijing/Oceshi/OUdevops/CNtest.com
openssl x509 -req -in server.csr -out server.crt -signkey server.key -days 3650[rootnode1 test]# ll
total 28
-rw-r--r-- 1 root root 1212 Jun 13 21:59 server.crt
-rw-r--r-- 1 root root 1001 Jun 13 21:58 server.csr
-rw------- 1 root root 1679 Jun 13 21:58 server.key2生成client端证书
openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csr -subj /CCN/STbeijing/Lbeijing/Oceshi/OUdevops/CNtest2.com
接下来是重要的一步使用
openssl x509 -req -in client.csr -CA server.crt -CAkey server.key -CAcreateserial -out client.crt -days 3650[rootnode1 test]# ll
total 28
-rw-r--r-- 1 root root 1212 Jun 13 22:06 client.crt
-rw-r--r-- 1 root root 1001 Jun 13 22:06 client.csr
-rw------- 1 root root 1675 Jun 13 22:06 client.key
-rw-r--r-- 1 root root 1212 Jun 13 21:59 server.crt
-rw-r--r-- 1 root root 1001 Jun 13 21:58 server.csr
-rw------- 1 root root 1679 Jun 13 21:58 server.key
-rw-r--r-- 1 root root 41 Jun 13 22:06 server.srl####################
我们可以看到,此处没有了-signkey server.key参数而是改为了-CA server.crt -CAkey server.key.
关于-CAcreateserial解释如下当签署证书时CA 需要为每个证书生成一个唯一的序列号由于每个证书的序列号对于每个颁发者都必须是唯一的因此颁发者需要跟踪它以前使用过哪些序列号以确保它不会重复使用任何序列号。OpenSSL 提供了一种使用序列号文件进行跟踪的简单方法。当你指定 -CAcreateserial 时它会将序列号 01 或一个随机数分配给签名证书然后创建此序列号文件。在未来的签名操作中应该使用 -CAserial 和该文件的名称而不是-CAcreateserial并且 OpenSSL 将为每个签名的证书增加该文件中的值。这样你可以用一个颁发者证书签署一堆证书并且它们的所有序列号都是唯一的。####验证client.crt是否真得是由server签发的[rootnode1 test]# openssl verify -CAfile server.crt client.crt
client.crt: OK
[rootnode1 test]#
[rootnode1 test]#参考链接https://blog.csdn.net/bluishglc/article/details/123617558
openssl基础操作
1:查看证书内容
openssl x509 -in server.crt -noout -text2查看私钥key内容
openssl x509 -in server.crt -noout -text3获取公钥
openssl x509 -pubkey -noout -in server.crt4:证书格式转换
openssl x509 -in server.crt -outform der -out server.cer
openssl x509 -in server.cer -outform pem -out server.crt
# 如果后缀名不标准的话还需要指定-inform der/pem5:一条命令生成自签证书
openssl req -newkey rsa:2048 -nodes -keyout rsa_private.key -x509 -days 365 -out cert.crt -subj /CCN/STbeijing/Lbeijing/Oceshi/OUdevops/CNtest.com
###-nodes 表示私钥不加密若不带参数将提示输入密码1. 生成证书的步骤与原理 后面这部分参考使用OpenSSL生成/签发证书的原理、流程与示例 要理解创建证书的每一步操作必须要先理解创建证书的流程和每一步的含义。生成证书的标准流程是这样的
1、生成自己的私钥文件(.key)2、基于私钥生成证书请求文件(.csr)3、将证书请求文件(.csr)提交给证书颁发机构CACA会对提交的证书请求中的所有信息生成一个摘要然后使用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 20482.2 基于私钥创建证书签名请求.csr
openssl req -new -key my.key -out my.csr -subj /CCN/STshanghai/Lshanghai/Oexample/OUit/CNdomain1/CNdomain2这一操作有一个关键点除了在请求中提交了申请人的一些组织信息之外最重要的就是把上次生成的私钥作为参数传给命令行这是因为命令行工具能根据私钥算出对应的公钥公钥是未来证书的核心组成部分。
2.3 可选直接同时生成私钥和证书签名请求
上述两个操作是可以通过一条命令完成的即同时生成my.key和my.csr两个文件
openssl req -new -newkey rsa:2048 -nodes -keyout my.key -out my.csr -subj /CCN/STshanghai/Lshanghai/Oexample/OUit/CNdomain1/CNdomain2两个关键参数
-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 20483.2 基于私钥.key创建证书签名请求.csr
openssl req -new -key my.key -out my.csr -subj /CCN/STshanghai/Lshanghai/Oexample/OUit/CNdomain1/CNdomain23.3 可选直接同时生成私钥.key和证书签名请求.csr
openssl req -new -newkey rsa:2048 -nodes -keyout my.key -out my.csr -subj /CCN/STshanghai/Lshanghai/Oexample/OUit/CNdomain1/CNdomain23.4 使用自己的私钥.key签署自己的证书签名请求.csr生成自签名证书.crt
openssl x509 -req -in my.csr -out my.crt -signkey my.key -days 3650对于这条命令要注意以下几点
这个命令是openssl x509-req是参数和前面生成证书签名请求的openssl req命令不同。-signkey my.key配置清晰地表明使用自己的私钥进行签名。
3.5 可选直接同时生成私钥.key和自签名证书.crt
上述三步操作也可以通过一个命令一次完成
openssl req -x509 -newkey rsa:2048 -nodes -keyout my.key -out my.crt -days 3650 -subj /CCN/STshanghai/Lshanghai/Oexample/OUit/CNdomain1/CNdomain2这个命令要和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 /CCN/STshanghai/Lshanghai/Oexample/OUit/CNdomain1/CNdomain2可以看到私有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 /CCN/STshanghai/Lshanghai/Oexample/OUit/CNdomain1/CNdomain24.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
申请人信息格式是 /CCN/OCorp/.../CNwww.ez.com可以使用 \ 转义不会跳过空格.-[digets] 指定签署请求时使用的信息摘要算法如 -md5-sha1-sha2566. 附录二openssl req的-subj参数说明
/C Country 国家
/ST State or Province 省
/L Location or City 城市
/O Organization 组织或企业
/OU Organization Unit 部门
/CN Common Name 域名或IP相关实操博文案例 B站视频教程 使用OpenSSL生成/签发证书步骤 openssl以及证书详解 opensll证书解析验证1 opensll证书及CRL生成