【问题标题】:PDF Signing With Pkcs11Interop使用 Pkcs11Interop 进行 PDF 签名
【发布时间】:2016-09-09 11:23:36
【问题描述】:

我尝试将 Pkcs11Interop 库用于我们的机构项目。但问题是,当我尝试从令牌卡中获取价值时,“试图读取或写入受保护的内存。这通常表明其他内存已损坏”错误来自 Pkcs11Interop。我找不到任何解决方案。请帮助我,提前谢谢你。

Project 是用 .Net Framework 4.5 编写的 windows 窗体应用程序

错误: system.accessviolationexception {"Attempted to read or write protected memory. This is often an indication that other memory is corrupt."}

错误堆栈跟踪:

 at Net.Pkcs11Interop.HighLevelAPI40.Session.GetAttributeValue(ObjectHandle objectHandle, List`1 attributes)
   at Net.Pkcs11Interop.HighLevelAPI40.Session.GetAttributeValue(ObjectHandle objectHandle, List`1 attributes)
   at EFinImza.Program.Main() in c:\HttpRoot\EFinImza\EFinImza\Program.cs:line 56
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

代码是这样的:

static void Main()
    {
        try
        {
            string pkcs11Library = @"C:\Windows\System32\akisp11.dll";
            using (var pkcs11 = new Net.Pkcs11Interop.HighLevelAPI40.Pkcs11(pkcs11Library, false, false))
            {
                LibraryInfo info = pkcs11.GetInfo();
                foreach (Slot slot in pkcs11.GetSlotList(false))
                {
                    SlotInfo slotInfo = slot.GetSlotInfo();
                    if (slotInfo.SlotFlags.TokenPresent)
                    {
                        TokenInfo tokenInfo = slot.GetTokenInfo();

                        Session session = slot.OpenSession(false);
                        String pin = "*****";
                        session.Login(CKU.CKU_USER, pin);

                        // get all objects using empty ObjectAttributes list
                        List<ObjectHandle> handles = session.FindAllObjects(new List<ObjectAttribute>());
                        List<CKA> attrs = new List<CKA>();
                        attrs.Add(CKA.CKA_LABEL);

                        foreach (ObjectHandle handle in handles)
                        {
                            List<ObjectAttribute> oAttrs = session.GetAttributeValue(handle, attrs);   **//Error is getting here**
                        }

                        session.CloseSession();
                    }
                }

                pkcs11.Dispose();
            }

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
        }
        catch (Exception ex)
        {
            throw ex;
        }

    }

【问题讨论】:

    标签: c# pdf digital-signature pkcs#11 pkcs11interop


    【解决方案1】:

    按照official documentation 的建议,在开始使用 Pkcs11Interop 之前,您至少应该熟悉“第 2 章 - 范围”“第 6 章 - 概述”PKCS#11 v2.20 specification 的“第 10 章 - 对象”

    您的代码首先查找所有对象,无论其类型如何(密钥、证书等),然后尝试读取每个单独对象的 CKA_VALUE 属性。 CKA_VALUE 不是所有对象类型的有效属性,我想这可能会导致您的问题。当然,行为良好的非托管 PKCS#11 库会返回 CKR_ATTRIBUTE_TYPE_INVALID 错误而不是 segfaulting,但是有许多质量差的 PKCS#11 库不能很好地处理这种极端情况。

    我建议您首先阅读规范中提到的章节,然后将传递给FindAllObjects() 方法的搜索模板更改为仅搜索您真正感兴趣的特定对象类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-16
      • 1970-01-01
      • 2012-08-17
      • 2010-09-30
      相关资源
      最近更新 更多