利用BC的X509v3CertificateBuilder組裝X509證書

// 設置開始日期和結束日期
		long year = 360 * 24 * 60 * 60 * 1000;
		Date notBefore = new Date();
		Date notAfter = new Date(notBefore.getTime() + year);

		// 設置頒發者和主題
		String issuerString = "CN=root,OU=單位,O=組織";
		X500Name issueDn = new X500Name(issuerString);
		X500Name subjectDn = new X500Name(issuerString);

		// 證書序列號
		BigInteger serail = BigInteger.probablePrime(32, new Random());

		
		//證書中的公鑰
		KeyPair keyPair = null;
		try {
			keyPair = KeyPairGenerator.getInstance("RSA", bcProvider)
					.generateKeyPair();
		} catch (NoSuchAlgorithmException e1) {
			e1.printStackTrace();
		}
		PublicKey publicKey = keyPair.getPublic();
		PrivateKey privateKey = keyPair.getPrivate();

		//組裝公鑰信息
		SubjectPublicKeyInfo subjectPublicKeyInfo = null;
		try {
			subjectPublicKeyInfo = SubjectPublicKeyInfo
					.getInstance(new ASN1InputStream(publicKey.getEncoded())
							.readObject());
		} catch (IOException e1) {
			e1.printStackTrace();
		}

		
		//證書的簽名數據
		final byte[] signatureData ;
		try {
			signature = Signature.getInstance("SHA1withRSA");
			signature.initSign(privateKey);
			signature.update(publicKey.getEncoded());
			signatureData = signature.sign();
		} catch (Exception e) {
			throw new RuntimeException(e.getMessage(),e);
		}

		//組裝證書
		X509v3CertificateBuilder builder = new X509v3CertificateBuilder(
				issueDn, serail, notBefore, notAfter, subjectDn,
				subjectPublicKeyInfo);
		
		//給證書籤名
		X509CertificateHolder holder = builder.build(new ContentSigner() {
			ByteArrayOutputStream buf = new ByteArrayOutputStream();
			@Override
			public byte[] getSignature() {
				try {
					buf.write(signatureData);
				} catch (IOException e) {
					e.printStackTrace();
				}
				return signatureData;
			}

			@Override
			public OutputStream getOutputStream() {
				return buf;
			}

			@Override
			public AlgorithmIdentifier getAlgorithmIdentifier() {
				return AlgorithmIdentifier.getInstance(X509Util.getAlgorithmOID("SHA1withRSA"));
			}
		});
		try {
			byte[] certBuf = holder.getEncoded();
			X509Certificate certificate = (X509Certificate) CertificateFactory.getInstance("X509").generateCertificate(new ByteArrayInputStream(certBuf));
			System.out.println(certificate);
			//證書base64編碼字符串
			System.out.println(Base64.encode(certificate.getEncoded()));
		} catch (IOException e) {
			e.printStackTrace();
		} catch (CertificateException e) {
			e.printStackTrace();
		}
		
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章