X509证书申请以及PKCS#10 详解
一、证书颁发
1.单证书的签发
- 用户填写信息注册(或者由RA的业务操作员注册用户)。
- 用户信息传递到RA。
- RA审核通过。
- 用户请求发证。
- RA审核通过。
- 用户签发证书请求。
- RA把用户信息传递到CA。
- CA到KMC中取密钥对,(密钥对由加密机生成,生成的密钥对)。
- CA把用户信息和从KMC中取到的公钥制作成证书。
- CA用自己的私钥给用户证书签名。
- CA把自己的用户证书和用户的私钥通过SSL通路传递给RA。
- 用户从RA下载证书。
- 用户安装证书。
2.双证书的签发
签名证书的签发
- a) 用户填写信息注册(或者由RA的业务操作员注册用户)。
- b) 用户本地ACTIVE控件调用IE中的加密机生成签名证书的密钥对。
- c) 用户填写的信息和签名证书的公钥传递给RA。
- d) RA把用户信息和公钥传递给CA。
- e) CA根据用户信息和公钥制作成证书
- f) CA用自己的私钥给用户证书签名。
- g) CA把生成的用户证书传递给RA。
- h) 用户从RA下载证书。
- i)用户安装签名证书。
加密证书的签发
- a) 用户把用户的签名证书传递到RA。
- b) RA用户的签名证书传递到CA。
- c) CA到KMC中取密钥对,(密钥对由加密机生成,生成的密钥对)。
- d) CA把从签名证书中得到的用户信息和从KMC中取到的公钥制作成证书。
- e) CA用自己的私钥给用户证书签名。
- f) CA调用签名证书的公钥给加密证书和用户加密证书的私钥加密
- g) CA把加密之后的加密证书和加密证书的私钥传递给RA。
- h) 用户从RA加密之后的加密证书和加密证书的私钥。
- i) 用户在本地调用签名证书的私钥解密加密证书和加密证书的私钥。
- j) 用户安装加密证书。
二、具体实现
2.1 用户首先产生自己的密钥对,并将公共密钥及部分个人信息传送给CA(通过P10请求)
 CertAndKeyGen gen = new CertAndKeyGen("RSA", "SHA1WithRSA");
  gen.generate(1024);//生成1024位密钥
 PKCS10CertificationRequestBuilder p10Builder = new JcaPKCS10CertificationRequestBuilder(
                     new X500Principal("CN = " + name), gen.getPublicKey());// CN和公钥
  JcaContentSignerBuilder csBuilder = new JcaContentSignerBuilder("SHA256withRSA");// 签名算法
  ContentSigner signer = null;
  signer = csBuilder.build(gen.getPrivateKey());
  PKCS10CertificationRequest csr = p10Builder.build(signer);// PKCS10的请求
  return csr;//返回PKCS10的请求
2.2 CA接受请求并生成证书
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
X509Certificate cacert = (X509Certificate) certFactory.generateCertificate(new  FileInputStream(certPath));
//一大堆参数 ,填充到生成器里
AlgorithmIdentifier sigAlgId = new 	   DefaultSignatureAlgorithmIdentifierFinder().find("SHA1withRSA");
AlgorithmIdentifier digAlgId = new DefaultDigestAlgorithmIdentifierFinder().find(sigAlgId);
org.bouncycastle.asn1.x500.X500Name issuer = new org.bouncycastle.asn1.x500.X500Name(
                                          cacert.getSubjectX500Principal().getName());        BigInteger serial = new BigInteger(32, new SecureRandom());
  Date from = new Date();
  Date to = new Date(System.currentTimeMillis() + (365 * 80 * 86400000L));
  X509v3CertificateBuilder certgen = new X509v3CertificateBuilder(issuer, serial, from, to,                                                                    csr.getSubject(),
csr.getSubjectPublicKeyInfo())
Key privateKey = productPrivateKey();
// CA端进行签名, 才有具有法律效力
ContentSigner signer = new BcRSAContentSignerBuilder(sigAlgId, digAlgId)
               .build(PrivateKeyFactory.createKey(privateKey.getEncoded()));
// 生成BC结构的证书
 Security.addProvider(new BouncyCastleProvider());
X509Certificate resultBc = new JcaX509CertificateConverter().setProvider("BC").getCertificate(certgen.build(signer));
  return resultBc;//返回证书
三、P10请求详解
- 定义:证书请求文件,类似于CSR文件。
- p10证书一般是一个base64文件,实际上他不是一张真正的证书应该是一段可以向CA申请证书的P10请求,该请求一般是通过硬件生成密钥对后,将私钥单独存放,但是将公钥放入p10中,CA受到该p10请求后,可以校验,并根据p10中的信息制作一张没有私钥的公钥证书。
CSR:证书签发请求(Certificate Signing Request),
- CSR也叫做认证申请,是一个发送到CA的请求认证信息。 有两种格式,应用最广泛的是由PKCS#10定义的,另一个用的少的是由SPKAC定义的,主要应用于网景浏览器。 
- 在PKCS#10定义中,CSR有两种编码格式:二进制(ASN.1或DER (Distinguished Encoding Rules))和文本格式(the text or PEM (Privacy Enhanced Mail)formatted CSR is the binary CSR after it has been Base-64 encoded to create a text version of the CSR.) 
- CSR文件生成步骤如下: - 根据Version、Distinguished Name、Public Key、Attributes生成请求证书;
- 用Private Key加密证书请求信息;
- 根据请求信息、签名算法和签名生成CSR文件;
 
- CSR文件包含的信息描述如下 - CertificationRequest ::= SEQUENCE {
 certificationRequestInfo CertificationRequestInfo,//证书信息
 signatureAlgorithm AlgorithmIdentifier{{ SignatureAlgorithms }},//签名算法
 signature BIT STRING //签名
 }//另外还可能有可选的字段,如postal address和Email address,这两个字段可以应用于证书的撤销。
 
注意:私钥不包含在CSR文件中,但是应用于数字签名
签名分两步
- 将certificateRequestInfo 进行DER编码,产生八位字节字符串; 
- 将步骤一的结果用请求者的私钥在指定的签名算法下,产生签名; 
- 请求信息定义如下 - CertificationRequestInfo ::= SEQUENCE {
 version INTEGER { v1(0) } (v1,...),
 subject Name, //证书主体的专有名称
 subjectPKInfo SubjectPublicKeyInfo{{ PKInfoAlgorithms }},
 attributes [0] Attributes{{ CRIAttributes }}
 }
 
- subjectPublicKeyInfo 包含被认证的公钥 
- attributes 关于认证主提其他信息属性集合 - SubjectPublicKeyInfo { ALGORITHM : IOSet} ::= SEQUENCE {
 algorithm AlgorithmIdentifier {{IOSet}},
 subjectPublicKey BIT STRING
 }
 - PKInfoAlgorithms ALGORITHM ::= {
 ... -- add any locally defined algorithms here -- } Attributes { ATTRIBUTE:IOSet } ::= SET OF Attribute{{ IOSet }} CRIAttributes ATTRIBUTE ::= {
 ... -- add any locally defined attributes here -- } Attribute { ATTRIBUTE:IOSet } ::= SEQUENCE {
 type ATTRIBUTE.&id({IOSet}),
 values SET SIZE(1..MAX) OF ATTRIBUTE.&Type({IOSet}{@type})
 }
 
- 等价写法 - CertificationRequest ::= SIGNED { EncodedCertificationRequestInfo }
 (CONSTRAINED BY { -- Verify or sign encoded
 -- CertificationRequestInfo -- }) EncodedCertificationRequestInfo ::=
 TYPE-IDENTIFIER.&Type(CertificationRequestInfo) SIGNED { ToBeSigned } ::= SEQUENCE {
 toBeSigned ToBeSigned,
 algorithm AlgorithmIdentifier { {SignatureAlgorithms} },
 signature BIT STRING
 }
 
X509证书申请以及PKCS#10 详解的更多相关文章
- IOS 开发环境,证书和授权文件等详解
		(转自:http://blog.csdn.net/gtncwy/article/details/8617788) 一.成员介绍1. Certification(证书)证书是对电脑开发资格的认证, ... 
- 【转】IOS 开发环境,证书和授权文件等详解
		(转自:http://blog.csdn.net/gtncwy/article/details/8617788) 一.成员介绍1. Certification(证书)证书是对电脑开发资格的认证, ... 
- nginx配置ssl证书实现https加密请求详解
		原文链接:http://www.studyshare.cn/software/details/1175/0 一.加密方式 1.对称加密 所谓对称加密即:客户端使用一串固定的秘钥对传输内容进行加密,服务 ... 
- CentOS 7安装MariaDB 10详解以及相关配置
		第一步:添加 MariaDB yum 仓库 首先在CentOS操作系统中/etc/yum.repos.d/目录下添加 MariaDB 的YUM配置文件MariaDB.repo文件. vi /etc/y ... 
- OWASP TOP 10 详解
		OWASP--开放式web应用程序安全项目 参考文献:袁鸣凯.OWASP Top 10十大风险 – 10个最重大的Web应用风险与攻防.2016-9-18. https://blog.csdn.n ... 
- 《精通并发与Netty》学习笔记(10 - 详解NIO (一) Channel、Buffer )
		一.Java NIO 概述 Java NIO 由以下几个核心部分组成:ChannelsBuffersSelectors虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Bu ... 
- Linux的加密认证功能以及openssl详解
		一.详细介绍加密.解密技术 现在的加密/解密技术主要有三种:对称加密,非对称加密,和单向加密 这三种加密解密技术的组合就是现在电子商务的基础,它们三个有各自最适合的领域,而且所要完成的功能也是不同的, ... 
- iOS 证书申请和使用详解(详细版)
		对于iOS开发者来说,apple开发者账号肯定不会陌生.在开发中我们离不开它.下面我简单的为大家分享一下关于iOS开发中所用的证书相关知识. 第一部分:成员介绍 1.Certification(证书) ... 
- 【转】iOS开发者申请发布证书及真机调试图文详解
		原文网址:http://www.tqcto.com/article/mobile/57822.html 打开iOS Dev Center,选择Sign in,登陆(至少99美元账号),登陆之后在网页右 ... 
随机推荐
- React onPaste 获取粘贴板的值
			React 中, 获取 粘贴板的值, 使用下面的方法 console.log(e.clipboardData.getData('Text')); 如果是 JS 中的 onpaste 事件, 则使用 v ... 
- 我做SAP CRM One Order redesign的一些心得体会
			框架开发和应用程序的开发完全不一样. 举个具体的最近折腾我的例子: 创建新的service order,维护header的shipping data,此时order和shipping data的mod ... 
- 为什么ConcurrentHashMap是弱一致的
			为什么ConcurrentHashMap是弱一致的 本文将用到Java内存模型的happens-before偏序关系(下文将简称为hb)以及ConcurrentHashMap的底层模型相关的知识.ha ... 
- python multiprocessing 使用
			如何在Pool中使用Queue,Stack Overflow的回答,戳这里 其实吧官方文档看一遍应该就大部分都懂了. 需要注意的是:在使用多进程的时候,我们的进程函数的传入参数必须是pickle-ab ... 
- PHP学习笔记一:谁动了你的mail(),PHP?
			PHP编写邮件发送的函数时候,会出现一个很奇怪的问题,那就是: Warning: mail(): Failed to connect to mailserver at "localhost& ... 
- Day18 (二)反射
			反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java ... 
- Day9 抽象类和接口
			抽象类 抽象类定义 只约定类所具有的抽象行为,没有具体实现相应行为. 语法格式 abstract class 类名{ 常量; 变量; 构造(); 访问修饰符abstract 返回类型 方法名;//抽象 ... 
- A NB群友 【记忆化搜索】(2019年华南理工大学程序设计竞赛(春季赛))
			冲鸭!去刷题:https://ac.nowcoder.com/acm/contest/625/A 题目描述 CC是著名的算法竞赛选手,他不仅人长得帅,而且技术了得,自然而然就有了许多粉丝. 为了能帮助 ... 
- Docker实战(八)之Web服务与应用
			1.Apache 官方提供了名为httpd的Apache镜像,可以作为基础web服务镜像 Dockerfile(安装apache2) FROM httpd:2.4 COPY ./public-html ... 
- django 模板关闭自动转义
			Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全.但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰 ... 
