SunPKCS11 在没有 CKO_CERTIFICATE 的情况下针对 HSM 的使用

SunPKCS11 usage against HSM without CKO_CERTIFICATE

我的问题涉及使用 Java (openjdk 11.0.12) 的 hsm。 Hsm 应该用于签名目的,通过 SHA512 RSA 算法。 我在下面的很多句子中可能是错误的,我对 HSM & co 完全是新手,所以我提前道歉。

据我了解,有三种方法:

1- 使用 SUNPKCS11 提供程序

2- 使用供应商库(hsm 附带了几个 jar,在我的例子中 nCipher 附带了 nCipherKM.jar,这应该是供应商提供者。)

3- openssl(我们有一些 c 语言的软件已经这样做了,我宁愿避免)

vendor lib 的使用非常简单,至少在 Get info 调用之前是这样,它向 HardServer 发送未知参数,导致无法编组的异常。这很难调试,没有记录通信协议。现在我把这个解决方案放在一边了。

无论如何我更喜欢 SUNPKCS11 解决方案,它对我来说不是开箱即用的,但调试和分析起来很简单。并且应该是一个标准。

在这种情况下,我使用欧洲 DSS 库与 PKCS11Provider 交互,使我的配置和实施变得更简单。

SunPKCS11 (vanilla) 初始化期间出现问题。

在某些时候,它会调用一个方法“P11Keystore.mapLabels()”,根据代码和 Oracle 文档,该方法匹配来自该插槽的所有私钥处理程序 (CKA_PRIVATE_KEY) 和证书处理程序 ( CKO_CERTIFICATE),寻找 cka_id 之间的匹配,以便使用包含 CKA_LABEL 属性的别名映射在内存密钥库中构建软件。 (私钥不可提取,因此访问权限为只读https://docs.oracle.com/javase/8/docs/technotes/guides/security/p11guide.html#KeyStoreRestrictions

在签名初始化中,这个私钥条目用于从 HSM(通过一些我没有的关键属性)获取私钥处理程序。

问题是我的 hsm nCipher 没有为 CKO_CERTIFICATE 公开任何对象,所以匹配 returns 0 结果和我的软件密钥库是空的。

当我尝试从密钥库中提取私钥处理程序时,我什么也没得到,而且我无法初始化 Signature 对象。

我的前任手动将私钥属性包装在本地 jks 中,并重写了一个新的提供程序以便从文件而不是从 HSM/PKCS11.

加载证书

我不喜欢这个解决方案,我不希望我的应用程序具有依赖于 HSM 证书的配置。处理这些密钥的是 HSM 证书工作,而不是我的。

相反,我编写了另一个提供程序来直接从 CKA_PRIVATE_KEY 获取并使用私钥处理程序,使用预配置的 CKA_LABEL,绕过证书匹配。并且有效。

不过我也不喜欢这个方案,这意味着标准协议的维护成本更高,而且每次都必须对 jar 进行签名,这对我来说很麻烦。

我感觉我是从错误的角度来解决这个问题的,也许是因为我是个菜鸟。

讲解完毕,下面是我的问题: 1- 我声称 CKO_CERTIFICATE 是 SunPKCS11 的先决条件是错误的吗? 1- Could/Should HSM 公开 CKO_CERTIFICATE 对象没有恶意副作用? 2- 这个丢失的对象是 nCipher HSM 的限制,还是安装过程中缺少配置? (即使没有它也能工作,所以它是 java 的先决条件,而不是缺少 HSM) 3- 如果 CKO_CERTIFICATE 无法安装和公开:是否可以实施我们自己的提供程序来获得解决方法,或者是否存在更好的方法来使其工作?

对不起我的英语,我不是母语。 感谢前来阅读到这里并愿意回答的人。

..差不多一个月后..

我已经完成了我的应用程序,现在我对参数有了更多的了解,它适用于以下模式:

  1. 针对 Docker SoftHSM2 图像的标准 SunPKCS11。 HSM 包含 CKO_CERTIFICATE PUBLIC_KEY 和 PRIVATE_KEY,在同一个插槽中,具有相同的 CKA_ID.All 工作正常且完美。
  2. 自定义 PKCS11 扩展,我必须 copy/paste 几乎每个 class 来自 java 安全包(因为 Java 11~17 带有 sun.* 包),只是为了改变证书检索逻辑中的几行,删除 CKO_CERTIFICTE 请求并按文件加载它 (crt/p12).
  3. P12,包含所有信息,用作模拟版本,仅供本地使用。

我尝试扩展 Bouncy Castle Fips 提供程序,而不是 SunPKCS11,但没有成功。

最终我认为是无法完成我所需要的,问题出在服务器配置上,这是无法通过客户端软件解决的。 无论如何,我将修复服务器配置,采用第一个工作案例,放弃自定义 PKCS11 解决方案,仅将其保留用于学术目的。