证书链是什么链么,能发币么?
我日常工作中,总要在手机里备一份CA的证书链文件,经常有人要我发一份我们的证书链文件。这时候我想说,“我们是权威的政务服务电子认证机构,我们的证书链是可以从网上下载到的。"
不要懵,证书链通常都是公开,不需要保密!此时你是不是感到疑惑,通常我们的证书不都是存在U盾中的么,怎么能轻易交给别人?
为了说明这些问题,我要讲一些概念。本着越基础,越不好讲的原则,我从公钥算法讲起,还有数字签名、PKI,还要介绍一下区块链、电子证照、密码机、签名验签服务器、和USBkey等概念。
公钥算法
公钥算法是一种加密算法。加密算法分为对称加密和非对称加密算法,非对称加密算法又称为公钥算法。
对称加密的关键在密钥。传递加密数数据,Alice选取密钥key,加密明文发送给Bob,Bob采用相同的key解密数据。
使用对称密钥时,通信双方必须拥有相同的密钥。通常,对称密钥采用线下方式进行分发,或者采用一种可靠方式进行分发。例如,Alice和Bob坐在一起,共同选择了一个密钥,这个密钥用来做数据加密。
这个简单的分配密钥的方式,不适合规模较大的群体。群体中,要求每2个的通信内容其他人都不能解密。以3个人为例,A、B、C三个人,需要分配AB/AC/BC3个密钥;当系统中有N个人时,需要分配 N*(N-1)/2个密钥,每个人都要保存与其他N-1个人通信的密钥。此时,需要密钥服务中心为用户生成分配管理密钥,依靠个体用户自身很难管理。
以上就是对称密钥算法的难题,对称密钥分发。
非对称密钥就解决了密钥分发的问题,每个人的密钥都是由2个密钥组成。即Alice有一个公钥一个私钥,Bob有一个公钥一个私钥。
公私钥的用法:用一个人的公钥加密,必须用这个人的私钥解密;用私钥加密,必须用公钥解密。即一个人的公钥和私钥,互为加解密密钥。关于公钥应用协议,会用到多人的密钥,概念变复杂容易混淆,但是要把握“一个人的公私钥互为加解密密钥”的原理。
公私钥通常由Alice和Bob自己产生,此时只有自己知道自己的公钥和私钥,为了实现保密通信,必须公布自己的公钥。公布公钥可以多种方式,只要可以公开读取就可以。
保密通信的例子,Alice和Bob已公开了自己的公钥,Alice用Bob的公钥加密数据,加密后的数据只有Bob的私钥解密,其他人截获了密文也无法解密。(真实情况Alice用Bob的公钥加密一个会话密钥,Alice和Bob用会话密钥加密通信内容,因为公钥加密算法效率低)
利用公钥算法实现加密数据通信,要求公布个人的公钥,且只能自己拥有私钥。
数字签名
数字签名是一种基于公钥的抗抵赖技术。Alice和Bob签订一份合同,合同内容是:Bob有一个软件的开发需求,共列了10项软件的feature,并承若支付给Alice 3万块钱。Alice担心软件开发完成,Bob不履行合同,或少支付开发费用,要求Bob对合同进行数字签名。
Bob用自己的私钥,对合同文件进行加密,得到密文发给Alice。Alice收到密文后,用Bob的公钥进行解密运算,得到了合同的原文,到此Alice就已经可以确定Bob已经完成了合同的数字签名。
当Bob抵赖,不履行合同时。Alice到仲裁机构,出示Bob的密文,和Bob的公钥,仲裁机构用Bob的公钥解密密文,得到合同原文。仲裁机构认定,因为公钥解密了合同密文,密文一定是由原文经过Bob的私钥加密生成的。因此仲裁机构推断认定,Bob是与Alice签订了合同。
这个例子,说明了通过数字签名可以确定1.信息的来源2.发生纠纷时,信息源不能抵赖。
通常,标准的数字签名要首先对原文HASH,然后对hash结果进行签名(hash可以压缩签名信息的长度)。校验数字签名时,对原文进行hash,和解密hash进行比较,当两个结果相同时证明数字签名有效,说明签名者确认过原文档,且不可抵赖。
PKI体系
上面将的数字签名是否还要问题?当Bob声称Alice提供的公钥不是自己的公钥,而是Alice让黑客篡改了公开系统,并用伪造的私钥对合同进行数字签名的。上面的问题核心,是如何确定Bob的公钥,且Bob不能抵赖。
下面介绍一下有权威机构的公钥体系PKI,Bob申请数字证书的流程:
1.Bob自己生成一对随机的公私钥,私钥自己保留。
2.将Bob的个人信息和公钥,放在一个请求文件中,发送给CA。
3.CA通过严格的流程确定Bob的身份,例如提交身份证证明,或者要求所在单位出具证明。
4.CA用自己的私钥,将Bob的请求文件进行数字签名,将Bob个人信息、Bob公钥、CA生成的签名这3个信息打包成一个证书文件。
此时公钥公布系统,变成了公钥证书公布系统。当Alice验证Bob的合同时,经过2个步骤:
1.验证Bob的数字证书。验证证书的过程,就是验证数字签名的过程。首先用CA的公钥解密证书中的签名,计算证书中信息的hash值,比较hash和解密签名结果,不相符即证书被篡改过。
2.验证合同的数字签名。用Bob的公钥证书,验证合同的数字签名,与没有PKI时验证过程相同。
理清一下公钥证书、私钥、数字签名的关系,如图:
在这个例子中,根CA的公钥证书和运行CA的公钥证书,就是验证合同签名的证书链。
GMSSL中调用签名和验签的例子:
$ gmssl sm2utl -sign -in msg.txt -inkey sm2.pem -id Alice -out sig.der
$ gmssl sm2utl -verify -in msg.txt -sigfile sig.der -pubin -in sm2Pub.pem -id Alice
区块链
在比特币中,验证一笔交易就是检验交易的数字签名,采用交易账户拥有者的公钥进行验签。
在比特币上,没有PKI系统,公钥信息即账户主题,公钥对应的私钥即用来进行数字签名。
电子证照
电子证照即机构对文档进行数字签名,通过验证数字签名就可以验证证照信息。
密码机和签名验签服务器
在GMSSL的例子中,gmssl sm2utl -sign定义了签名接口。
密码机和签名验签服务器,就是硬件密码运算设备,向应用提供API,完成各种密码算法。
签名验签服务器,比密码机多提供签名和验签接口。密码机更多是底层Api,如sm2 公钥加密,sm3哈希,sm4加密等。
USBKey
上面的例子看到,Bob的私钥是非常重要的,不能泄露给别人。
USBKey就是可以用来存储私钥,并且要求私钥不能拷贝出来,只能在USBKey中执行运算。通常key还用口令方式加密存储,进行运算时要先输入pin码,解密后才能用来运算。