记录世界,记住你。侵权请联系博主删除。

转自:https://blog.csdn.net/qq_30336433/article/details/83819572

pom.xml

<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.49</version></dependency><dependency><groupId>org.bouncycastle</groupId><artifactId>bcpkix-jdk15on</artifactId><version>1.49</version></dependency> 

相关代码,亲测可用:


public class Extension {private String oid;private boolean critical;private byte[] value;public String getOid() {return oid;}public byte[] getValue() {return value;}public boolean isCritical() {return critical;}

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.KeyStore;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.asn1.x500.X500Name;
import org.bouncycastle.asn1.x509.BasicConstraints;
import org.bouncycastle.asn1.x509.CRLDistPoint;
import org.bouncycastle.asn1.x509.DistributionPoint;
import org.bouncycastle.asn1.x509.DistributionPointName;
import org.bouncycastle.asn1.x509.GeneralName;
import org.bouncycastle.asn1.x509.GeneralNames;
import org.bouncycastle.asn1.x509.KeyUsage;
import org.bouncycastle.cert.X509CertificateHolder;
import org.bouncycastle.cert.X509v3CertificateBuilder;
import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.operator.ContentSigner;
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;public class ItextUtil {private static KeyPair getKey() throws NoSuchAlgorithmException {// 密钥对 生成器,RSA算法 生成的  提供者是 BouncyCastleKeyPairGenerator generator = KeyPairGenerator.getInstance("RSA",  new BouncyCastleProvider());generator.initialize(1024);  // 密钥长度 1024// 证书中的密钥 公钥和私钥KeyPair keyPair = generator.generateKeyPair();return keyPair;}/*** @param password  密码   * @param issuerStr 颁发机构信息* @param subjectStr 使用者信息* @param certificateCRL 颁发地址* @return*/public static Map<String, byte[]> createCert(String password, String issuerStr, String subjectStr, String certificateCRL) {Map<String, byte[]> result = new HashMap<String, byte[]>();ByteArrayOutputStream out = null;try {//  生成JKS证书//  KeyStore keyStore = KeyStore.getInstance("JKS");//  标志生成PKCS12证书KeyStore keyStore = KeyStore.getInstance("PKCS12",  new BouncyCastleProvider());keyStore.load(null, null);KeyPair keyPair = getKey();//  issuer与 subject相同的证书就是CA证书Certificate cert = generateCertificateV3(issuerStr, subjectStr,  keyPair, result, certificateCRL, null);// cretkey随便写,标识别名keyStore.setKeyEntry("cretkey",  keyPair.getPrivate(),  password.toCharArray(),  new Certificate[] { cert });out = new ByteArrayOutputStream();cert.verify(keyPair.getPublic());keyStore.store(out, password.toCharArray());byte[] keyStoreData = out.toByteArray();result.put("keyStoreData", keyStoreData);return result;} catch (Exception e) {e.printStackTrace();} finally {if (out != null) {try {out.close();} catch (IOException e) {}}}return result;}/*** @param issuerStr* @param subjectStr* @param keyPair* @param result* @param certificateCRL* @param extensions* @return*/public static Certificate generateCertificateV3(String issuerStr, String subjectStr, KeyPair keyPair, Map<String, byte[]> result,String certificateCRL, List<Extension> extensions) {ByteArrayInputStream bout = null;X509Certificate cert = null;try {PublicKey publicKey = keyPair.getPublic();PrivateKey privateKey = keyPair.getPrivate();Date notBefore = new Date();Calendar rightNow = Calendar.getInstance();rightNow.setTime(notBefore);// 日期加1年rightNow.add(Calendar.YEAR, 1);Date notAfter = rightNow.getTime();// 证书序列号BigInteger serial = BigInteger.probablePrime(256, new Random());X509v3CertificateBuilder builder = new JcaX509v3CertificateBuilder(new X500Name(issuerStr), serial, notBefore, notAfter,new X500Name(subjectStr), publicKey);JcaContentSignerBuilder jBuilder = new JcaContentSignerBuilder( "SHA1withRSA");SecureRandom secureRandom = new SecureRandom();jBuilder.setSecureRandom(secureRandom);ContentSigner singer = jBuilder.setProvider(  new BouncyCastleProvider()).build(privateKey);// 分发点ASN1ObjectIdentifier cRLDistributionPoints = new ASN1ObjectIdentifier( "2.5.29.31");GeneralName generalName = new GeneralName( GeneralName.uniformResourceIdentifier, certificateCRL);GeneralNames seneralNames = new GeneralNames(generalName);DistributionPointName distributionPoint = new DistributionPointName( seneralNames);DistributionPoint[] points = new DistributionPoint[1];points[0] = new DistributionPoint(distributionPoint, null, null);CRLDistPoint cRLDistPoint = new CRLDistPoint(points);builder.addExtension(cRLDistributionPoints, true, cRLDistPoint);// 用途ASN1ObjectIdentifier keyUsage = new ASN1ObjectIdentifier( "2.5.29.15");// | KeyUsage.nonRepudiation | KeyUsage.keyCertSignbuilder.addExtension(keyUsage, true, new KeyUsage( KeyUsage.digitalSignature | KeyUsage.keyEncipherment));// 基本限制 X509Extension.javaASN1ObjectIdentifier basicConstraints = new ASN1ObjectIdentifier("2.5.29.19");builder.addExtension(basicConstraints, true, new BasicConstraints(true));// privKey:使用自己的私钥进行签名,CA证书if (extensions != null){for (Extension ext : extensions) {builder.addExtension(new ASN1ObjectIdentifier(ext.getOid()),ext.isCritical(),ASN1Primitive.fromByteArray(ext.getValue()));}}X509CertificateHolder holder = builder.build(singer);CertificateFactory cf = CertificateFactory.getInstance("X.509");bout = new ByteArrayInputStream(holder.toASN1Structure() .getEncoded());cert = (X509Certificate) cf.generateCertificate(bout);byte[] certBuf = holder.getEncoded();SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");// 证书数据result.put("certificateData", certBuf);//公钥result.put("publicKey", publicKey.getEncoded());//私钥result.put("privateKey", privateKey.getEncoded());//证书有效开始时间result.put("notBefore", format.format(notBefore).getBytes("utf-8"));//证书有效结束时间result.put("notAfter", format.format(notAfter).getBytes("utf-8"));} catch (Exception e) {e.printStackTrace();} finally {if (bout != null) {try {bout.close();} catch (IOException e) {}}}return cert;}public static void main(String[] args) throws Exception{// CN: 名字与姓氏    OU : 组织单位名称// O :组织名称  L : 城市或区域名称  E : 电子邮件// ST: 州或省份名称  C: 单位的两字母国家代码 String issuerStr = "CN=天天凭证,OU=研发部,O=gitbook有限公司,C=CN,E=gitbook@sina.com,L=北京,ST=北京";String subjectStr = "CN=huangjinjin,OU=用户,O=借款人,C=CN,E=huangjinjin@sina.com,L=北京,ST=北京";String certificateCRL  = "https://gitbook.cn";Map<String, byte[]> result = createCert("123456", issuerStr, subjectStr, certificateCRL);//      FileOutputStream outPutStream = new FileOutputStream("C:/pdf/keystore.p12"); // 生成.p12
//      outPutStream.write(result.get("keyStoreData"));
//      outPutStream.close();FileOutputStream fos = new FileOutputStream(new File("C:/pdf/zheng.cer"));//生成.p12颁发给用户的证书fos.write(result.get("certificateData"));fos.flush();fos.close();}

Java 对 PDF 文件进行电子签章 如何生成PKCS12证书相关推荐

  1. 如何用 Java 对 PDF 文件进行电子签章

    转自:如何用 Java 对 PDF 文件进行电子签章 - Ferocious - 博客园 一.概述 二.技术选型 三.生成一个图片签章 四.如何按模板生成PDF文件 五.如何生成PKSC12证书 六. ...

  2. 如何用 Java 对 PDF 文件进行电子签章(五) 如何生成一个高清晰的签章

    参考: https://blog.csdn.net/javasun608/article/details/79307845    具体步骤: 由PDF模板生成一个PDF文件.加签章.由itext5 生 ...

  3. 如何用 Java 对 PDF 文件进行电子签章(六)如何进行多次PDF签名 及总结

    参考: https://blog.csdn.net/javasun608/article/details/79307845 如何进行多次PDF签名   生成多个签章重点代码,已在SignPdf.jav ...

  4. 如何用 Java 对 PDF 文件进行电子签章(二)生成一个图片签章

    参考: https://blog.csdn.net/javasun608/article/details/79307845 https://blog.csdn.net/zdavb/article/de ...

  5. java为PDF盖(签)电子签章--位置定位

    1.电子签章简介 电子签章,与我们所使用的数字证书一样,是用来做为身份验证的一种手段,泛指所有以电子形式存在,依附在电子文件并与其逻辑关联,可用以辨识电子文件签署者身份,保证文件的完整性,并表示签署者 ...

  6. java为PDF盖(签)电子签章--关键词定位

    java PDF盖章-位置定位,请看这篇文章. 本文为关键词盖章,需求就是根据关键词在pdf进行签章,如:pdf尾页盖上xxx机构的电子章. 直接上代码:所需要的依赖和位置定位的差不多,请看上文. I ...

  7. 1024程序员节|历经一个月总结使用java实现pdf文件的电子签字+盖章+防伪二维码+水印+PDF文件加密的全套解决方案

  8. Word制作生成html模板替换动态值为占位符使用Java转为pdf文件

    引言 最近开发遇到一个需求,公司法务给了一个word合同模板,需要替换里面的动态值为具体业务数据,然后生成pdf文件进行电子签章. 在网上找寻各种方法,发现很多都是需要特定工具,或者代码不全运行不起来 ...

  9. Java实现pdf文件转图片

    Java实现pdf文件转图片 文章顺序是按照测试类- -Service- -Service实现类- -工具类- - POM依赖. test测试类里 pdfPath:存放pdf源文件的地方 imgflo ...

最新文章

  1. Unity TIP4: 带泛型参数的接口注入(interface,generic)
  2. 1.13 编程基础之综合应用 10 判决素数个数 python
  3. response.setcontenttype的參数
  4. Linux下安装ActiveMQ
  5. Unity 3D第三人称视角、用途广泛限定角度(视角不能360度翻转)
  6. C#基础知识整理:基础知识(11) 值类型,引用类型
  7. 利用Python制作一个“电子记事本”
  8. 多线程例题练手(c入门)
  9. ibm服务器刷主板系统,IBM X3850 X5服务器更换主板后修改主板信息
  10. 如何使用origin画韦恩图?
  11. python一键批量下载个人简历网的简历模板
  12. ecshop 配置服务器文件夹,ECSHOP3.6安装教程【ECSHOP3.6安装教程步骤】ECSHOP3.6安装教程详细讲解-ECSHOP教程网...
  13. MIMO技术杂谈(三):知己知彼,百战不殆--信道信息的获取和应用
  14. PCL——简单点云可视化
  15. RK3328安装liunx(ubuntu16.04)RK固件
  16. 谷歌浏览器安装vue-devtools
  17. native2ascii的使用技巧
  18. 机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾
  19. 茹立云:深层网络搜索核心技术研讨
  20. [C++复健日常] for_each

热门文章

  1. 在微信、支付宝、百度钱包实现点击返回按钮关闭当前页面和窗口的方法
  2. 在做vue h5 时因改变手机字体导致页面布局错乱 比如在微信公众号中 放入h5 客户把手机字体或者微信字体调大 导致页面错乱
  3. InfluxDB 修改数据存储路径
  4. show()与showdialog()区别
  5. 《Android 应用案例开发大全(第3版)》——第2.2节壁纸的策划及准备工作
  6. 可惜不是你-娜写年华
  7. mysql的主句与从句_主句、从句、复合句
  8. mysql 创建复制账号_MySQL 复制(二:配置) | 剑花烟雨江南
  9. NOIP复赛复习(十八)反转问题与弹性碰撞
  10. C语言小恶搞之猜数字游戏