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

本文参考《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. 数字证书的应用

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

PKI体系框架

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

双证书技术流程图

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编码)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容