SSL 数字证书的标准、编码以及文件扩展名

2024-05-27 07:32

本文主要是介绍SSL 数字证书的标准、编码以及文件扩展名,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

https://kangzubin.cn/certificate-format/?utm_source=tuicool&utm_medium=referral

你是否经常像我一样对于 SSL 数字证书的各种编码格式和扩展名诸如 .pem、.der、.crt、.cer、.csr、.p12、X.509 等表示很困惑,这篇文章将告诉你答案。

我们知道,在 HTTPS(HTTP over SSL)请求的 SSL 握手阶段,服务端以数字证书的方式将 RSA 公钥传给客户端,以保证公钥在传输过程中不被篡改,而公钥将用于加密后续数据传输对称加密的密钥(以后再细讲这一过程)。

SSL 数字证书的主要目的是用于传递服务端公钥,我们下面来了解一下证书的标准、编码格式以及常见的文件扩展名。

证书标准

  • X.509 数字证书标准,定义证书文件的结构和内容,详情参考 RFC5280。SSL 数字证书通常采用这种标准,一般由用户公共密钥和用户标识符组成,此外还包括版本号、证书序列号、CA 标识符、签名算法标识、签发者名称、证书有效期等信息。一个 X.509 标准的 SSL 数字证书包含(但不限于)以下的字段:
字段 说明
Suject Name 证书持有者的相关信息(国家/地区、组织、单位、CN)
Issuer Name 证书颁发者的相关信息(国家/地区、组织、单位、CN)
Common Name Subject Name 和 Issuer Name 信息里都包含一个常用名称字段(Common Name, CN),对于 CA 证书而言,该字段表示 CA 机构的名称,对于用户证书而言,通常是相应的域名。
Serial Number CA 机构给该证书的唯一序列号
Not Valid Before 证书生效日期
Not Valid After 证书失效日期
Public Key 服务端公开的密钥(RSA 公钥)
Signature Algorithm 签名所使用的算法(SHA-1,SHA-256 等)
Signature CA 机构给该证书的签名,用于验证证书是否被篡改

下图就是我个人博客 kangzubin.cn 域名下的数字证书,可通过 Chrome 浏览器查看其详细内容。

Certificate

证书的编码格式

X.509 标准的证书文件具有不同的编码格式,一般包括 PEM 和 DER 两种。

  • PEM: Privacy Enhanced Mail 的缩写,以文本的方式进行存储。它的文件结构以 -----BEGIN XXX-----,并以 -----END XXX----- 结尾,中间 Body 内容为 Base64 编码过的数据。

例如,以 PEM 格式存储的证书结构大概如下:

     
1
2
3
4
5
     
-----BEGIN CERTIFICATE-----
Base64编码过的证书数据
-----END CERTIFICATE-----

通过如下 OpenSSL 命令可以查看其证书内容:

     
1
     
openssl x509 -in xxx.pem -text -noout

它也可以用来编码存储公钥(RSA PUBLIC KEY)、私钥(RSA PRIVATE KEY)、证书签名请求(CERTIFICATE REQUEST)等数据。

一般 Apache 和 Nginx 服务器应用偏向于使用 PEM 这种编码格式。

  • DER: Distinguished Encoding Rules 的缩写,以二进制方式进行存储,文件结构无法直接预览,同样可以通过如下 OpenSSL 命令查看其证书内容:
     
1
     
openssl x509 -in xxx.der -inform der -text -noout

一般 Java 和 Windows 服务器应用偏向于使用 DER 这种编码格式。

当然同一 X.509 证书的不同编码之间可以互相转换:

  • PEM 转为 DER:
     
1
     
openssl x509 -in xxx.pem -outform der -out xxx.der
  • DER 转为 PEM:
     
1
     
openssl x509 -in xxx.der -inform der -outform pem -out xxx.pem

证书的几种文件扩展名

证书文件扩展名是比较误导人的地方,我之前也一直没搞明白!

如上所述,对于 X.509 标准的证书两种不同编码格式,一般采用 PEM 编码就以 .pem 作为文件扩展名,若采用 DER 编码,就应以 .der 作为扩展名。但常见的证书扩展名还包括 .crt.cer.p12 等,他们采用的编码格式可能不同,内容也有所差别,但大多数都能互相转换,现总结如下:

  • .pem: 采用 PEM 编码格式的 X.509 证书的文件扩展名;
  • .der: 采用 DER 编码格式的 X.509 证书的文件扩展名;
  • .crt: 即 certificate 的缩写,常见于类 UNIX 系统,有可能是 PEM 编码,也有可能是 DER 编码,但绝大多数情况下此格式证书都是采用 PEM 编码
  • .cer: 也是 certificate 的缩写,常见于 Windows 系统,同样地,可能是 PEM 编码,也可能是 DER 编码,但绝大多数情况下此格式证书都是采用 DER 编码
  • .p12: 也写作 .pfx,全称:PKCS #12,是公钥加密标准(Public Key Cryptography Standards,PKCS)系列的一种,它定义了描述个人信息交换语法(Personal Information Exchange Syntax)的标准,可以用来将包含了公钥的 X.509 证书和证书对应的私钥以及其他相关信息打包,进行交换。简单理解:一份 .p12 文件 = X.509 证书+私钥
  • .csr: Certificate Signing Request 的缩写,即证书签名请求,它并不是证书的格式,而是用于向权威证书颁发机构(Certificate Authority, CA)获得签名证书的申请,其核心内容包含一个 RSA 公钥和其他附带信息,在生成这个 .csr 申请的时候,同时也会生成一个配对 RSA 私钥,私钥通常需要严格保存于服务端,不能外泄。
  • .key: 通常用来存放一个 RSA 公钥或者私钥,它并非 X.509 证书格式,编码同样可能是 PEM,也可能是 DER,查看方式如下:
     
1
2
     
PEM 编码格式:openssl rsa -in xxx.key -text -noout
DER 编码格式:openssl rsa -in xxx.key -text -noout -inform der

以上。

在下一篇博文,我将详细地介绍 iOS 开发中遇到的 HTTPS、SSL/TLS 握手、RSA 加密/解密、数字证书的 CA 签发与校验过程、中间人攻击、SSL Pinning 与 HTTPS 双向验证等技术的概念与实现。

参考

  • X.509
  • PKCS #12
  • 那些证书相关的玩意儿
  • 证书编码以及文件格式汇总
  • http://bbs.csdn.net/topics/190044123

这篇关于SSL 数字证书的标准、编码以及文件扩展名的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1006830

相关文章

Python如何获取域名的SSL证书信息和到期时间

《Python如何获取域名的SSL证书信息和到期时间》在当今互联网时代,SSL证书的重要性不言而喻,它不仅为用户提供了安全的连接,还能提高网站的搜索引擎排名,那我们怎么才能通过Python获取域名的S... 目录了解SSL证书的基本概念使用python库来抓取SSL证书信息安装必要的库编写获取SSL证书信息

VSCode中C/C++编码乱码问题的两种解决方法

《VSCode中C/C++编码乱码问题的两种解决方法》在中国地区,Windows系统中的cmd和PowerShell默认编码是GBK,但VSCode默认使用UTF-8编码,这种编码不一致会导致在VSC... 目录问题方法一:通过 Code Runner 插件调整编码配置步骤方法二:在 PowerShell

C++ Primer 标准库vector示例详解

《C++Primer标准库vector示例详解》该文章主要介绍了C++标准库中的vector类型,包括其定义、初始化、成员函数以及常见操作,文章详细解释了如何使用vector来存储和操作对象集合,... 目录3.3标准库Vector定义和初始化vector对象通列表初始化vector对象创建指定数量的元素值

Python如何实现读取csv文件时忽略文件的编码格式

《Python如何实现读取csv文件时忽略文件的编码格式》我们再日常读取csv文件的时候经常会发现csv文件的格式有多种,所以这篇文章为大家介绍了Python如何实现读取csv文件时忽略文件的编码格式... 目录1、背景介绍2、库的安装3、核心代码4、完整代码1、背景介绍我们再日常读取csv文件的时候经常

nginx生成自签名SSL证书配置HTTPS的实现

《nginx生成自签名SSL证书配置HTTPS的实现》本文主要介绍在Nginx中生成自签名SSL证书并配置HTTPS,包括安装Nginx、创建证书、配置证书以及测试访问,具有一定的参考价值,感兴趣的可... 目录一、安装nginx二、创建证书三、配置证书并验证四、测试一、安装nginxnginx必须有"-

python实现简易SSL的项目实践

《python实现简易SSL的项目实践》本文主要介绍了python实现简易SSL的项目实践,包括CA.py、server.py和client.py三个模块,文中通过示例代码介绍的非常详细,对大家的学习... 目录运行环境运行前准备程序实现与流程说明运行截图代码CA.pyclient.pyserver.py参

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return