首页 > 解决方案 > 使用 LunaProvider 在 HSM 中进行并发签名会抛出 CKR_DATA_INVALID

问题描述

当我同时尝试使用 HSM 中的相同密钥进行签名时,一些签名失败并出现以下错误:com.safenetinc.luna.exception.LunaCryptokiException: function 'C_Sign' returns 0x20 (CKR_DATA_INVALID)

只有一个线程和一个我的 jar 实例,我没有错误。更多线程我更经常签名失败。 重要的一点,如果我有 2 个实例,每个实例只有一个线程,也会出现问题。

我正在使用 Luna JSP 提供程序。算法是 SHA256withECDSA。

我也尝试了令牌连接,但结果相同。我在 crystoki.ini 中检查了我的超时,在超时之前发生了失败。即使为 keyStore 或 privateKey 使用 Singleton,我也有问题。

线程生成器:

public static void main(String[] args)  {
    SpringApplication.run(DccHsmTest.class, args);


    for (int i=0; i<4; i++)
    {
      Multithreading object = new Multithreading();
      object.start();
    }
  }
 private byte[] CHALLENGE = new byte[10000];

 public void run()
  {
    try
    {
      final HsmService hsmService = new HsmService();

      hsmKeyStore = hsmService.hsmKeyStore(hsmPartition, hsmPassword);

      PrivateKey privateKey = (PrivateKey) hsmKeyStore.getKey(aliasToRetrieve, password);

      while(sign(privateKey)){
        ...
      }

      throw new RuntimeException();
    }
    catch (Exception e)
    {
      ...
    }
  }

  private static boolean sign(PrivateKey privateKey)  {
    try {
      Signature signature = Signature.getInstance("SHA256withECDSA", "LunaProvider");

      signature.initSign(privateKey);
      signature.update(CHALLENGE);

      signature.sign();
      return true;
    }
    catch(Exception e){
      ...    
      return false;
    }
  }

HsmService

@Service
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
public class HsmService {

  public KeyStore hsmKeyStore(String hsmPartition, String hsmPassword) throws
KeyStoreException,                                                                   CertificateException,                                                                       NoSuchAlgorithmException,                                                                       IOException {

    LunaProvider lunaProvider = new LunaProvider();
    Security.addProvider(lunaProvider);

    LunaSlotManager lunaSlotManager = LunaSlotManager.getInstance();
    lunaSlotManager.login(hsmPartition, hsmPassword);


    KeyStore keyStore = KeyStore.getInstance("Luna");
    keyStore.load(null, null);
    return keyStore;
  }
}

CKR_DATA_INVALID 的错误定义是:
加密操作的明文输入数据无效。

但我总是传递相同的输入,有时它会起作用。

The CKlog doesn't provide much details : FINISign CKR_DATA_INVALID (5811ms) {"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" }

只是似乎返回了一个错误的签名

标签: javasignaturehsm

解决方案


最后一个简单的重启解决了这个问题。现在我必须找出这个问题是由于我的代码中 HSM 使用不当,还是由于其他开发人员的测试(HSM 被其他项目使用)


推荐阅读