叶证书和子证书的用途是什么以及如何使用它们?

Vic*_*tor 5 java certificate ca x509certificate

我在与 AppleWallet 开展业务时遇到问题。\n他们为我提供了三个证书:

\n\n
    \n
  1. 字符串格式的叶证书\xef\xbc\x9b
  2. \n
  3. 字符串格式的子证书;
  4. \n
  5. Apple Root CA - G3 证书文件,以“.cer”结尾
  6. \n
\n\n

我的问题:如何使用 RSA 算法验证和编码数据?

\n\n

PS\xef\xbc\x9a该文档明确指出公钥是由叶证书提供的。并且这三个证书是连锁的。叶证书由子证书签名,子证书由 AppleRootCA-G3.cer 签名。

\n\n

我需要做两件事:

\n\n
    \n
  1. 验证三张证书。
  2. \n
  3. 从叶证书中提取 RSA 公钥。
  4. \n
\n\n

我不知道该怎么做。

\n

alw*_*arn 10

如果您没有将其作为链获得,您基本上要做的就是构建一个证书链。证书链基本上由第 0 个位置的最终实体证书(也是叶证书,链中最重要的证书)和后面的不太重要的证书组成。CA 证书是最不重要的。

这就是通常的 X.509 证书链的样子:

3. CA Certificate (self-signed)
    |
    |__ 2. Sub CA Certificate (signed by the above CA)
            |
            |__ 1. Sub-sub CA Certificate (if any) (signed by the above Sub CA)
                    |
                    |__ 0. End Entity Certificate (your certificate, signed by the above cert)
Run Code Online (Sandbox Code Playgroud)

当您自己根据每个证书构建证书链时,您必须查看哪个证书由谁签名,然后以上述方式构建链(树中的数字表示 java 证书数组中的索引)。

您可以通过查看SubjectDNIssuerDN来找到哪个证书是由谁签署的。主题专有名称是最终实体,颁发者专有名称是签署您的证书的实体的名称。

如果您需要以编程方式验证一个证书是否由另一个证书签名,您可以这样做:

userCert.verify(caCert.getPublicKey());

您可以使用以下代码片段从证书中提取公钥:

CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
// Provided the certificate doesn't have certificate headers (---begin cert--- and ---end cert---)
Certificate cert = certificateFactory.generateCertificate(new FileInputStream(new File("CERTIFICATE_PATH")));

System.out.println(cert.getPublicKey());
Run Code Online (Sandbox Code Playgroud)