如何管理网络并避免PKCS11Interop出错

时间:2018-01-02 15:20:12

标签: c# connectivity pkcs#11 hsm pkcs11interop

在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功能中做错了。

你在这里看到任何错误/错误吗?

0 个答案:

没有答案