• 我们在哪一颗星上见过 ,以至如此相互思念 ;我们在哪一颗星上相互思念过,以至如此相互深爱
  • 我们在哪一颗星上分别 ,以至如此相互辉映 ;我们在哪一颗星上入睡 ,以至如此唤醒黎明
  • 认识世界 克服困难 洞悉所有 贴近生活 寻找珍爱 感受彼此

数字证书的生成与签名与解析

数据安全 云涯 4年前 (2019-12-04) 4360次浏览

数字证书

数字证书是指CA(电子认证服务)机构发行的一种电子文档,是一串能够表明网络用户身份信息的数字,提供了一种在计算机网络上验证网络用户身份的方式,因此数字证书又称为数字标识。数字证书对网络用户在计算机网络交流中的信息和数据等以加密或解密的形式保证了信息和数据的完整性和安全性。
数字证书从本质上来说是一种电子文档,是由电子商务认证中心(以下简称为CA中心)所颁发的一种较为权威与公正的证书。CA中心采用的是以数字加密技术为核心的数字证书认证技术,通过数字证书,CA中心可以对互联网上所传输的各种信息进行加密、解密、数字签名与签名认证等各种处理,同时也能保障在数字传输的过程中不被不法分子所侵入,或者即使受到侵入也无法查看其中的内容。
数字证书的基本架构是公开密钥PKI,即利用一对密钥实施加密和解密。其中密钥包括私钥和公钥,私钥主要用于签名和解密,由用户自定义,只有用户自己知道;公钥用于签名验证和加密,可被多个用户共享。
数字证书可被应用到安全电子邮件、安全终端保护、代码签名保护、可信网站服务以及身份授权管理[1]等方面。

目录

1 数字证书格式分析

2 数字证书整体流程

         2.1 数字证书制作流程

        2.2 数字证书验证流程

     2.3 HTTPS通信过程

2.4 程序签名过程

   2.5 代码签名时间戳

3 数字证书的实现过程

3.1 Ubuntu系统环境以及OpenSSL制作数字证书

3.2 利用Windows系统环境为软件制作数字证书

4 附录

4.1 数字证书应用

4.2 openssl参数说明

4.3 makecert.exe参数说明

4.4 参考网址

1、 数字证书格式分析

在数字信息领域,数字证书的格式一般采用 X.509 国际标准。分析存储在IE当中的一个数字证书,主要包含如下内容:

版本号: 指出该证书使用了哪种版本的X.509标准,即用来区分X.509的不同版本号。

序列号:由CA认证中心给每一个证书分配的唯一数字型编号。

签名算法:用来指定CA认证中心签发证书时所使用的签名算法。如:sha1RSA,表明生成数字签名时所使用的散列算法是sha1,而对散列得到的散列值进行加密所使用的是RSA算法。

颁发者:颁发该证书的机构CA的名字,指出了为证书签名的可信任源。

有效期起始日期:该证书可用的起始日期。

有效期终止日期:该证书可以使用的截止日期,由起始日期和终止日期一起规定了该证书的有效期。

主题信息:该证书所标识的个人或者实体就是主题。

公钥:和该主题的私钥相对应的公钥。

扩展信息:在不改变证书格式的前提下附加标识信息,可能包含证书的约束,密钥用途等内容。

通过以上分析,得出一般的X.509证书格式内容如图1。

 images

图 1 X.509 证书的格式

2、数字证书整体流程

1. 数字证书制作流程

签名就是在信息的后面再加上一段内容,可以证明信息没有被修改过。一般是对信息做一个hash计算得到一个hash值,注意,这个过程是不可逆的,也就是说无法通过hash值得出原来的信息内容。在把信息发送出去时,把这个hash值加密后做为一个签名和信息一起发出去。 接收方在收到信息后,会重新计算信息的hash值,并和信息所附带的hash值(解密后)进行对比,如果一致,就说明信息的内容没有被修改过,因为这里hash计算可以保证不同的内容一定会得到不同的hash值,所以只要内容一被修改,根据信息内容计算的hash值就会变化。当然,不怀好意的人也可以修改信息内容的同时也修改hash值,从而让它们可以相匹配,为了防止这种情况,hash值一般都会加密后(也就是签名)再和信息一起发送,以保证这个hash值不被修改。
经过以上对数字证书格式的分析,为了得到相应的数字证书,大致制作流程如图2。

images

图2 数字证书的制作流程

2. 数字证书验证流程

主体将其证书下发到客户端①;客户端使用操作系统内置的CA根证书对签名部分进行解密获得散列算法与散列值②;客户端对证书主体部分使用该散列算法计算出另一个散列值③;比较两个散列值;若散列值相等即可验证主体发过来的证书中的公钥属于主体且真实有效。
images

图3 证书验证流程

3. HTTPS通信过程

“客户”向“服务器”(主体)发送连接请求后,“服务器”将其证书下发到“客户”;“客户”验证数字证书是否属于服务器;检查数字证书后,“客户”会发送一个随机的字符串给“服务器”,“服务器”用私钥去加密,“服务器”把加密的结果返回给“客户”,“客户”用公钥解密这个返回结果,如果解密结果与之前生成的随机字符串一致,那说明对方确实是私钥的持有者,或者说对方确实是“服务器”。验证“服务器”的身份后,“客户”生成一个对称加密算法和密钥,用于后面的通信的加密和解密。这个对称加密算法和密钥,“客户”会用公钥加密后发送给“服务器”,别人截获了也没用,因为只有“服务器”手中有可以解密的私钥。这样,“服务器”和“客户”就都可以用对称加密算法来加密和解密通信内容了。
images

图4 HTTPS通信过程

4. 程序签名过程

  • 首先CA为证书申请主体颁布子证书以及公钥。

images

图5 CA颁布子证书

  • 主体利用该子证书为程序进行签名。

images

图6 程序签名

  • 客户端验证程序客户端在获得程序内证书后会利用CA根证书对证书(公钥)进行验证①②③④;在验证程序内部证书的公钥真实有效后会进行对程序散列值的验证⑤;客户端使用公钥对程序签名部分进行解密获得散列算法与散列值,之后客户端会计算程序的散列值,将二者散列值进行对比即可验证程序是否真实有效。

images

图7 程序验证流程

5.代码签名时间戳

代码签名证书是保护软件代码的完整性,免受第三方的修改以及损坏。代码签名证书最重要的部分之一是时间戳,即使证书到期后,软件和用户也可以识别有效的代码签名证书。

可信时间戳是由权威可信时间戳服务中心签发的一个能证明数据电文(电子文件)在一个时间点是已经存在的、完整的、可验证的,具备法律效力的电子凭证,可信时间戳主要用于电子文件防篡改和事后抵赖,确定电子文件产生的准确时间。

时间戳会一直留在软件上的签名,在代码签名证书过期后,保证软件仍旧被操作系统或其他平台兼容,并能正常运行。每次用户运行时,系统都会检查可执行文件上的签名。当签名被检验时,时间戳会允许系统检查签名的有效性,而不是签名时间,或软件运行的当前时间。如果没有时间戳,签名就会根据当前日期进行检测。如果软件的代码签名证书过期并且没有时间戳的话,软件将突然停止为所有用户工作。

对于大多数软件开发者说来,都希望其开发的软件能够被用户长期使用。因此代码签名证书的时间戳具有重要的功能,因为它可确保软件能长期运行。

3、数字证书的实现过程

对照上面的制作流程,制作数字证书的工具可以采用OpenSSL,它是由Eric A.Young和Tim J.Hudson在1995年开始开发,后来不断发展更新。OpenSSL 包含SSL库、加密算法库以及应用程序3大部分,并提供了测试程序和一些应用例子,实现了SSL/TLS协议及相关的PKI标准。

1. Ubuntu系统环境以及OpenSSL制作数字证书

以下将详细讨论利用Ubuntu系统环境以及OpenSSL制作数字证书的方法。
采用Ubuntu系统搭建CA服务器,使用OpenSSL生成CA的私钥以及根证书。将所生成的密钥放置在自建文件夹/etc/CA/下,同时需要创建CA的一些标准文件夹private(存放CA私钥)、index.txt(证书索引数据库文件)、serial(证书序列号文件)、crl(证书吊销文件夹)

(1) 生成CA密钥

sudo openssl genrsa -out /etc/CA/private/ca_key.pem 2048 [2]
images

图8 生成CA私钥

(2) 自签证书

CA需使用自身私钥进行自签证书作为证书链的根证书。该步骤过程中需要填写一些基本信息。

sudo openssl req -new -x509 -key /etc/CA/private/ca_key.pem -out /etc/CA/ca_cert.pem -days 1000 [2]
images

图9 CA自签证书

(3) 节点生成私钥

在另一ubuntu系统上搭建子节点作为证书申请部门。创建/etc/httpd文件夹保存节点信息。
images

图10 节点生成私钥

(4) 节点生成证书请求

sudo openssl req -new -key /etc/httpd/private/httpd.key -out /etc/httpd/httpd.csr [2]
images

图11 节点生成证书请求

(5) 将签署请求文件发送给CA服务器

images

图12 将签署请求文件发送给CA服务器

(6) 在CA服务器上签署证书

CA服务器接收到节点的证书请求后,开始使用根证书签署节点证书。
(在此之前需设置openssl.cnf文件)
images

图13 在CA服务器上签署证书

(7) 将已签名的节点证书发送给请求者

2. 利用Windows系统环境为软件制作数字证书

以下将详细讨论利用Windows系统环境为软件制作数字证书的方法。
采用Windows7系统环境以及微软制作证书相关工具(makecert.exe、signer.exe、chktrust.exe)进行。

(1) 生成CA密钥以及自签证书

makecert -sv “myroot.pvk” -ss mycert -n “CN=公司名称” -r myroot.cer [3]
images

图14 生成CA密钥以及自签证书

(2) 制作子证书

makecert -sv “test.pvk” -iv myroot.pvk -n “CN=公司名称” -$ commercial -ic myroot.cer test.cer
images
images

图15 生成子证书

(3) 为程序进行签名

使用signcode.exe进行为程序进行签名。
images

图16 选择签名文件

images

图17 选择证书(test.cer)

images

图18 选择密钥(test.pvk)

images

图19 选择hash算法

images

图20 签名成功

images

images

图21 安装根证书

images

图22 程序证书

(4) 验证证书

使用chktrust.exe进行验证,受信任程序如图23所示,改动后的文件不受信任,如图24所示。
images

图23 受信任程序

images

图24 不受信任程序

4、数字证书的解析

1. JS脚本解析

从“—–BEGIN CERTIFICATE—–”开始到“—–END CERTIFICATE—–”是证书的明文格式经过ASN.1编码再经过Base64编码得到。所以针对base64编码的证书先base64解码再ASN.1解码。

images

图25 数字证书证书JS解析[5]

2.python PyOpenSSL解析

官方网址:https://www.pyopenssl.org/en/stable/api.html

import OpenSSL
from dateutil import parser

初始化对象
cert=OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM,open(r”.\result\certificate_file\yunyawu.top\1294797009.crt”).read())

 

get_issuer()表示证书颁发者:certIssue = cert.get_issuer()

获得颁发者:
print (“颁发者:              “,certIssue.commonName)

print(“CN : 通用名称  OU : 机构单元名称”)
print(“O  : 机构名    L  : 地理位置”)
print(“S  : 州/省名   C  : 国名”)
get_components()以2个元组的序列返回此名称的组成部分。
for item in certIssue.get_components():  print(item[0].decode(“utf-8″), ”  ——  “,item[1].decode(“utf-8”))
获得证书版本:

print (“证书版本:            “,cert.get_version() + 1)

获得证书序列号:(cert.get_serial_number()会返回十进制数据)
print (“证书序列号:          “,hex(cert.get_serial_number()))

获得签名算法:
print (“证书中使用的签名算法: “,cert.get_signature_algorithm().decode(“UTF-8”))

获取证书开始与到期时间:
datetime_struct = parser.parse(cert.get_notBefore().decode(“UTF-8”))
print (“有效期从:             “,datetime_struct.strftime(‘%Y-%m-%d %H:%M:%S’))
datetime_struct = parser.parse(cert.get_notAfter().decode(“UTF-8”))
print (“到:                   “,datetime_struct.strftime(‘%Y-%m-%d %H:%M:%S’))

判断证书是否过期:
print (“证书是否已经过期:      “,cert.has_expired())

判断公钥长度:
print(“公钥长度” ,cert.get_pubkey().bits())

判断公钥类型:
print(“公钥类型” ,cert.get_pubkey().type())

获得公钥的base64加密:
print(“公钥:\n” ,OpenSSL.crypto.dump_publickey(OpenSSL.crypto.FILETYPE_PEM, cert.get_pubkey()).decode(“utf-8”))

获得公钥扩展:

get_extension_count()获得扩展数,通过get_extension()里面添加索引来获得需要的扩展
print(‘X509v3 Subject Key Identifier:’,str(cert.get_extension(1)))
# for index in range(get_extension_count()):
#             ext = cert.get_extension(index)

附录

[1] 数字证书应用

1. 安全电子邮件

电子邮件中使用数字证书可以建构安全电子邮件证书,主要用户加密电子邮件的传输,保护电子邮件在传输和接收过程中的安全。安全电子邮件证书主要有证书持有者的CA机构的签名、电子邮件地址和公开密钥这些信息。一方面,数字证书与电子邮件结合后,就可以在安全电子邮件证书的加密和数字签名技术的保护下,实现电子邮件的安全传输和接收,保证了电子邮件的安全性和完整度。同时,也保证了电子邮件传输方和接收方信息的真实性。另一方面,安全电子邮件证书中包括公开密钥这一信息,就能够确保电子邮件不被更改,因为只有知道公开密钥才能使用电子邮件。

2. 安全终端保护

首先,使用正版的软件和硬件,正确配置系统和网络并定期进行检查,防止终端配置被非法篡改。其次,利用网络安全技术如防火墙对内外网络进行实质性的隔离。同时,及时更新病毒库和防病毒软件,对终端系统实时进行病毒和安全漏洞的扫描,加强对终端系统的安全保护。一旦发现可疑信息,就要立即重点监控,防止其带来的影响和破坏。最后,加强访问终端的控制,利用加密和认证等手段加强信息破解的难度。用户可以设置一个以数字证书为主的系统登录方式,加上动态加密,就可以实现对系统的验证,没有权限的用户就无法进入终端系统的访问,拥有权限的用户就符合了访问的要求,保证了访问终端的一致性。另外还要做到终端网络和主网络的分离,减少两者之间的数据交叉和结合,也避免了终端网络和主网络的相互影响,减少风险。

3. 代码签名保护

用户对软件进行分享时,软件的接收和使用过程中存在着很多不安全因素,即使软件供应商能够保证软件自身的安全性,但也无法抵制盗版软件和网络本身存在的不安全因素带来的不利影响。通过对代码的数字签名来标识软件来源以及软件开发者的真实身份,保证代码在签名之后不被恶意篡改。使用户在下载已经签名的代码时,能够有效的验证该代码的可信度。

4. 可信网站服务

我国网站的数量伴随着计算机网络技术的发展呈现出日益增长的趋势,其中的恶意网站、钓鱼网站和假冒网站也越来越多,这就增加了用户对它们识别的难度,一不小心就会将自身的数据信息泄漏,严重影响了网络的安全。当用户对所使用的网站存在疑虑,不确定其中是否有被篡改和侵袭时,就可以利用数字证书的技术。通过数字证书技术,就可以对不确定的网站先进行验证和检查,增加了使用安全网站的机率,也避免了恶意网站、钓鱼网站和假冒网站等对网络造成的损失

5. 身份授权管理

授权管理系统是信息系统安全的重要内容,对用户和程序提供相对应的授权服务,授权访问和应用的方法,而数字证书必须通过计算机网络的身份授权管理后才能被应用。因此,要保证身份授权管理工具的安全性。当系统双方相互认同时,身份授权系统的工作才能展开。同时,正确使用数字证书,适当授权,完成系统的用户认证,才能切实保护身份授权管理系统的安全性。

[2] openssl参数说明

genrsa:生成私钥;
-out:私钥的存放路径,cakey.pem:为密钥名,与配置文件中保持一致;
2048:密钥长度,默认为1024;
req:生成证书签署请求;
-x509:生成自签署证书;
-days n:证书的有效天数;
-new:新请求;
-key /path/to/keyfile:指定私钥文件;
-out /path/to/somefile:输出文件位置。

[3] makecert.exe参数说明

sv-私钥文件名;
ss-主题的证书存储名称;
n-证书颁发对象;
r-证书存储位置;
iv-根证书的私钥文件;
ic-颁发者的证书存储位置;
-$-授权范围(用于代码签名);

[4]  https://www.cnblogs.com/franson-2016/p/5530671.html

[5]  https://lapo.it/asn1js/ (数字证书解析的JS源码)


云涯历险记 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:数字证书的生成与签名与解析
喜欢 (0)