通过 SunPKCS11 的 HSM 在命令行上工作,在 Tomcat 托管的 webapp 中失败

HSM via SunPKCS11 works on command line, fails in Tomcat-hosted webapp

我在 Tomcat 9 下有一个应用程序 运行,使用 JDK 1.8.0_111 作为运行时,在 Windows 7 x64 上,正在尝试通过 SunPKCS11 CSP 和 OpenSC 驱动程序使用 NitroKey HSM。

这在命令行中运行良好,包括在与 Tomcat 服务使用的相同帐户下的 shell 运行。

然而,在 Tomcat 下,SunPKCS11 构造函数抛出带有消息 "Initialization failed" 的 ProviderException。到目前为止,我已经将其调试为 C_GetSlotInfo 返回 CKR_GENERAL_ERROR;成为 PKCS11Exception(没有进一步的细节)并被包装在 ProviderException 中。

插槽编号正确 - NitroKey 只有一个插槽,因此编号为 0。除了应用程序本身,我通过 PKCS#11 使用 HSM 和 keytool、OpenSSL 等没有问题。 (或者通过 CAPI,就此而言。)它仅在 Tomcat.

下失败

有什么想法吗?如果 HSM(或智能卡)已被移除并重新插入,其他一些人已经发布了关于此类故障的查询 - 例如参见 [​​=12=] - 但这里不是这种情况。该令牌尚未删除,其他所有内容均可访问。但是这些问题意味着在 Tomcat.

下使用 SunPKCS11 和 OpenSC 没有固有的限制

我将获取 JDK 源并进一步调试 C_GetSlotInfo,并尝试一些其他实验,例如使用适当的选项生成 keytool,看看它是否可以与卡通信.但如果有人有任何其他建议,我会很高兴听到他们。

以防万一有人需要详细信息:我正在使用一个参数调用 SunPKCS11 构造函数,即配置文件的路径。它正在成功读取文件(如果文件路径是伪造的或文件不可读,我会得到一个不同的异常)。文件很简单:

# PKCS#11 configuration file for Java to use NitroKey in slot 0 on Windows
name = NitroKey
library = c:/Windows/System32/opensc-pkcs11.dll
slotListIndex = 0

在故障点,SunPKCS11 尚未看到任何其他详细信息,例如密钥容器名称或 HSM PIN。如果构造函数没有抛出异常,这些会在稍后出现。

包括我在内的一些用户 在 Microsoft IIS 应用程序服务器上。将用户帐户更改为 LocalSystem 或 LocalService 通常有助于解决问题。