JAVA版本的OFD板式文件创建工具easyofd.
功能包含了图像、 图像、 文字、和模版页功能。同时也支持OFD文件的数字签名及验签,电子签章及验签。
本JAVA版本的easyofd使用原生方式创建板式文件,不依赖JAVA的SWT库。
项目地址:http://wiki.easyofd.cn/zh/JAVA
浏览器查看OFD文件控件地址: http://www.easyofd.cn
代码地址:https://github.com/11627685/easyofd-java
一、电子印章
1.1 使用easyofd制作电子印章
这属于测试性质的电子印章。正式环境应是政府颁发的电子印章。
制作电子印章主要包含以下几个步骤:
- 制作数字证书
- 获取印章图片
- 补充签章位置等其他属性
- 保存电子印章
代码如下:
//第一步 创建电子印章证书GMX509Builder gmx509Builder= null;try {gmx509Builder = getCertificate();} catch (Exception e) {e.printStackTrace();}X509Certificate certificate= gmx509Builder.getCertificate();System.out.println(certificate.toString());BCECPrivateKey bcecPrivateKey=(BCECPrivateKey) gmx509Builder.getPrivateKey() ;//第二步 电子印章的图片File file = new File("image/123.png");byte[] picdata= Util.getFileBytes(file);DEROctetString data= new DEROctetString (picdata);DEROctetString cert= new DEROctetString (certificate.getEncoded());//第三步 补充签章位置等其他属性SESeal seSeal= SealBuilder.getInstance("00001",5,"easyOFD电子印章",bcecPrivateKey,"png",data,40,30,null,cert);//第四步 保存电子印章String filePath1 = "XML/seal/seal-out.esl";SaveSealFile(filePath1,seSeal);
//第五步 保存秘钥String filePath2 = "XML/seal/seal-key.esl";SaveSealKeyFile(filePath2,bcecPrivateKey);
Copy
二、电子签章
//第一步 获取电子印章证书String sealPath = "XML/seal/seal-out.esl";SESeal seSeal=Util.getSealFromFile(sealPath);//第二步 获取私钥文件String keyPath = "XML/seal/seal-key.esl";BCECPrivateKey bcecPrivateKey=(BCECPrivateKey) getPrivateKey(keyPath) ;//第三分 对签名范围内文件进行电子签章String filePath1 = "XML/image/image.ofd";String filePath2 = "XML/seal/image-seal.ofd";CTBoundary ctBoundary=new CTBoundary(10,10,40,30);OFDSealFile ofdSealFile=new OFDSealFile( new File(filePath1),seSeal);try {ofdSealFile.seal(bcecPrivateKey,ctBoundary);try {OutputStream os = null;os = new FileOutputStream(filePath2);ofdSealFile.saveOFD(os);if(os!=null){os.flush();os.close();}} catch (Exception e) {e.printStackTrace();}} catch (JAXBException e) {e.printStackTrace();}
Copy
三、电子签章验证
验签是很简单的过程,只要把需要验签的文件传递给OFDVerifySignature类,调用verifySignature方法即可,只有该方法返回是true的情况才属于验签通过。
目前该版本程序验签只负责核对签名文件是否被修改进行验证,不会对证书的有效性,证书链,是否被吊销,是否过期等进行检核。
// 对OFD文件签章验证
public void VerFapiaoSeal() throws IOException, CryptoException, CertificateEncodingException, NoSuchProviderException, InvalidKeySpecException {boolean sucessed=false;try {String filePath = "XML/seal/fapiao.ofd"; // ASN.1文件路径Security.addProvider(new BouncyCastleProvider());OFDVerifySignature ofdVerifySignature =new OFDVerifySignature(new File(filePath));ofdVerifySignature.setSealCheck(this::sealCheck);boolean verifySignature = ofdVerifySignature.verifySignature();System.out.println("aaaaaa:"+verifySignature);}catch (Exception ex) {Assert.fail(ex.getMessage());}sucessed=true;assertEquals(true,sucessed ) ;}//你自己的签章验证程序
@Override
public boolean sealCheck(SES_Signature sesSignature) {System.out.println("your seal check");return true;
}
Copy
不过你可以实现ISealCheck接口来定义你自己的检核程序。SES_Signature,包含了签名的值详细内容见 电子签章技术规范 GB/T 38540