从零学习 CA 系列 (二) -- PKI 标准分类

  1. 云栖社区>
  2. 博客>
  3. 正文

从零学习 CA 系列 (二) -- PKI 标准分类

ilufei2019 2017-09-04 10:00:00 浏览487
展开阅读全文

本文参考《PKI/CA 与数字证书技术大全》书籍,如有理解bug, 请大家指正。

PKI 标准

PKI 是 Public Key Infrastructure 的缩写 ,其主要的功能是绑定证书持有者的身份和相关的秘钥对(通过为公钥及相关的用户身份信息签发数字证书),为用户提供方便的证书申请、证书作废、证书获取、证书状态查询的途径,并利用数字证书及相关的各种服务实现通信中各实体的身份认证、完整性、抗抵赖性和保密性。

根据数字证书格式及密码管理方式的不同,PKI也包括很多模式,如x.509模式、PGP模式、IBE/CPK 模式、EMV模式等。x.509 模式的PKI也称为 PKIX。由于 x.509 标准已经成为数字证书格式的事实标准,因此大部分情况下 PKI 特指 PKIX 。

PKI 体系框架主要包括三个部分:

1. 数字证书与私钥

用户或系统只有拥有自己的公钥和私钥后,才能实现数字签名和加解密功能。由于公钥是随机生成的,因此从公钥无法直接判定属于哪个用户。
为解决公钥与用户的映射关系,PKI 引入了数字证书,用于建立公钥与用户之间的对应关系。数字证书实际上是一种特殊的文件格式,包含用户身份信息、用户公钥信息和CA私钥的数字签名。X.509 标准规定了数字证书的具体格式。数字证书中只包含公钥,并不包含私钥。由于数字证书中包含CA私钥的数字签名,因此数字证书具有防伪性。

2. 数字证书的管理

为解决数字证书的签发问题,PKI引入CA,对数字证书进行集中签发。CA也称为认证中心。CA中心拥有自己的公钥和私钥,使用其私钥给用户签发数字证书。
CA实际是一种特殊的公钥管理中心,为实现数字证书的安全性,对数字证书的全生命周期进行管理,主要包括:数字证书的签发和更新、数字证书的作废(注销、撤销或吊销)、数字证书的冻结(挂失)和解冻、数字证书的查询和下发、数字证书的状态查询等。
为了解决私钥备份与恢复问题,PKI 引入 KMC (Key Management Center),用于对私钥的全生命周期进行管理。用户公私钥对可由 KMC 产生,提交 CA 签发数字证书后,将私钥和数字证书同时安全的移交给用户,而 KMC 将私钥留作备份,可按需要给用户恢复。
为防止用户身份被冒用,应保证用户私钥的唯一性,不允许备份恢复。为防止公钥加密后的数据无法解密,应提供用户私钥的备份恢复机制。为解决这两种矛盾的应用需求,PKI引入双证书机制:签名证书和加密证书。签名证书及私钥只用于签名验证,不能用于加解密,该公私钥对必须由用户自己产生,KMC 不备份签名私钥。加密证书及私钥只用于加解密,不能用于签名验签,该公私钥对必须由KMC产生,且KMC对加密私钥进行备份。
为保证CA系统安全的前提下,为方便证书业务远程办理、方便证书管理流程与应用系统结合,PKI引入了RA,专门用于对用户提供面对面的证书业务服务,负责用户证书办理/作废申请、用户身份审核、制作证书并移交用户等功能,而涉及证书签发时则提交CA系统集中处理。

3. 数字证书的应用

基于数字证书可实现四种基本安全功能:身份认证、保密性、完整性和抗抵赖性。
基于证书接口中间件(模块或组件),应用系统可以很方便地使用数字证书技术,从而提高应用系统的身份认证强度、保证应用系统中各种敏感数据的保密性、保证应用系统中各种敏感数据和交易记录的完整性、用户各种操作或交易的不可否定性。

img_c82de32674e507d47392105281039315.jpe
PKI体系框架

如下是 双证书技术流程图:

img_09214dccee71eec839b67b3052e12d36.jpe
双证书技术流程图

PKI 标准

主分类为:国内标准和国际标准

  1. 国内标准 主要是国内制定的一套以 SM1, SM2, SM3, SM4 为基础的算法标准
  2. 国际标准 即PKCS 系列,是公钥密码标准,由美国RSA实验室与遍布全球的安全系统开发者一起合作制定的一组规范。PKCS系列主要包括如下标准:
  • PKCS#1: RSA Cryptography Standard (RSA密码标准)
  • PKCS#2: 已撤销,用以规范 RSA 加密摘要的转换方式,已并入 PKCS#1中
  • PKCS#3: Diffie-Hellman Key Agreement Standard (DH秘钥协商标准)
  • PKCS#4: 已撤销,用以定义 RSA 秘钥的格式,已并入 PKCS#1 中
  • PKCS#5: Password-Based Cryptography Standard (基于口令的密码标准)
  • PKCS#6: Extended-Certificate Syntax Standard (扩展证书语法标准)
  • PKCS#7: Cryptographic Message Syntax Standard (密码消息语法标准)
  • PKCS#8: Private-Key Information Syntax Standard (私钥信息语法标准)
  • PKCS#9: Selected Attribute Type (可供选择的属性类型)
  • PKCS#10: Certification Request Syntax Standard (证书请求语法标准)
  • PKCS#11: Cryptography Token Interface Standard (密码Token 接口标准)
  • PKCS#12: Personal Information Exchange Syntax Standard (个人信息交换语法标准)
  • PKCS#13: Elliptic Curve Cryptography Standard (椭圆曲线密码标准) 制定中;
  • PKCS#14: Pseudo-Random Number Generation(伪随机数生成算法PRNG)制定中;
  • PKCS#15: Cryptographic Token Information Format Standard (密码Token信息格式标准)

上述这些类型都使用通过 ASN.1 标准来完成数据格式的封装的。
ASN.1 (Abstract Syntax Notation One) 即抽象文法描述语言的缩写,是一种对分布计算机系统之间交换的数据消息进行抽象描述的规范化语言。它是一种国际标准,为抽象数据结构的描述说明定义了一种记法。ASN.1 使用抽象法对各种编程语言定义的数据类型进行重新定义,将所有数据分为两大类:基础类型和结构类型。详情参见 ASN.1 基础

代码示例

    // 初步创建 P10 信息
    private byte[] prepP10Base64(UserInfo userInfo, String pubKey)
            throws InvalidKeySpecException, NoSuchAlgorithmException, IOException {
        PublicKey publicKey = toPublicKey(pubKey);
        // RSAEncryption
        ASN1ObjectIdentifier oid = new ASN1ObjectIdentifier("1.2.840.113549.1.1.1");
        SubjectPublicKeyInfo pKeyInfo = new SubjectPublicKeyInfo(
                mAlgorithmIdentifier = new AlgorithmIdentifier(oid), publicKey.getEncoded());
        // add user info into the pkcs 10 certification...
        X500NameBuilder x500NameBuilder = new X500NameBuilder();
        x500NameBuilder.addRDN(BCStyle.C, "CN");
        x500NameBuilder.addRDN(BCStyle.ST, "BeiJing");
        x500NameBuilder.addRDN(BCStyle.OU, "PERSON");
        x500NameBuilder.addRDN(BCStyle.NAME, "xxxxx");
        x500NameBuilder.addRDN(BCStyle.GENDER,  "F");
        x500NameBuilder.addRDN(BCStyle.TELEPHONE_NUMBER, "0000000000");
        x500NameBuilder.addRDN(BCStyle.EmailAddress, "xxx@xxx.xxx");
        mCertificationRequestInfo = new CertificationRequestInfo(x500NameBuilder.build(), pKeyInfo, null);
        return mCertificationRequestInfo.getEncoded();
    }

       /**
     * 构建 P10 证书请求信息
     *
     * @param signedBuffer
     * @return 返回证书 base64 格式数据
     * @throws IOException
     */
    private String genP10Base64(byte[] signedBuffer) throws IOException {
        CertificationRequest csr = new CertificationRequest(mCertificationRequestInfo,
                mAlgorithmIdentifier, new DERBitString(signedBuffer));
        return SecurityUtils.base64Encode(csr.getEncoded());
    }

注释:

  • 先用 prepP10Base64 构建 P10 基础信息
  • 使用签名私钥进行签名
  • 调用 genP10Base64 函数来构建 CertficationRequest 请求信的构建(Base64编码)

网友评论

登录后评论
0/500
评论
ilufei2019
+ 关注