一、证书颁发

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

}

java 产生p10证书_PKCS#10 以及证书颁发过程相关推荐

  1. java ssl https 连接详解 生成证书

    我们在关于Java EE安全的系列文章中,有一篇也详细介绍了如何在Java EE应用中创建SSL连接和证书.正如前面文章提到的,SSL(Secure Sockets Layer,安全套接层)/TLS( ...

  2. java 验证码透明背景_Java中的证书透明度验证

    java 验证码透明背景 因此,我有一个幼稚的想法,即除了证书有效性检查(在Java中)之外,将证书透明性验证作为每个请求的一部分也很容易. 牺牲了整个周末的一半时间,我可以证明这并不是一件小事. 但 ...

  3. Java安全教程–创建SSL连接和证书的分步指南

    在有关应用JEE安全性的系列文章中,我们为您提供了另一个有关如何在Java EE应用程序中创建SSL连接和创建证书的详细教程. 如我们之前的文章中所述, 安全套接字层(SSL)/传输层安全性(TLS) ...

  4. Java加密与解密的艺术~数字证书~证书管理openssl

    OpenSSL功能远胜于KeyTool,可用于根证书,服务器证书和客户证书的管理 这里使用的是Win32OpenSSL_Light-1_0_1e.exe http://www.slproweb.com ...

  5. Java加密与解密的艺术~数字证书~证书使用openssl

    证书工具 /*** 2009-5-20*/ package org.zlex.chapter10_2;import java.io.FileInputStream; import java.secur ...

  6. Java加密与解密的艺术~数字证书~证书使用keytool

    证书工具 /*** 2009-5-20*/ package org.zlex.chapter10_1;import java.io.FileInputStream; import java.secur ...

  7. java 开发银行支付、对账时证书相关的操作总结

    2019独角兽企业重金招聘Python工程师标准>>> 证书的相关操作主要是在CMD窗口使用keytool工具 Keytool 是一个Java数据证书的管理工具 ,Keytool将密 ...

  8. java 庖丁解牛api_Java 微信支付 APIv3 平台证书的命令行下载工具

    Certificate Downloader Certificate Downloader 是 Java 微信支付 APIv3 平台证书的命令行下载工具.该工具可从 https://api.mch.w ...

  9. java数字签名(签名生成,用证书验证签名)

    部分签名原理 http://blog.csdn.net/lijiecong/archive/2010/12/24/6096289.aspx (转载序:网上找的好文章,一篇就把我找了几天的所有东西都概括 ...

最新文章

  1. java datahandler_Java Web Services:使用DataHandler类发送文件
  2. CE5.0 - romimage.exe如何填充eboot.bin中的pTOC特殊指针生成.nb0
  3. UVA 572 BFS 图论入门
  4. mysql的tcp链接过程_tcp建立连接和断开连接过程
  5. LAN远程重启server安全方法
  6. Monopole Magnets CodeForces - 1345D(dfs+思维)
  7. python的人工智能和c++的有什么区别_为什么人工智能岗位有些招聘C/C 有些招聘Python到底哪门编程语言更重要(恰恰相反C++在人工智能方面的用处很大)...
  8. mysql,索引命中,查询级别
  9. 【转】PHP获取当前时间、时间戳的各种格式写法汇总[日期时间]
  10. 六级词汇打卡第天四天(四)
  11. 《葵花宝典:WPF自学手册》三大网点书评集萃
  12. 【原创】MySQL 5.6 MRR 的存储过程完美诠释
  13. 标准报表乱码出现??符号
  14. 深度学习相关软件安装整理
  15. find_calib_object算子说明
  16. ElasticSearch Groovy 沙盒绕过 代码执行漏洞 CVE-2015-1427 漏洞复现
  17. 利用github和godaddy搭建使用二级域名的个人主页
  18. qt5使用内存检测工具vld查看内存泄漏
  19. 4.2 线性方程组有解判断
  20. 张俊林:由ChatGPT反思大语言模型(LLM)的技术精要

热门文章

  1. 基于php旅游网站管理系统获取(php毕业设计)
  2. 推荐几个适合新手的Java练手项目(好玩又有趣)
  3. 重庆赛区 ▏2020年高教社杯全国大学生数学建模竞赛重庆赛区获奖名单
  4. 不换号码转运营商是最合适的吗
  5. 四维轻云地理空间数据在线管理平台这些新功能已上线,欢迎试用!
  6. 前端实现序列帧_炫酷H5中序列图片视频化播放的高性能实现
  7. android足球经理,分享个安卓版本的足球经理2021(FMT2021),可以安装在手机或者平板上...
  8. 数据服务2- 物理层二
  9. latex使用bibliography
  10. PR视频玻璃放大效果