当前位置: 首页 > 知识库问答 >
问题:

使用sunpkcs#11和tomcat卸下和插入智能卡

公孙志尚
2023-03-14

我有一个在Tomcat上运行的web应用程序。我的应用程序使用一个web服务,它可以签名(通过智能卡)和发送电子邮件。web服务本身会在第一次通话期间和发送电子邮件之前自动添加sunpkcs 11提供者,然后在智能卡未卸下和插入的情况下登录并发送电子邮件。如果删除并插入,为了发送电子邮件,我必须重新启动tomcat服务器,否则它会根据我的代码给出几个错误:

result= api.signAndSend(to, cc, bcc, subject, content, smartCardPin); 

卸下和插入智能卡后,此代码会显示以下异常消息:

令牌已删除

以下是我的尝试:

  1. 在发送电子邮件并创建新的sunpkcs 11提供者并添加它之后,我尝试删除该提供者。它给出了如下错误:

Java语言安全InvalidKeyException:没有安装的提供程序支持此密钥:sun。安全P11Key$P11PrivateKey或java。安全InvalidKeyException:没有安装的提供程序支持此密钥:null

而是:

  result= api.signAndSend(to, cc, bcc, subject, content, smartCardPin);  
  SunPKCS11 sunPKCS11=(SunPKCS11)getLastProvider();  
  sunPKCS11.logout();  
  sunPKCS11.setCallbackHandler(new MyCallbackHandler());  
  KeyStore.CallbackHandlerProtection cpprotection = new KeyStore.CallbackHandlerProtection(  
  new MyCallbackHandler());  
  KeyStore.Builder builder = KeyStore.Builder.newInstance(  
  "PKCS11", sunPKCS11, cpprotection);  
  KeyStore ks = builder.getKeyStore();  

//finalize PKCS#11  
Field moduleMapField = PKCS11.class.getDeclaredField("moduleMap");  
  moduleMapField.setAccessible(true);  
  Map<?, ?> moduleMap = (Map<?, ?>) moduleMapField.get(null);  
  moduleMap.clear(); // force re-execution of C_Initialize next time  

//load PKCS#11(i expect this code to load pkcs#11 again but i am not sure)  
Method getInstanceMethod = PKCS11.class.getMethod("getInstance",  
  String.class, String.class, CK_C_INITIALIZE_ARGS.class,  
  Boolean.TYPE);  
  CK_C_INITIALIZE_ARGS ck_c_initialize_args = new CK_C_INITIALIZE_ARGS();  
  PKCS11 pkcs11 = (PKCS11) getInstanceMethod.invoke(null, pkcs11Path,  
  "C_GetFunctionList", ck_c_initialize_args, false);  

代码给出:

) . . . 提供者异常:初始化在CKR_KEY_HANDLE_INVALID11失败。P11SC_SignInit(P11SC_SignInit)在11.java:172111。P11Ssun.security.pkcsInitSign(P11Signature.initialize)在ignature.java:311签名$Delegate.init(Signature.java:1127)在java.security.签名$Delegate.choose提供者(Signature.java:1087)在java.security.签名$Delegate.engineInitSign(Signature.java:1151)在java.security.Signature.init标志(Signature.java:512)在org.esign.bouncycastle.operator.jcajce.JcaContentSignerBuilder.build(未知来源java.security.由以下原因引起:sun.security.pkcs11.wrapper.PKCS11异常:sun.security.pkcssun.security.pkcs11.wrapper.PKCS11。ignature.initialize(本机方法)在sun.security.pkcs11.wrapper.PKCS11$同步PKCS11。ignature.java:319(PKCSsun.security.pkcs)在ignature.engine11。P11Signature.java:432(P11java.security.)

java:1.8.0.31

编辑:我删除并添加SunPkcs#11,如下所示:

//the code below adds sunpkcss provider automatically after first call
result= api.signAndSend(to, cc, bcc, subject, content, smartCardPin);

//after each signAndSend i remove sunpkcs and add a new one
String sunpkcs11Name=getLastProvider().getName();
Security.removeProvider(sunpkcs11Name);

String cfg = MessageFormat.format(
                "name = Starcos-SunPkcs11  library = c:/windows/system32/aetpkss1.dll slot = 52481 ");
        InputStream is=new ByteArrayInputStream(cfg.getBytes());

SunPKCS11 newSunPkcs11Provider = new SunPKCS11(is);
Security.addProvider(newSunPkcs11Provider);

之后,我添加了一个新的SunPkcs11,而api。signAndSend(…) 它提供:

Java语言安全InvalidKeyException:没有安装的提供程序支持此密钥:

这个异常并不是因为缺少SunPkcs11,因为我在providers列表中看到了我添加的SunPkcs11。

共有1个答案

范彭亮
2023-03-14

这类问题很难找到确切的解决方案,因为很难重现,因此根据我的阅读,PKCS#11已经涵盖了根据其文档插入和移除智能卡的场景,

对于将PKCS#11令牌视为静态密钥库的应用程序来说,这很好。对于希望更动态地容纳PKCS#11令牌的应用程序,例如插入和移除智能卡,可以使用新的密钥库。生成器类。以下是如何使用回调处理程序初始化PKCS#11密钥库的生成器的示例。

您已经提到,删除和添加提供程序并不适用于您,但根据这篇文章,他们通过这种方式解决了这个问题。

 类似资料:
  • 在家庭和城市实施物联网系统使它们成为智能家居和智能城市。 智能家居或智能城市让生活变得更加轻松和智能。 智能家居系统可以让我们的生活变得轻松。 从能源管理开始,使用恒温器的AC设备中的电源控制系统,所有这些都可以减少功耗。 门锁管理系统,安全管理系统,水管理系统也是其中的一部分。 尽管如此,这些都是智能家居系统中突出的重要因素。 任何希望自动化或想生活更轻松的事情都可以成为智能家居的一部分,智能家

  • 问题内容: 我有一个IC接触式读卡器和SLE5528智能卡。想知道如何真正开始使用这些物品。 正在读取读取器,插入智能卡后看不到任何影响。 我还从http://www.openscdp.org/安装了opensmart的智能卡外壳 但是我不能用它来读任何读卡器。我想知道它是否有兼容性问题。 请我知道我可能不恰当地提出了这个问题,但是请那里的任何人帮助我。 任何相关的链接或有用的信息都可以帮助我入门

  • 我正在尝试测试一个KnoxToken服务背后的应用程序,用户需要使用智能卡和他的PIN。使用JMeter来测试没有安全特性的应用程序,效果和预期的一样。 在这种情况下,我得到一个错误:javax . net . SSL . SSL handshakeexception:远程主机在握手期间关闭了连接 从Jmeter- 从日志文件:

  • 我正在尝试在一个新的Spring Boot应用程序中使用WebFlux反应类型。我在https://start.spring.io上使用了initializr,并选择了2.0.0快照版本。我添加了web reactive dependency,我所做的一切工作都很好。这是一个非常可靠的POC,目标是如何利用这些类型来更新我们的API,为了做到这一点,我们计划缓慢地替换阻塞和/或同步进程的每个部分,

  • 问题内容: 我正在向SQLite3数据库中进行大批量插入,并且试图了解我应该期望的性能与实际看到的性能之间的关系。 我的桌子看起来像这样: 和我的插入看起来像这样: 元组列表在哪里。 目前,在一台2008年的Macbook上运行,在数据库中大约有1200万行的情况下,插入行花了我大约16分钟的时间。 这听起来合理吗,还是发生了什么大事? 问题答案: 据我了解,性能不佳的主要原因是浪费时间来执行许多

  • 智能路线规划,多用于为物流配送、客户拜访等多目的地的出行计算高效的旅行路线,提高效率,节约成本。 ● 添加多个途径点 ● 指定途径点顺序规划 ● 不指定途径点顺序规划 ● 重新规划线路