1

我的应用程序通过 PKCS#11 通过 ASP.NET Web 服务访问 HSM。我初始化 cryptoki 库并获得一个会话句柄。Web 服务保持此句柄以批处理模式执行加密/解密/签名/验证。

我面临的问题是 20 分钟后 ASP.NET Web 服务超时。我认为,此行为会卸载 cryptoki 库,并且 Web 服务持有的会话句柄变得无效。是的,我同意 ASP.NET Web 服务可以重新配置为不超时,这将使 cryptoki 库始终处于加载状态。

我的问题是我首先从 HSM 获得的会话句柄会发生什么?它会丢失还是未使用?我问这个是因为,我没有通过调用正确关闭打开的会话c_closeSession

Web 服务是通过线程池实现的

谢谢

4

4 回答 4

1

从理论的角度来看,你应该阅读PKCS#11 规范,它都写在那里,从第 6.6 节开始

从实际的角度来看,一个应用程序在调用 C_Initialize 之后就变成了一个 cryptoki 应用程序。会话的概念及其标识符可以由一个小型包装库中继到一个长时间运行的 PKCS#11 进程,该进程实际上与 HSM 对话,但可能不会。如果作为 cryptoki 应用程序的进程终止,所有虚拟资源(会话是什么)也会终止。

问题究竟出在哪里?在大多数情况下,打开会话可能是一个非常便宜的操作,除非您确定(已经测量)它是瓶颈,如果您无法控制生命周期,请不要优化并打开和关闭请求的会话的cryptoki过程。

于 2010-07-05T08:08:51.270 回答
1

您应该在C_Finalize()使用完 cryptoki 库后调用。一个写得很好的实现可能对你不这样做是健壮的,但不能保证。您打开的会话可能会在 HSM 上保持活动状态,也可能在驱动程序中保持活动状态。

强烈考虑C_Finalize()从您的Application_End().

于 2010-07-12T20:30:10.343 回答
0

如果我明白这一点,您需要为该会话创建一个“全局”登录。此外,您需要为每个本地会话打开/关闭会话。

所以, - 带有“登录”的全局变量(在启动时或需要时) - 在创建新会话时检查全局登录状态。- 为每个操作创建单独的会话(关闭“本地”会话而不是全局登录)

有了这个,您可以获得一个全局变量,其中包含一个记录的会话和使用该全局登录的单个会话。

祝你好运

于 2018-08-09T12:42:01.263 回答
0

我也有这个问题,年份是 2020 年:S .Net Framework + Rest Api 夫妇这次有这个问题。我正在使用 HSM 进行解密方法。我有一个登录方法交互频道,我们需要进行性能测试。该服务有一个来自 Pkcs11 的实例

pkcs11 = new Pkcs11(hsmPath, true);
slot = GetUsableSlot(pkcs11);
TokenInfo tokenInfo = slot.GetTokenInfo();
session = slot.OpenSession(true);
session.Login(CKU.CKU_USER, userLoginPin);
secretKey = GenerateKey(session);

这就是解密方法。

公共字节[]解密(字节[]加密文本字节数组){

    Mechanism mechanism = new Mechanism(CKM.CKM_AES_ECB);
    byte[] sourceData = encryptedTextByteArray;
    byte[] decryptedData = null;

    using (MemoryStream inputStream = new MemoryStream(sourceData), outputStream = new MemoryStream())
    {
        try
        {                
            session.Decrypt(mechanism, secretKey, inputStream, outputStream, 4096);
        }
        catch (Pkcs11Exception ex)
        {
            throw;
        }
        decryptedData = outputStream.ToArray();
    }
    return decryptedData;
}

当我尝试使用 Postman runner 进行性能测试时,一个线程没有问题。如果我增加线程数,就会出现这些错误。第一个错误:CKR_OPERATION_ACTIVE 下一个错误:CKR_DEVICE_MEMORY

我试过这些方法。- 对于每个请求关闭会话。并且还为新请求打开了会话。但没有成功。出现了同样的错误。(当然请求和响应时间增加了) - 因为每个请求都关闭了连接。并且还为新请求打开了新连接。出现了同样的错误。(当然请求和响应时间增加了)

有人帮助我吗?:)

于 2020-06-04T17:27:56.060 回答