keytool - 查看公钥和私钥

我以编程方式创建了jks类型(即默认类型)的Java密钥库。
它最初是空的,所以我创建了一个DSA证书。

keytool -genkey -alias myCert -v -keystore trivial.keystore

如何查看公钥和私钥?
即,是否有命令可以打印证书的私钥?
在我的理解中,我只能找到哪个将证书作为一个整体打印出来:keytool -certreq

-----BEGIN NEW CERTIFICATE REQUEST-----
MIICaTCCAicCAQAwZTELMAkGA1UEBhMCR1IxDzANBgNVBAgTBkdyZWVjZTEPMA0GA1UEBxMGQXRo
BQADLwAwLAIUQZbY/3Qq0G26fsBbWiHMbuVd3VICFE+gwtUauYiRbHh0caAtRj3qRTwl
-----END NEW CERTIFICATE REQUEST-----

我假设这是整个证书。如何通过 keytool 查看私钥(或公钥)?


答案 1

您在密钥库中创建了一个私有(和关联的公钥)密钥。为了使它真正可用,您可以让认证机构(CA)对其进行签名 - 因为这是命令(您将输出发送给此认证机构,以及其他一些信息和一些钱,然后他们发回证书,然后您可以将其导入密钥库。-certreq

查看私钥不是故意的...您通常不需要它,因为您在Java程序中使用密钥库,并且这知道如何使用它。


编辑:既然你想查看你的密钥库,这里有一个快速的Java程序来做到这一点:

import java.io.*;
import java.security.*;
import java.security.cert.Certificate;

public class KeyPrinter {

    /**
     * to be invoked with these parameters:
     * 
     * [0]:  keystore-password
     * [1]:  filename
     * [2]:  alias
     * [3]:  entry-Password (if necessary)
     */
    public static void main(String[] params)
        throws IOException, GeneralSecurityException
    {
        char[] storePass = params[0].toCharArray();
        String fileName = params[1];
        String alias = params[2];
        KeyStore.ProtectionParameter entryPass;
        if(params.length > 3) {
        entryPass=new KeyStore.PasswordProtection(params[3].toCharArray());
        } else {
            entryPass = null;
        }

        KeyStore store = KeyStore.getInstance("JKS");
        InputStream input = new FileInputStream(fileName);
        store.load(input, storePass);

        KeyStore.Entry entry = store.getEntry(alias, entryPass);
        System.out.println(entry);

    }
}

首先调用以了解要查找的别名,然后使用密码和参数调用此程序。在私钥条目的情况下,它以可读的形式显示密钥本身以及包含公钥的自签名证书。对于“受信任的证书”,它仅显示公钥。keytool -list -keystore myStore


答案 2

不可以。
您可以从代码访问私钥,但不能使用 keytool 将其导出。
如果您需要导出私钥,请使用 OpenSSL

另一个选项:您可以生成 PKCS12 格式的密钥库。然后,您可以将其导入浏览器,然后导出私钥。