为什么 Cryptoki.C_OpenSession 有时会断开与 HSM 的连接

Why Cryptoki.C_OpenSession disconnect from HSM sometimes

我创建了一个 web 服务 isAlive 来检查我是否可以使用 Cryptoki 创建与 HSM 软件的会话,我使用 SoapUI 自动执行我的 web 服务,所以我每 40 秒循环执行一次我的服务,它工作好吧,但在多次通话后,我无法连接到我的 HSM,直到我重新启动我的应用程序:这是我用来连接到 HSM 的代码部分

// create session handle 
        CK_SESSION_HANDLE session= new CK_SESSION_HANDLE();

        // return code
        CK_RV retcode;

        // get session
        retcode=Cryptoki.C_OpenSession(safeNetSlot, CKF.RW_SESSION, null, null, session);
        checkRetCode(retcode, "Could not open session on HSM");

        log.debug("Session [{}]",session.longValue());

        // do login 
        final String recovHsmPassword = PasswordManagement.recoverPassword(hsmPassword);
        retcode=Cryptoki.C_Login(session, CKU.USER, recovHsmPassword.getBytes(), recovHsmPassword.length());
        checkRetCode(retcode, "Could not login as user");

在我的服务执行过程中,我查看了日志,我发现 session.longValue() 随每次调用而递增:

这是日志:

    INFO 5056 --- [nio-8191-exec-5] ccom.test.app.V1Controler  : Request for isAlive API
    DEBUG 5056 --- [nio-8191-exec-5] com.test.app.hsm.HsmService  : Session [1]
    INFO 5056 --- [nio-8191-exec-5] com.test.app.V1Controler  : Request for isAlive API
    DEBUG 5056 --- [nio-8191-exec-5] com.test.app.hsm.HsmService  : Session [2]
    INFO 5056 --- [nio-8191-exec-5] com.test.app.V1Controler  : Request for isAlive API
    DEBUG 5056 --- [nio-8191-exec-5] com.test.app.hsm.HsmService  : Session [3]
    INFO 5056 --- [nio-8191-exec-5] com.test.app.V1Controler  : Request for isAlive API
                                                     ......
    INFO 5056 --- [nio-8191-exec-5] com.test.app.V1Controler  : Request for isAlive API     
    DEBUG 5056 --- [nio-8191-exec-5] com.test.app.hsm.HsmService  : Session [1176]
INFO 5056 --- [nio-8191-exec-5] com.test.app.V1Controler  : Request for isAlive API
2018-08-14 10:39:06.550 ERROR 1 --- [nio-8443-exec-3] com.test.app.hsm.HsmService  : HSM return error [MSG_ERROR general error] 

我问是否有人知道 Cryptoki.C_OpenSession 的工作原理以及我为什么要断开与 HSM 的连接

通常 HSM 的可用会话数量有限。当前您正在打开会话,但您永远不会使用 C_CloseSession 关闭它们。您应该将会话视为资源来处理,而资源可能是稀疏的。

请注意,还有一个名为 C_TokenInfo 的函数可用于检查令牌状态。确保您使用正确的功能来完成工作。您不想在不需要时使用密码。