itextsharp使用ukey进行签章
时间:2019-09-18
本文章向大家介绍itextsharp使用ukey进行签章,主要包括itextsharp使用ukey进行签章使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1.实现IExternalSignature接口
public class UkeyExternalSignature: IExternalSignature
{ private string _keySerial; public UkeyExternalSignature(string keySerial) { this._keySerial = keySerial; } public string GetEncryptionAlgorithm() { //return "RSA";` return "RSA"; } public string GetHashAlgorithm() { //return "SHA1"; return DigestAlgorithms.SHA256; } public byte[] Sign(byte[] message) { topesa.topesa.CertSet certs = topesa.topesa.CertStore.listAllCerts(); if (certs.size() == 0) { return null; } else { //此处为厂家提供的签名方法 topesa.topesa.CertSet certs2 = certs.bySerialnumber(_keySerial); if (certs2.size() == 1) { topesa.topesa.Certificate cert = certs2.get(0); return cert.signP7(message); //Convert.ToBase64String(b); } else { return null; } } } }
public class UkeySign { //根据证书序列号查找证书 private static X509Certificate2 GetCertificateFromStore(string serialNum) { try { //subjectName = "CN=" + subjectName; X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser); store.Open(OpenFlags.ReadWrite); X509Certificate2Collection storecollection = (X509Certificate2Collection)store.Certificates; foreach (X509Certificate2 x509 in storecollection) { if (x509.SerialNumber==serialNum) { return x509; } } store.Close(); store = null; storecollection = null; return null; } catch (Exception) { throw; } } /// <summary> /// pdf签章 /// </summary> /// <param name="sourceFile">源pdf</param> /// <param name="destFile">pdf保存路径</param> /// <param name="signImage">签章图片</param> /// <param name="certSerialNum">证书序列号</param> /// <param name="page">页码</param> /// <param name="lx"></param> /// <param name="ly"></param> /// <param name="rx"></param> /// <param name="ry"></param> /// <param name="signAll">是否所有页签章</param> /// <returns></returns> public static bool SignPdf(string sourceFile,string destFile,string signImage,string certSerialNum,int page,int lx,int ly,int rx,int ry,bool signAll=false,string signAuth="auth") { var cert = GetCertificateFromStore(certSerialNum); if(cert==null) { return false; } PdfReader pdfReader = null; FileStream signedPdf = null; PdfStamper pdfStamper = null; try { Org.BouncyCastle.X509.X509CertificateParser cp = new Org.BouncyCastle.X509.X509CertificateParser(); Org.BouncyCastle.X509.X509Certificate[] chain = new Org.BouncyCastle.X509.X509Certificate[] { cp.ReadCertificate(cert.RawData)}; // IExternalSignature externalSignature = new X509Certificate2Signature(cert, "SB_ALGORITHM_DGST_SHA1"); IExternalSignature externalSignature = new UkeyExternalSignature(certSerialNum); var pathToBasePdf = sourceFile; pdfReader = new PdfReader(pathToBasePdf); signedPdf = new FileStream(destFile, FileMode.Create); pdfStamper = PdfStamper.CreateSignature(pdfReader, signedPdf, '\0'); PdfSignatureAppearance signatureAppearance = pdfStamper.SignatureAppearance; signatureAppearance.SignDate = DateTime.Now; signatureAppearance.SignatureCreator = signAuth; signatureAppearance.Reason = "I'm auth"; var image = Image.GetInstance(signImage); signatureAppearance.SignatureGraphic = image; signatureAppearance.SignatureRenderingMode = RenderingMode.GRAPHIC; signatureAppearance.SetVisibleSignature(new Rectangle(lx, ly, rx, ry), page, "xx公司"); if (signAll) { for (int i = 1; i <= pdfReader.NumberOfPages; i++) { PdfAnnotation stp = PdfAnnotation.CreateStamp(pdfStamper.Writer, new Rectangle(lx, ly, lx + image.Width, ly + image.Height), "MY STAMP", "STP" + i); PdfAppearance tp = PdfAppearance.CreateAppearance(pdfStamper.Writer, image.Height, image.Width); image.SetAbsolutePosition(0, 0); tp.AddImage(image); stp.SetAppearance(PdfAnnotation.APPEARANCE_NORMAL, tp); pdfStamper.AddAnnotation(stp, i); } } MakeSignature.SignDetached(signatureAppearance, externalSignature, chain, null, null, null, 0, CryptoStandard.CMS); return true; } catch(Exception ex) { throw ex; } finally { if (pdfReader != null) { pdfReader.Close(); } if (signedPdf != null) { signedPdf.Close(); } if (pdfStamper != null) { pdfStamper.Close(); } } } }
原文地址:https://www.cnblogs.com/kun2008/p/11539859.html
- 从Akismet 黑名单中洗白的方法
- 移除除管理员之外的其他用户的WordPress 更新升级提示
- 为 WordPress 后台管理菜单自定义排序
- WordPress 添加个性化的博客宠物(妹纸篇)
- WordPress 添加个性化的博客宠物(汉纸篇)
- WordPress 退出(登出)的时候跳转到首页
- WordPress免插件仅代码实现面包屑导航
- 开源的作业调度框架 - Quartz.NET
- Windows Server 2003网络负载均衡的实现
- 使用 ETW 对 .NET 应用程序进行性能诊断
- ORB_SLAM论文解读
- Mono.Addins 插件式框架
- 通过多说服务器缓存加速Gravatar 头像,解决被墙问题
- asp.net mvc脚手架代码生成工具
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 用Arduino剖析PWM脉宽调制
- 猿实战01——vue后台前端框架搭建
- qt编译程序无法在其他电脑上运行
- 一起学习PHP中断言函数的使用
- Jenkins实现自动化邮件发送踩坑记录
- sed 实用实例参考
- 微信小程序WXML页面常用语法(讲解+示例)
- Golang领域模型开篇,当Go遇上DDD
- Spring事务专题(五)聊聊Spring事务到底是如何实现的
- 深色模式适配指南
- 【Flutter 专题】97 仿网易新闻标签选择器
- 宋宝华:论Linux的页迁移(Page Migration)完整版
- 三、玩转Git三剑客-Git与Github的简单同步
- 四、玩转Git三剑客-Git多人单分支集成协作时的常见场景
- 准时下班的秘密:集成 GitLab && JIRA 实现自动化 workflow