我有一个在Tomcat 9下运行的应用程序,在Windows 7 x64上使用JDK 1.8.0_111作为运行时,试图通过SunPKCS11 CSP和OpenSC驱动程序使用NitroKey HSM。
从命令行可以正常工作,包括在Tomcat服务使用的同一帐户下运行的shell。
但是,在Tomcat下,SunPKCS11构造函数抛出一个ProviderException,并显示消息" Initialization failed"。到目前为止,我已将其调试到C_GetSlotInfo,返回CKR_GENERAL_ERROR;这变成了PKCS11Exception(没有进一步的细节),并且包含在ProviderException中。
插槽号是正确的--NitroKey只有一个插槽,因此数字为0.除了应用程序本身,我通过PKCS#11使用带有keytool,OpenSSL等的HSM也没有问题。 (或者通过CAPI,就此而言。)它只能在Tomcat下失败。
有什么想法吗?如果HSM(或智能卡)已被移除并重新插入,其他一些人已发布有关此类故障的查询 - 请参阅例如remove and insert smartcard using sunpkcs#11 and tomcat - 但事实并非如此。令牌尚未删除,其他所有内容均可访问。但这些问题意味着在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。如果构造函数没有抛出异常,那么后来会出现这些。
答案 0 :(得分:0)
某些用户在Microsoft IIS应用程序服务器上包括我encountered similar problem。将用户帐户更改为LocalSystem或LocalService通常有助于解决问题。