在 Safenet HSM 上使用 PKCS11Interop,我收到此错误
“方法 C_OpenSession 返回 2147484548”
在我的文档中,错误是 CKR_SMS_ERROR:“来自安全消息传递系统的一般错误 - 可能是由 HSM 故障或网络故障引起的”。
这证实了在缺乏连接时发生的问题。
问题是当这种情况发生时,服务无法在连接恢复时恢复通信,直到我手动重新启动管理 HSM 访问的服务。
当服务启动时,我称之为:
private Pkcs11 _pkcs11 = null;
private Slot _slot = null;
private Session _session = null;
public async void InitPkcs11()
{
try
{
_pkcs11 = new Pkcs11(pathCryptoki, Inter_Settings.AppType);
_slot = Inter_Helpers.GetUsableSlot(_pkcs11, nSlot);
_session = _slot.OpenSession(SessionType.ReadOnly);
_session.Login(CKU.CKU_USER, Inter_Settings.NormalUserPin);
}
catch (Exception e)
{
...
}
}
当我必须使用 HSM 时,我会调用类似:
using (var LocalSession = _slot.OpenSession(SessionType.ReadOnly))
{
...
}
而且,当我由于缺乏连接而导致通信失败时,我会调用一个函数来重置连接并尝试更改插槽:
private bool switching = false;
public async void SwitchSlot()
{
try
{
if (!switching)
{
switching = true;
if (nSlot == 0)
{
nSlot = 2;
}
else
{
nSlot = 0;
}
_session.Logout();
_slot.CloseAllSessions();
_pkcs11.Dispose();
InitPkcs11();
switching = false;
}
}
catch (Exception e)
{
...
}
}
但是,最后一个片段没有按预期工作:它尝试更改插槽,但始终无法与 HSM 通信(在网络关闭后)。如果我手动重新启动服务(当连接恢复时),它就像魅力一样工作。所以,当我尝试关闭_session并打开一个新的时,我确定我在SwitchSlot 函数中做错了什么。
您在这里看到任何错误/误解吗?