【问题标题】:private key, public key and certificates relationship and best way to access specific certificate from keystore私钥、公钥和证书关系以及从密钥库访问特定证书的最佳方式
【发布时间】:2017-11-23 12:29:54
【问题描述】:

我使用了下面的keytool命令:

keytool -genkey -alias <alias name> -keypass <keypassword> -keystore <keystore file name with location> -keyalg "RSA" -sigalg SHA1WITHRSA

然后我使用以下命令查看了密钥库的内容:

keytool -list -v -keystore <keystore file name with location>

显示如下内容:

Keystore type: JKS
Keystore provider: SUN

Your keystore contains 1 entry

Alias name: keyalias
Creation date: Nov 23, 2017
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=XXXXX, OU=SDG, O=XXXXX, L=XXXXX, ST=XX, C=IN
Issuer: CN=XXXXX, OU=SDG, O=XXXXX, L=XXXXX, ST=XX, C=IN
Serial number: 6c6ec57a
Valid from: Thu Nov 23 14:30:35 IST 2017 until: Wed Feb 21 14:30:35 IST 2018
Certificate fingerprints:
MD5:  85:08:01:27:BF:CA:88:17:88:11:9D:E4:DF:DC:70:AD
SHA1: 6D:14:08:BD:F6:4E:51:C2:A0:58:46:89:CC:85:06:BC:26:DA:23:4E
SHA256: D6:94:A8:31:2F:5D:29:FA:29:5F:8C:5D:24:D0:8E:47:D4:17:4C:B8:8A:
D8:A2:37:3F:18:24:5A:06:C1:E4:CB
Signature algorithm name: SHA1withRSA
Version: 3

Extensions:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
    KeyIdentifier [
        0000: 50 AD ED B0 1D 3D 12 AE   D4 C0 C7 EE 9F EE 43 11  P....=........C.
        0010: F4 71 02 93                                        .q..
    ]
]

*******************************************
*******************************************

我只能在密钥库中看到一个条目。希望得到以下问题的答案:

  1. 公钥在哪里?

  2. 我还可以看到证书,但我没有创建相同的证书。如果我需要在 java 代码中访问这个证书,那么我需要使用密钥别名还是可以设置任何单独的别名来访问这个证书?

如果有人能解释私钥、公钥和证书如何在密钥库中链接,以及如何从密钥库访问特定证书(假设密钥库有多个证书),那将非常有帮助。

【问题讨论】:

    标签: java keytool


    【解决方案1】:

    keytool -genkey -alias

    很好,您刚刚创建了一个密钥对。

    keytool 命令使用自签名证书创建密钥对。事实上,在同一个别名中,您有一个 PrivateKey 和 X509 证书(PublicKey + 一些属性)

    公钥在哪里?

    在这种情况下,公钥包含在证书中。

    如果我需要在 java 代码中访问此证书,那么我需要使用密钥别名还是可以设置任何单独的别名来访问此证书?

    以下代码从密钥对返回证书和公钥

    KeyStore.PrivateKeyEntry privKeyEntry = (KeyStore.PrivateKeyEntry)keystore.getEntry(KEYSTORE_ALIAS, new KeyStore.PasswordProtection(KEYSTORE_KEY_PASSWORD.toCharArray()));
    
    PublicKey pubKey = privKeyEntry.getCertificate().getPublicKey();
    

    如果有人能解释私钥、公钥和证书如何在密钥库中链接,那将非常有帮助

    显然你已经发现了:)

    【讨论】:

      【解决方案2】:

      只是回答自己的问题,可能对其他人也有帮助。

      私钥包含一系列数字。其中两个数字构成“公钥”,其他数字是您的“私钥”的一部分。 “公钥”位也嵌入在证书中。要检查证书中的公钥是否与私钥的公共部分匹配,您需要查看证书和密钥并比较数字。

      要从私钥访问证书,您需要使用私钥别名,该别名可以在列出密钥库的内容时公开找到。

      【讨论】:

        最近更新 更多