安全

PKCS#10 以及证书颁发过程

2018-04-18  本文已影响0人  Astrophel_06c5

一、证书颁发

1.单证书的签发

  1. 用户填写信息注册(或者由RA的业务操作员注册用户)。
  2. 用户信息传递到RA。
  3. RA审核通过。
  4. 用户请求发证。
  5. RA审核通过。
  6. 用户签发证书请求。
  7. RA把用户信息传递到CA。
  8. CA到KMC中取密钥对,(密钥对由加密机生成,生成的密钥对)。
  9. CA把用户信息和从KMC中取到的公钥制作成证书。
  10. CA用自己的私钥给用户证书签名。
  11. CA把自己的用户证书和用户的私钥通过SSL通路传递给RA。
  12. 用户从RA下载证书。
  13. 用户安装证书。

2.双证书的签发

签名证书的签发

加密证书的签发

二、具体实现

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:证书签发请求(Certificate Signing Request),

注意:私钥不包含在CSR文件中,但是应用于数字签名

签名分两步

上一篇 下一篇

猜你喜欢

热点阅读