目录
1 数字证书简介
1.1 什么是数字证书
要开车得先考驾照,驾照上面记有本人的照片、姓名、出生日期等个人信息,以及有效期、准驾车辆的类型等信息,并由公安局在上面盖章。我们只要看到驾照,就可以知道公安局认定此人具有驾驶车辆的资格。
公钥证书(Public-Key Certificate,PKC)其实和驾照很相似,里面记有姓名、组织、邮箱地址等个人信息,以及属于此人的公钥,并由认证机构(Certification Authority、Certifying Authority,CA)施加数字签名。只要看到公钥证书,我们就可以知道认证机构认定该公钥的确属于此人。公钥证书也简称为证书(certificate)。
1.2 为什么需要数字证书
用数字签名既可以识别出篡改和伪装,还可以防止否认。也就是说,我们同时实现了确认消息的完整性、进行认证以及否认防止。现代社会中的计算机通信从这一技术中获益匪浅。
然而,要正确使用数字签名,有一个大前提,那就是用于验证签名的公钥必须属于真正的发送者。即便数字签名算法再强大,如果你得到的公钥是伪造的,那么数字签名也会完全失效。
现在我们发现自己陷入了一个死循环一一数字签名是用来识别消息篡改、伪装以及否认的,但是为此我们又必须从没有被伪装的发送者得到没有被篡改的公钥才行。
为了能够确认自己得到的公钥是否合法,我们需要使用证书。所谓证书,就是将公钥当作一条消息,由一个可信的第三方对其签名后所得到的公钥。
1.3 数字证书的格式
目前使用的数字证书格式遵循X.509标准;X.509定义了公钥证书结构的基本标准;X.509证书格式当前的版本是X.509v3。
2 OpenSSL代码实现
2.1 生成X.509证书
/***************************************************
功 能:生成X.509证书
参 数:pemFileName - [out] 生成证书文件路径(*.cer)
pubKey - [in] 申请证书单位的公钥(PKCS#8-PEM编码)
pubLen - [in] 申请证书单位的公钥长度
priKey - [in] 签名证书机构的私钥(PKCS#8-PEM编码)
priLen - [in] 签名证书机构的私钥长度
cerId - [in] 证书id
validFrom - [in] 证书有效期开始时间(注意:是格林威治标准时间,与我们东八区差8个小时)
年月日时分秒Z 如20240714151314Z
validTo - [in] 证书有效期截止时间: 年月日时分秒Z 如20250714151314Z
issuerCN - [in] 颁发者 CN(Common Name)通用名称 如:MIAXIS MOSIP CA
issuerOU - [in] 颁发者 OU(Organizational Unit name)机构单元名称 如:www.miaxis.com
issuerO - [in] 颁发者 O(Organization name)机构名 如:MIAXIS
issuerL - [in] 颁发者 L(Locality)地理位置 如:ZHANGZHOU
issuerST - [in] 颁发者 S(State or province name)州/省名 如:ZHEJIANG
issuerC - [in] 颁发者 C(Country)国名 如:CN
subjectCN - [in] 主题者 CN(Common Name)通用名称 如:MIAXIS MOSIP CA
subjectOU - [in] 主题者 OU(Organizational Unit name)机构单元名称 如:www.miaxis.com
subjectO - [in] 主题者 O(Organization name)机构名 如:MIAXIS