OFD板式文件创建JAVA工具-EASYOFD 六、 数字签名及验签 Singnature

     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定义自己的证书

  这属于测试性质的证书使用,不会被第三方认可。正式环境还是需要获取CA签名的证书。构建自己的证书代码如下:

//       "CN" 通用名
//       "O",// 组织
//       "C", // 国家代码
//       "ST", // 州或省份
        X500Name subject =  new X500Name("CN=公司数字签名, O=上海XX股份有限公司,   C=CN,  ST= 上海");
        Calendar start = Calendar.getInstance();
        Calendar expiry = Calendar.getInstance();
        expiry.add(Calendar.YEAR, 1);

        //证书的扩展信息
         ExtensionsGenerator extGenerator = new ExtensionsGenerator();
        extGenerator.addExtension(X509Extension.basicConstraints, false, new BasicConstraints(false));
        KeyUsage keyUsage = new KeyUsage(KeyUsage.digitalSignature | KeyUsage.nonRepudiation);
        extGenerator.addExtension(X509Extension.keyUsage, false, keyUsage);

        //使用easy构建国密证书 GMX509Builder
        GMX509Builder gmx509Builder= GMX509Builder.getInstance(new BigInteger("2315416525683890325"),subject,start,expiry,extGenerator);

Copy

1.2 获取CA签发的证书

  工业和信息化部许可的55家CA机构名单:

序号CA机构名称地区序号CA机构名称地区
1中金金融认证中心有限公司北京31上海市数字证书认证中心有限公司上海
2北京天威诚信电子商务服务有限公司北京32亚数信息科技(上海)有限公司上海
3北京数字认证股份有限公司北京33山东省数字证书认证管理有限公司山东
4颐信科技有限公司北京34山东豸信认证服务有限公司(原山东云海)山东
5北京国富安电子商务安全认证有限公司北京35华测电子认证有限责任公司河南
6联通智慧安全科技有限公司北京36河南省信息化发展有限公司河南
7北京中认环宇信息安全技术有限公司北京37浙江省数字安全证书管理有限公司浙江
8中铁信弘远(北京)软件科技有限责任公司北京38云南省数字证书认证中心有限公司云南
9北京世纪速码信息科技有限公司北京39新疆数字证书认证中心(有限公司)新疆
10农信银资金清算中心有限责任公司北京40四川省数字证书认证管理中心有限公司四川
11中国电力科学研究院有限公司北京41陕西省数字证书认证中心股份有限公司陕西
12泰尔认证中心有限公司北京42山西省数字证书认证中心(有限公司)山西
13国汽(北京)智能网联汽车研究院有限公司北京43西部安全认证中心有限责任公司宁夏
14广东省电子商务认证有限公司广东44内蒙古网信电子认证有限责任公司内蒙
15数安时代科技股份有限公司广东45辽宁数字证书认证管理有限公司辽宁
16深圳市电子商务安全证书管理有限公司广东46江西省数字证书有限公司江西
17卓望数码技术(深圳)有限公司广东47吉林省安信电子认证服务有限公司吉林
18沃通电子认证服务有限公司广东48湖北省数字证书认证管理中心有限公司湖北
19江苏省国信数字科技有限公司江苏49黑龙江省数字证书认证有限公司黑龙江
20江苏智慧数字认证有限公司江苏50河北省电子认证有限公司河北
21江苏国密数字认证有限公司江苏51海南省信安电子认证有限公司海南
22南京数字认证有限公司江苏52贵州省电子证书有限公司贵州
23东方中讯数字证书认证有限公司重庆53广西壮族自治区数字证书认证中心有限公司广西
24重庆程远未来电子商务服务有限公司重庆54福建省数字安全证书管理有限公司福建
25大陆云盾电子认证服务有限公司重庆55安徽省电子认证管理中心有限责任公司安徽
26湖南省数字认证服务中心有限公司湖南
27东方新诚信数字认证中心有限公司湖南
28苏博云科数字认证有限公司湖南
29天津市滨海数字认证有限公司天津
30天津市中环认证服务有限公司天津

二、使用easyofd数字签名

2.1 自定义证书

  本小节主要说明了如何构建一个自己签发的数字证书对文件进行数字签名,主要包括一下步骤:

  1. 第一步:构建自己的数字证书,第一小节已经讲解
  2. 第二步:声明easy的数字签名类OFDSingnatures
  3. 第三步,利用构建的国密私钥对文件进行签名
  4. 第四步,保存已经签名的文件

  主要代码如下:

String filePath2 = "XML/image/image.ofd"; // 需要签名的文件
String filePath1 = "XML/signs/image-signs.ofd"; // 签名后的文件

            //第一步,构建自己的数字证书
GMX509Builder  gmx509Builder=getCertificate(); //构造自定义数字证书,私钥及其秘钥
X509Certificate certificate= gmx509Builder.getCertificate();

            //第二步,声明签名类
OFDSingnatures fileSingnatures=new OFDSingnatures(new File(filePath2),certificate);


BCECPrivateKey bcecPrivateKey=(BCECPrivateKey) gmx509Builder.getPrivateKey() ;

            // 第三步,利用私钥对文件进行签名
fileSingnatures.siqn(bcecPrivateKey);


         // 第四步,保存文件
try {

    OutputStream os = null;
    os = new FileOutputStream(filePath1);
    fileSingnatures.saveOFD(os);
    if(os!=null)
    {
        os.flush();
        os.close();
    }


} catch (Exception e) {
    e.printStackTrace();
}

Copy

2.2 颁发的证书

  与自定义数字证书类似,主要是数字证书的获取方式不同,主要包括一下步骤:

  1. 第一步:读取文件中的数字证书和私钥
  2. 第二步:声明easy的数字签名类OFDSingnatures
  3. 第三步,利用构建的国密私钥对文件进行签名
  4. 第四步,保存已经签名的文件

  主要代码如下:

String filePath2 = "XML/image/image.ofd"; // ASN.1文件路径
                        String filePath1 = "XML/signs/image-signs-2.ofd"; // ASN.1文件路径

           //第一步:获取颁发的证书和私钥
           X509Certificate   x509Certificate=   GMX509Builder.getInstance("key/ofd.cert.pem");
           PrivateKey privateKey=  getPrivateKey();

                        //第二步,声明签名类
            OFDSingnatures fileSingnatures=new OFDSingnatures(new File(filePath2),certificate);


            BCECPrivateKey bcecPrivateKey=(BCECPrivateKey) privateKey ;

            // 第三步,利用私钥对文件进行签名
            fileSingnatures.siqn(bcecPrivateKey);

           // 第四步,保存文件
            try {

                OutputStream os = null;
                os = new FileOutputStream(filePath1);
                fileSingnatures.saveOFD(os);
                if(os!=null)
                {
                    os.flush();
                    os.close();
                }

            } catch (Exception e) {
                e.printStackTrace();
            }

            System.out.println("aaaaaa");

        }catch (Exception ex) {
            Assert.fail(ex.getMessage());
        }
}

Copy

  读取私钥的方法如下:

public  PrivateKey getPrivateKey() throws NoSuchProviderException, InvalidKeySpecException {

       String pemFilePath = "key/ofd.key.pem"; // 私钥文件
       PrivateKey privateKey=null;

       try (FileReader fileReader = new FileReader(pemFilePath)) {

           PEMParser pemParser = new PEMParser(fileReader);

           org.bouncycastle.openssl.PEMKeyPair pemPair = (org.bouncycastle.openssl.PEMKeyPair) pemParser.readObject();

             privateKey = new JcaPEMKeyConverter().getPrivateKey(pemPair.getPrivateKeyInfo());

       } catch (IOException e) {

           e.printStackTrace();
       }

       return  privateKey;

   }

Copy

三、使用easyofd验证签名

  验签是很简单的过程,只要把需要验签的文件传递给OFDVerifySignature类,调用verifySignature方法即可,只有该方法返回是true的情况才属于验签通过。

目前该版本程序验签只负责核对签名文件是否被修改进行验证,不会对证书的有效性,证书链,是否被吊销,是否过期等进行检核。

//需要验签的文件
String filePath = "XML/signs/image-signs.ofd";


OFDVerifySignature ofdVerifySignature =new OFDVerifySignature(new File(filePath));

//验签的结果
boolean verifySignature = ofdVerifySignature.verifySignature();

Copy

不过你可以实现ISignsCheck接口来定义你自己的检核程序。参数ContentInfo,包含了签名的值详细内容见 加密签名消息规范 GB/T 35275

public boolean signsCheck(ContentInfo contentInfo) {
    System.out.println("your check ....");
    return true;
}

Copy

四、easyofd数字签名后效果

4.1 WPS验证

4.1.1 自定义证书

wps-01.png


 

wps-02.png


 

wps-03.png

wps-04.png

4.1.2 颁发的证书

wps-05.png


 

wps-06.png


 

wps-07.png


 

wps-08.png

wps-09.png

4.2 数科在线验证签名

4.2.1 自定义证书

证书-1.png


 

证书-2.png


 

证书-3.png

4.2.2 颁发的证书

读取证书-1.png


 

读取证书-2.png


 

读取证书-3.png

读取证书-4.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值