前言摘要

转换框架拓扑

cert_trans.svg

 

 

 

 

由于windows同时支持Base64/DER/pkcs12/pkcs7等编码方式的直接导出与转换(前提是扩展名要注意修改为常见的,否则默认双击打不开)

其中,windows中如果需要在导入证书时同时导入私钥,则需要先转换为pkcs12编码格式pfx才可以同时导入。单独导入证书不含私钥时,直接双击证书文件安装即可。

image-20220805101306268

证书管理

为方便验证,在此提供证书附件以供分析测试。

操作系统级

 

windows使用certmgr.msc管理证书

证书管理器或certmgr.msc。Windows中的certmgr.msc可让您查看有关证书,导出,导入,修改,删除或请求新证书的详细信息。根证书是用于管理网络认证和信息交换的数字文档。

image-20220728085114709

导入导出操作演示

 

从浏览器导出网站证书

点击浏览器小锁图标,复制到文件,弹出证书导出向导...

image-20220728103909621

 

从证书管理控制台导出

image-20220728085927691

image-20220728104351615.png

 

从证书控制台导入或从本地导入

image-20220728085927691

 

image-20220728103259402

证书的编码格式

首先证书的扩展名不重要,关键是看打开的程序怎么或能否实别文件内容。

不同编码格式都只是一种对原始数据的封装结果,与你肉眼看的是纯文本格式或二进制无关。说到这里,你会发现就像视频文件格式那样封装的格式又被称为数据的容器。其实你并没有直接看到原始数据(在计算机中是二进制),它却以多种编码形式在传播。下面介绍一般性的扩展名定义。

 

编码形式介绍

 

从Base64编码格式说起

https://blog.csdn.net/linux_tcpdump/article/details/122136274

 

在windows中DER或Base64编码的证书不论是以.crt.cer作为扩展名在双击或右键证书文件安装证书时都能自动识别。

https://blog.csdn.net/xiangguiwang/article/details/76400805

 

image-20220728095302191

编码格式区别

由Public Key Cryptography Standards #12,PKCS#12标准定义,包含了公钥和私钥的二进制格式的证书形式,以pfx作为证书文件后缀名。

公钥加密技术12号标准(Public Key Cryptography Standards #12,PKCS#12)为存储和传输用户或服务器私钥、公钥和证书指定了一个可移植的格式。它是一种二进制格式,这些文件也称为PFX文件。开发人员通常需要将PFX文件转换为某些不同的格式,如PEM或JKS,以便可以为使用SSL通信的独立Java客户端或WebLogic Server使用。

在pfx证书的导入过程中有一项是“标志此密钥是可导出的。这将您在稍候备份或传输密钥”。一般是不选中的,如果选中,别人就有机会备份你的密钥了。如果是不选中,其实密钥也导入了,只是不能再次被导出。这就保证了密钥的安全。

如果导入过程中没有选中这一项,做证书备份时“导出私钥”这一项是灰色的,不能选。只能导出cer格式的公钥。如果导入时选中该项,则在导出时“导出私钥”这一项就是可选的。

如果要导出私钥(pfx),是需要输入密码的,这个密码就是对私钥再次加密,这样就保证了私钥的安全,别人即使拿到了你的证书备份(pfx),不知道加密私钥的密码,也是无法导入证书的。相反,如果只是导入导出cer格式的证书,是不会提示你输入密码的。因为公钥一般来说是对外公开的,不用加密

------------ pfx密钥 -----------

公钥 加密+验证签名

私钥 解密+签名

------------ pfx密钥 -----------

 

pfx 本来就不应该在网络上传播… 生成新的客户端证书只需要传 CSR, CER … 正确的过程应该是:

客户端: 生成私钥, 填写证书相关信息 CN/O/OU/EMail 等等, 用 私钥生成 证书请求 CSR …

把 CSR 通过网络发给 CA

CA: 对 CSR 进行签名, 生成 CER

CA 把证书发送回来

客户端: 打包私钥 + CER 为 PKCS#12 (pfx) 文件.

整个过程都不会传递私钥.


 

查看证书的信息(原数据)

前面的的编码说的是原始数据的封装编码格式,下面说明查看证书中的有效信息(程序实现)

在windows上查看一个网站的证书

不同的浏览器不同,点击网址栏中的小锁图片

image-20220728105902315

 

windows命令行查看

certutil命令是windows上的证书管理命令,支持文件转码

 

如前some.domain.crt.cer为Base64编码证书文件

certutil_verify_20220728_0001.svg

 

如前示例1111.cer为DER二进制编码格式

certutil_verify_20220728_0002.svg

openssl命令查看与转换证书

此工具在各平台都可以获取使用

 

Base64编码组合证书

在某些情况下,将多个X.509基础设施组合到单个文件中是有利的。一个常见的例子是将私钥和公钥两者结合到相同的证书中。

组合密钥和链的最简单的方法是将每个文件转换为PEM编码的证书,然后将每个文件的内容简单地复制到一个新文件中。这适用于组合文件以在Apache中使用的应用程序。

 

jks与pfx的关系与转换

jks是jdk(java虚拟机)用的keystore文件。

pfx是pkcs12加密标准下的证书格式。它是一种更加通用且广泛使用的格式。

PKCS#12是一种交换数字证书的加密标准,用来描述个人身份信息。如:用户公钥私钥、证书等。在密码学中,PKCS #12定义了一种存档文件格式,用于实现存储许多加密对象在一个单独的文件中。通常用它来打包一个私钥及有关的 X.509 证书,或者打包信任链的全部项目

下面是转换过程

 

 

在tomcat中配置的TLS证书时的参数对比

 

Linux中的证书管理

由于技术是相通的,不同平台只是实现上的区别,在此重点梳理开源平台下的技术细节。

 

pki

先来看一下目录树

pki 介绍

PKI是Public Key Infrastructure的首字母缩写,翻译过来就是公钥基础设施;PKI是一种遵循标准的利用公钥加密技术为电子商务的开展提供一套安全基础平台的技术和规范。PKI技术是一种遵循既定标准的密钥管理平台,它的基础是加密技术,核心是证书服务,支持集中自动的密钥管理和密钥分配,能够为所有的网络应用提供加密和数字签名等密码服务及所需要的密钥和证书管理体系。

 

 

 

CA系统

CA身份认证系统基于PKI理论体系构建,由认证服务器、管理服务器、客户端安全认证组件和SecurSecureKey(USB智能卡)组成,支持B/S结构和C/S结构的应用系统。

SecurSecureKey(USB智能卡):负责客户端的数字签名和加解密,也是用户数字证书和私钥的载体,同时私钥不出卡,不可复制。

客户端安全认证组件:负责提供客户端应用程序接口,完成对SecurSecureKey的驱动和访问,从而产生客户端用户认证请求。对于B/S结构的应用系统,提供浏览器安全插件,与浏览器无缝结合;对于C/S结构的应用系统,提供COM组件。

认证服务器:负责提供服务器端应用程序接口,并对客户端提交的用户认证请求进行认证,鉴别用户身份,控制用户对应用系统的访问。

管理服务器:包括用户管理、证书管理和SecurSecureKey管理等模块,完成用户授权、证书申请和SecureKey制作,并提供全面的系统管理和审计功能。

 

ca-diagram-b.png

包含内容作用 
安全服务器用于提供证书申请、浏览、证书撤消列表以及证书下载等安全服务 
CA服务器CA服务器是整个证书机构的核心,负责证书的签发 
登记中心RA登记中心服务器面向登记中心操作员,在CA体系结构中起承上启下的作用 
LDAP服务器LDAP服务器提供目录浏览服务,其他用户通过访问LDAP服务器就能够得到其他用户的数字证 书 
数据库服务器数据库服务器是认证机构中的核心部分,用于认证机构数据(如密钥和用户信息等)、日志和统计信息的存储和管理 

 

公钥与私钥

公钥算法与私钥算法

1、私钥算法

私钥加密算法,又称 对称加密算法,因为这种算法解密密钥和加密密钥是相同的。也正因为同一密钥既用于加密又用于解密,所以这个密钥是不能公开的。常见的有《DES加密算法》、《AES加密算法》。

2、公钥算法

公钥加密算法,也就是 非对称加密算法,这种算法加密和解密的密码不一样,一个是公钥,另一个是私钥:

公钥和私钥是相对的,两者本身并没有规定哪一个必须是公钥或私钥。

 

实现数据的安全传输

要实现数据的安全传输,当然就要对数据进行加密了。

如果使用对称加密算法,加解密使用同一个密钥,除了自己保存外,对方也要知道这个密钥,才能对数据进行解密。如果你把密钥也一起传过去,就存在密码泄漏的可能。所以我们使用非对称算法,过程如下:

  1. 首先 接收方 生成一对密钥,即私钥和公钥;
  2. 然后,接收方 将公钥发送给 发送方;
  3. 发送方用收到的公钥对数据加密,再发送给接收方;
  4. 接收方收到数据后,使用自己的私钥解密。

由于在非对称算法中,公钥加密的数据必须用对应的私钥才能解密,而私钥又只有接收方自己知道,这样就保证了数据传输的安全性。

img

 

对信息进行数字签名

除了保证数据的安全传输之外,公钥体系的另一个用途就是对数据进行签名。通常“数字签名”是用来验证发送方的身份并帮助保护数据的完整性。

例如:一个发送者 A 想要传些资料给大家,用自己的私钥对资料加密,即签名。这样一来,所有收到资料的人都可以用发送者的公钥进行验证,便可确认资料是由 A 发出来的了。(因为只有A使用私钥签名得到的信息,才能用这个公钥来解) 采用数字签名,可以确认两点:

  1. 保证信息是由签名者自己签名发送的,签名者不能否认或难以否认。
  2. 保证信息自签发后到收到为止未曾作过任何修改。

之所以可以确认这两点,是因为用公钥可以解密的必然是用对应的私钥加的密,而私钥只有签名者持有。

 

公钥算法的缺点

现实中,公钥机制也有它的缺点,那就是效率非常低,比常用的私钥算法(如 DES 和 AES)慢上一两个数量级都有可能。所以它不适合为大量的原始信息进行加密。为了同时兼顾安全和效率,我们通常结合使用公钥算法和私钥算法:

  1. 首先,发送方使用对称算法对原始信息进行加密。
  2. 接收方通过公钥机制生成一对密钥,一个公钥,一个私钥。
  3. 接收方 将公钥发送给 发送方。
  4. 发送方用公钥对对称算法的密钥进行加密,并发送给接收方。
  5. 接收方用私钥进行解密得到对称算法的密钥。
  6. 发送方再把已加密的原始信息发送给接收方。
  7. 接收方使用对称算法的密钥进行解密。

 

20181220103623967.gif

插图来源作者,更多插图详见作者博客链接查找

linux在中配置/etc/pki/tls/certs/ca-bundle.crt管理证书

 

ca-bundle.trust.crt持有带有“扩展验证”的证书。

“普通”证书与带有EV的证书之间的区别在于,您的EV证书需要个人或公司身份验证之类的内容,即通过其护照来验证某人的身份。

这意味着,如果您想获得ev证书,则必须通过您的护照向证书发行者标识自己。如果您“是”一家公司,则必须执行等效程序(不完全了解)。这对于在线银行至关重要:必须确保不仅连接的服务器经过认证,而且银行也经过认证。

因此,EV证书更加“复杂”,并且包含其他字段,不仅可以“标识”服务器,还可以“标识”公司。

回到您的答案:这取决于您的使用情况。大多数人应该使用ca-bundle.crt。如果您“是”需要非常高级别的认证和“信任”的银行或在线商店,则应使用ca-bundle.trust.crt。

 

容器证书管理类似于Linux方式

比如Alpine Linux

 

MAC OSX类似于Linux

 

其它类型

##

 

Java/JDK/JRE(虚拟机)中配置

用到的有tomcat等以JDK环境为运行基础的应用。

Keytool是一个Java数字证书的管理工具。jks = java keystore,后期升级并使用了PFX这一更加规范的编码格式。

 

-genkey: 在用户主目录中创建一个默认文件.keystore,还会产生一个mykey的别名作为缺省alias,mykey中包含用户的公钥、私钥和证书。没有指定目录,会生成在默认目录下。

-alias: 产生别名

-keystore: 指定秘钥库的名称。加上此命令,生成的各类信息将不在.keystore文件中

-keyalg: 指定秘钥的算法,默认DSA,可以设置成`RSA

-validity: 创建的证书有效期是多少天

-keysize: 指定秘钥长度

-storepass: 指定秘钥库的访问密码(查看秘钥库内容需要)

-keypass: 指定别名条目的密码(私钥的密码)

-dname: 指定证书拥有者的信息`CN=名字与姓氏,OU=组织单位名称,O=组织名称,L=城市或区域名称,ST=州或省份名称,C=单位的两字母国家代码

-list: 显示密钥库中的证书信息,例如keytool -list -v -keystore, -storepass指定密码

-v: 显示秘钥库中的证书详细信息

-export: 将别名指定的证书导出到文件,-alias指定导出的别名,-keystore指定keystore,-file指定导出证书的位置及证书名称,-storepass密码

-file: 指定导出文件的文件名

-delete: 删除秘钥库中某条目,keytool -delete -alias指定删除的别名

-printcert: 查看导出的证书信息keytool -printcert -file xxx.crt查看导出的证书信息

-keypasswd: 修改秘钥库中指定条目口令,-keypasswd -alias指定需要修改的别名,-keypass 旧密码 -new 新密码 -storepass keystore密码 -keystore xxx

-storepasswd``: 修改keystore口令,-storepasswd -keystore e:\sture.keystore(需修改口令的keystore) -storepass 123456(原始密码) -new 321(新密码)

-import: 将签名数字证书导入秘钥库keytool -import -alias指定导入条目的别名 -keystore-file指定导入的证书

 

certutil_verify_20220728_0004.svg

详细演示如下

 

certutil_verify_20220728_0003.svg

 

 

使用keytool将证书转换为Base64编码

 

 

 

 

tomcat中证书的使用说明

 

 

 

Web Server 中的配置

证书附件下载,包括如下截图中的所有类型。其实本质还是前面3种编码方式,有相当大的重复存在。

cert_manager_of_haudi.top_history_certs.zip

image-20220728143045012

image-20220728143344007

 

nginx

 

 

haproxy

 

 

tomcat

 

tomcat中配置的TLS证书时的参数对比

 

IIS

f80a581458d695fa54c4e36e7d65ca85.png

 

502fea86892d3390f73adc70fde2cb5a.png

6ff5a256f7b0f54449e2c9dc721571c6.png

 


 

罗列知识,检索便捷