【问题标题】:How to print the public key of a certificate using keytool?如何使用 keytool 打印证书的公钥?
【发布时间】:2012-04-23 14:57:39
【问题描述】:

keytool 有没有办法打印证书的公钥?我试过了:

keytool -printcert -file client.crt

但它只提供以下信息:

Owner: CN=client, OU=as, O=as, L=as, ST=as, C=as
Issuer: EMAILADDRESS=as, CN=ca, OU=as, O=as, L=as, ST=as, C=as
Serial number: 3
Valid from: Tue Apr 10 12:18:47 GMT+05:30 2012 until: Wed Apr 10 12:18:47 GMT+05
:30 2013
Certificate fingerprints:
         MD5:  26:C0:29:E9:8C:AB:C3:9E:95:38:74:8A:87:D3:86:8D
         SHA1: 5C:5A:BA:47:44:83:7E:CB:48:BE:DD:E5:39:51:24:42:C6:C5:60:8B
         SHA256: DA:26:B8:C8:F4:04:3E:62:F3:7F:3B:EC:1D:9F:85:66:28:00:45:55:66:
15:FF:BB:37:77:97:59:F0:EC:0B:B6
         Signature algorithm name: SHA1withRSA
         Version: 1

这里面没有公钥。

【问题讨论】:

  • 有一种方法可以使用带有 -list 选项的 keytool 来执行此操作,但接受的答案是使用 openssl。请参考下面 Vlad Sankin 的回答。

标签: java certificate keytool


【解决方案1】:

你可以这样做:

keytool -list -rfc -keystore mykeystore.jks -alias certificate_alias -storepass password

示例运行:

PS c:\sample> keytool -list -rfc -keystore mykeystore.jks -alias cert_alias -storepass password
Alias name: cert_alias
Creation date: Apr 25, 2014
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
-----BEGIN CERTIFICATE-----
MIIB4zCCAUygAwIBAgIIRzI14w7rL20wDQYJKoZIhvcNAQENBQAwMzELMAkGA1UEBhMCVVMxDTAL
BgNVBAoTBE5vbmUxFTATBgNVBAMTDE5vbmUgb3U9Tm9uZTAgFw0xNDA0MjQxNzQ0NDJaGA8yMTE0
MDQyNTE3NDQ0MlowMzELMAkGA1UEBhMCVVMxDTALBgNVBAoTBE5vbmUxFTATBgNVBAMTDE5vbmUg
b3U9Tm9uZTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAivXBBtFnJTm1NbHysv3Mnpn/lCg6
1onJDxr/jkvI8+1Bljs1jktyYOeKDWxJwpDU7QyIqttgtDvRT4Yaew5WiQyADIyY0cBTvp3S7uKx
M5C3zxZdG6WTflU7xcYnGk3/d0VhwA6BL9YPsRaS/K+ww1yvxWKIOPW68wDe0ccvGWcCAwEAATAN
BgkqhkiG9w0BAQ0FAAOBgQB/5qDMA9fmlCWlOD9aHjBD6I8zAOSshMCFK8XcZJHowag8WtZyL3DR
insx2HoDlBewIJAEtAplo2NpeFyNtK93PS7zV+vwEYHCu46Db3klMksp3MmSXD39QPlmwfsGZlja
K8Ww0TsR5GtccFMH41KKa+PlvVZNEdZumdrca59olQ==
-----END CERTIFICATE-----

【讨论】:

  • 假设 openssl 不可用并回答实际问题(如何使用 keytool 打印公钥部分)。
  • 问题询问如何打印证书的公钥。此输出是整个证书的 PEM 编码表示。公钥输出将以'-----BEGIN PUBLIC KEY-----'开始
  • 2 年后我现在意识到@VladSankin 只是在描述如何获取证书作为使用 openssl 从中提取公钥的先驱。因此,在已接受的答案的基础上,您可以执行类似 keytool -list -rfc -keystore mykeystore.jks -alias cert_alias -storepass password | openssl x509 -inform pem -pubkey -noout | openssl rsa -pubin -text -noout 的操作
  • 为什么样本是 PrivateKeyEntry ?是私钥吗?
  • 如果您提到keytool的-rfc参数的文档和用途会很棒
【解决方案2】:

您可以通过 openssl 做到这一点。

如果此证书是 DER 编码(二进制),请使用:

openssl x509 -inform der -in client.crt -pubkey -noout

对于 PEM 编码,使用 -inform pem 选项(或根本不使用 -inform)。

要查看公钥的详细信息,请使用:

openssl x509 -inform der -in client.crt -pubkey -noout | openssl rsa -pubin -text -noout

【讨论】:

  • 感谢您的回答。我能够看到公钥。但是有没有办法在keytool中做到这一点?
  • 有一种方法可以使用带有 -list 选项的 keeytool 进行打印,请参考@Vlad Sankin 的回答
【解决方案3】:

您可以将证书打印为 pem 格式,然后使用 openssl 从 pem 格式打印公钥。

  1. -rfc 选项添加到-printcert

    keytool -printcert -rfc -file client.crt

  2. 将如下输出保存到文件 client.pem

    -----开始证书----- MIIB4zCCAUygAwIBAgIIRzI14w7rL20wDQYJKoZIhvcNAQENBQAwMzELMAkGA1UEBhMCVVMxDTAL

    ......

    -----结束证书-----

  3. 然后使用openssl

    openssl x509 -inform pem -text -in client.pem

所以你得到了公钥

【讨论】:

  • 无中间文件:keytool -list -rfc --keystore ./path_to_keystore.jks | openssl x509 -inform pem -pubkey
【解决方案4】:

Keytool list rfc 只打印整个证书的 base64 编码 版本,而不是 公钥。 Keytool 不支持打印证书的公钥。为此,我们可以使用 openssl

【讨论】:

    【解决方案5】:
    keytool -export -alias myalias -keystore mystore.jks  | openssl x509 -inform der -pubkey -noout
    

    【讨论】:

      猜你喜欢
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 2019-10-30
      • 1970-01-01
      • 2012-12-31
      • 2016-06-27
      • 1970-01-01
      • 2014-03-01
      相关资源
      最近更新 更多