我的应用程序通过PKCS#11通过ASP.NET Web服务访问HSM。我初始化cryptoki库并获取会话句柄。 Web服务保持此句柄以批处理模式执行加密/解密/签名/验证。
我面临的问题是 20分钟后,ASP.NET Web服务超时。这个行为 - 我认为,卸载cryptoki库,Web服务持有的会话句柄变得无效。是的,我同意ASP.NET网络服务可以重新配置而不是超时,这将使cryptoki库始终加载。
我的问题是我从HSM首先获得的会话句柄会发生什么?它会丢失还是会被闲置?我问这个是因为,我没有通过调用c_closeSession
来正确关闭打开的会话。
Web服务是通过线程池实现的
由于
答案 0 :(得分:1)
从理论的角度来看,你应该阅读PKCS#11 spec,这一切都写在那里,从6.6节开始
从实际角度来看,应用程序在调用C_Initialize后成为cryptoki应用程序。会话的概念及其标识符可以由小包装器库中继到长运行的PKCS#11进程,该进程实际上与HSM通信,但可能不会。如果作为cryptoki应用程序的进程死亡,那么将执行所有虚拟资源(会话是什么)。
问题究竟在哪里?在大多数情况下打开会话可能是一个相当便宜的操作,除非您确定(已经测量)它是瓶颈,如果您无法控制生命周期,请不要优化并打开和关闭请求的会话密码过程。
答案 1 :(得分:1)
当您使用cryptoki库时,您应该调用C_Finalize()
。一个写得很好的实现可能会很强大,你不这样做,但没有保证。您的开放会话可以在HSM上保留,也可以在驱动程序中保持活动状态。
强烈考虑从Application_End()
致电C_Finalize()
。
答案 2 :(得分:0)
如果我理解这一点,则需要为该会话创建“全局”登录名。 此外,您需要为每个本地会话打开/关闭会话。
所以, -带有“登录”的全局变量(一旦启动或需要时) -创建新的会话时,请检查全局登录状态。 -为每个操作创建个人会话(关闭“本地”会话而不是全局登录名)
通过此操作,您可以获得具有记录的会话和使用该全局登录名的单个会话的全局变量。
祝你好运
答案 3 :(得分: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);
这是Decrypt方法。
公共字节[]解密(字节[] cryptonTextByteArray) {
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;
}
当我尝试使用PostmanRunner进行性能测试时,一个线程没有问题。 如果我增加线程数,则会出现这些错误。 第一个错误:CKR_OPERATION_ACTIVE 下一个错误:CKR_DEVICE_MEMORY
我尝试了这些方法。 -对于每个请求关闭的会话。并为新请求打开了会话。但不成功。出现相同的错误。 (当然,请求和响应时间增加了) -对于evey请求,关闭了连接。并且还为新请求打开了新连接。出现相同的错误。 (当然,请求和响应时间会增加)
有人帮助我吗? :)