当前位置: 首页 > 面试题库 >

来自CA的PKCS12 Java密钥库和Java中的用户证书

庄实
2023-03-14
问题内容

我最近负责模拟Java中的Apple产品(iPhone配置实用程序)。我一直停留的部分内容之一是有关Exchange
ActiveSync的部分。在其中,它允许您从钥匙串中选择一个证书,以用作EAS帐户的凭据。经过研究,我发现它实际上是在创建PKCS12密钥库,将我选择的证书的私钥插入,并将其编码为XML。到目前为止,没什么大不了的。如果我使用钥匙串访问权限创建了.p12文件,则该文件可以顺利上传。但是,当我尝试将其引入Java时遇到了一个问题。

假设我将以前与.p12文件一起使用的那些证书之一导出为.cer文件(这是我们期望在环境中获得的证书)。现在,当我将其上传到Java时,我得到一个Certificate对象,如下所示:

KeyStore ks = java.security.KeyStore.getInstance("PKCS12");
ks.load(null, "somePassword".toCharArray());

CertificateFactory cf = CertificateFactory.getInstance("X.509", new BouncyCastleProvider());
java.security.cert.Certificate userCert  = cf.generateCertificate(new FileInputStream("/Users/me/Desktop/RecentlyExportedCert.cer"));

但是当我尝试…

ks.setCertificateEntry("SomeAlias", userCert);

我有例外…

java.security.KeyStoreException: TrustedCertEntry not supported

因此,从证书开始,我将重点放在密钥上。但是有了这些证书(我也获得了CA证书),我只能访问公钥,而不能访问私钥。如果我尝试像这样添加公钥…

java.security.cert.Certificate[] chain = {CACert};
ks.setKeyEntry("SomeAlias", userCert.getPublicKey().getEncoded(), chain);

我知道了

java.security.KeyStoreException: Private key is not stored as PKCS#8 EncryptedPrivateKeyInfo: java.io.IOException: DerValue.getOctetString, not an Octet String: 3

所以现在我在这里。有谁知道如何从.cer文件中获取私钥到Java中的PKCS12密钥库中?我是否在正确的轨道上?

提前致谢!


问题答案:

PKCS#12格式用于存储与证书链关联的私钥,并且两者都是必需的(尽管您可能不需要整个链)。尽管PKCS12密钥库类型在将这种格式映射到Java方面做得很好KeyStore,但是由于这个原因,并非所有内容都受支持。

您第一次尝试要做的是自己存储证书,这是行不通的。

第二次尝试(ks.setKeyEntry("SomeAlias", userCert.getPublicKey().getEncoded(), chain))中要执行的操作是使用公钥代替应该是私钥的东西(请参阅参考资料KeyStore#html" target="_blank">setKeyEntry)。

.cer文件通常仅用于证书而不是私钥(当然,扩展名最终仅是一种指示)。如果.cerKeychain Access.app
导出文件,则不会获得私钥(这就是.p12导出格式的用途)。

编辑 有关KeychainStore的内容:

如果您尝试进行此转换的原因最终是访问钥匙串中已存在的私钥和证书,则可以KeychainStore直接从中加载它们:

KeyStore ks = KeyStore.getInstance("KeychainStore", "Apple");
ks.load(null, "-".toCharArray());

一些注意事项:

  • 任何非空,非空的密码都将使用私钥(例如"-".toCharArray()),因为访问将由操作系统的安全服务提示(就像在其他应用程序中一样)。
  • 据我所知,仍然存在一个错误,它仅允许访问一个私钥/证书对(即使钥匙串中存在许多对私钥/证书对)


 类似资料:
  • 我是新来配置Jetty服务器的SSL。我按照digcert的步骤创建了私钥文件、证书请求CSR文件。 我向CA发送了证书请求,并拿回了我签名的CSR。但是CA给我发了一个有两个证书的捆绑包,一个是我的证书,由CA签名,第二个是CA证书。(1star_xyx_abc_comcrt文件,2.CRT文件)。现在我面临着从这些文件创建密钥库的麻烦。 当我按照Oracle文档的步骤4、5和6使用keytoo

  • 问题内容: 我需要设置一个在Jersey- Client应用程序中使用。我要做的就是接受自定义根ca证书的上下文。真的没有办法生成密钥库文件和导入CA证书吗? 问题答案: 真的没有办法生成密钥库文件和导入CA证书吗? 有一些方法可以在没有密钥库文件的情况下执行此操作,但是由于必须加载要信任的CA证书,因此必须以某种方式加载文件或资源。 (您当然也可以实现自己的实现,使所有调用都使用Certific

  • 本任务将演示将现有的证书和密钥添加到 Istio CA 中。 默认情况下,Istio CA 生成自签名 CA 证书和密钥,并使用它们签署工作负载证书。Istio CA 也可以使用我们指定的证书和密钥来签署工作负载证书。接下来我们将演示将证书和密钥插入 Istio CA 的示例。 开始之前 根据安装指南中的快速入门指南,在 Kubernetes 集群中安装 Istio。 在安装步骤的第四步应该启动身

  • 问题内容: 我的Java程序如何知道包含证书的密钥库在哪里?或者,如何告诉我的Java程序在哪里寻找密钥库? 在以某种方式指定了密钥库之后,如何指定用于对服务器进行身份验证的证书? 问题答案:

  • null 大多数示例使用makecert或New-SelfSignedCertificate创建证书。在这种情况下,对于生产应用程序,自签名证书是否有问题?这仅供应用程序使用Azure Key Vault进行身份验证,客户机在浏览器中不会看到这一点。 如果在这种情况下,自签名证书仍然不受欢迎,那么从受信任的权威机构购买证书是否与购买SSL/TLS证书的过程相同?甚至是同一类型的证书吗?

  • 谷歌云SQL通过为您生成服务器和SSL连接。我通过以下步骤设法让我的Java客户端连接到云SQL: 1)将服务器CA证书导入信任库文件: 2) 将客户端证书和客户端密钥捆绑到pkcs12文件中: 3)将pkcs12导入密钥库文件: 4)告诉JVM使用我的信任库和密钥库: 这一切都有效,但不幸的是,它排除了来自其他客户端库的出站HTTPS连接——在我的例子中,是Firebase java客户端库。问