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

Java 通过SunPKCS11的HSM在命令行上工作,在Tomcat托管的webapp中失败,java,tomcat,smartcard,pkcs#11,Java,Tomcat,Smartcard,Pkcs#11,我有一个应用程序在Tomcat 9下运行,使用JDK 1.8.0_111作为运行时,在Windows 7 x64上,它试图通过SunPKCS11 CSP和OpenSC驱动程序使用NitroKey HSM 这在命令行中运行良好,包括在Tomcat服务使用的同一帐户下运行的shell 但是,在Tomcat下,SunPKCS11构造函数抛出带有消息“初始化失败”的ProviderException。到目前为止,我已经调试到C_GetSlotInfo返回CKR_GENERAL_错误;这将成为PKCS11

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

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

但是,在Tomcat下,SunPKCS11构造函数抛出带有消息“初始化失败”的ProviderException。到目前为止,我已经调试到C_GetSlotInfo返回CKR_GENERAL_错误;这将成为PKCS11Exception(没有进一步的细节),并包装在ProviderException中

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

有什么想法吗?如果HSM(或智能卡)已被移除并重新插入(例如,请参阅),则其他一些人已发布有关此类故障的查询,但这里的情况并非如此。令牌尚未被删除,其他所有内容都可以访问该令牌。但这些问题意味着在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通常有助于解决此问题。

谢谢。我本来打算尝试在不同的帐户下运行Tomcat(为了安全起见,现在它使用一个普通的特权帐户),但是忘记了。感谢您的提醒。我会做一些实验,然后汇报。好吧,这就是我在漫长的一天之后发布问题的结果。Tomcat作为启用了桌面交互的本地系统运行(因此在主会话/WinStation/Desktop而不是服务桌面上运行),确实可以访问HSM。这需要更多的调查,因为我真的不希望我的签名服务器作为交互式桌面上的本地系统运行,但这是一个解决办法。谢谢进一步的实验表明,它不需要与桌面交互,所以它不是桌面问题。好的,可能与1)登录类型或2)令牌权限有关。我可能会从那里缩小它的范围,并让它在一个降低权限的帐户中运行。(或者我可能只是让我的应用程序使用JNI来禁用线程令牌中不需要的priv,这会有所缓解。)再次感谢。@MichaelWojcik我的经验表明,这种行为与令牌或PKCS#11库有关。一些PKCS#11库(包括OpenSC项目提供的库)需要LocalSystem或LocalService才能工作,其他库则不需要。但我从未找到问题的根源。如果你发现什么,请告诉我。