从密钥库中的文件读取公共密钥

问题描述 投票:15回答:7

嗨,我想使用Java代码从KeyStore中提取公钥

我正在创建密钥库

keytool -genkey -alias mykeystore -keyalg RSA -keystore mykeystore.jks -keysize 2048

并将公众导出到另一个文件中

keytool -export -alias mykeystore -keystore mykeystore.jks -rfc -file publickey.cert

如何使用Java代码从密钥库或publickey.cert文件中获取公共密钥字符串?

谢谢。

UPDATE

public static void main(String[] args) {

    try {

        FileInputStream is = new FileInputStream("/home/myuser/my-keystore/mykeystore.jks");
        KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
        String password = "myuserpass";
        char[] passwd = password.toCharArray();
        keystore.load(is, passwd);
        String alias = "mykeystore";
        Key key = keystore.getKey(alias, passwd);
        if (key instanceof PrivateKey) {
          // Get certificate of public key
          Certificate cert = keystore.getCertificate(alias);
          // Get public key
          PublicKey publicKey = cert.getPublicKey();

          String publicKeyString = Base64.encodeBase64String(publicKey
                    .getEncoded());
          System.out.println(publicKeyString);

        }

    } catch (Exception e) {
        e.printStackTrace();
    }
}

然后,它给出像

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiG2FjSuXrraYuh0TyRNiUvVCyaFlb7VY9AFIMSDdcY0JgNF0c4YVQxYxUCbYzmkLZD/rrYMe/8nxkWV0TMz2Y7GnvichjtWHL1ui58uC0+RtFMkYJ+ftwt9qBy9hvb/rVFTsvT5/b6CQXD8a6bFveMUluQZISLCV7i11XYzp81+w6M7+2fJAwezIJnIrgwv1K9YDjWaToaNXe7hnzzy0s8AdkjTk197+hg8dRfbvkr8XAddNsEMPeUA5iY+5VEpRNI925ZT/dxnaABA0z6i4JbVjeLl8r7ySG9R/2w/j2G+/YSRQc9BmRHPa0tBgH7wvQM+WRwD9WmST+5qeBIfH3QIDAQAB

当我执行cat publickey.cert时,显示此

-----BEGIN CERTIFICATE-----
MIIDgTCCAmmgAwIBAgIEf7XoMDANBgkqhkiG9w0BAQsFADBxMQswCQYDVQQGEwJJTjESMBAGA1UE
CBMJS2FybmF0YWthMRIwEAYDVQQHEwlCYW5nYWxvcmUxEjAQBgNVBAoTCU5ldHNjaXR1czESMBAG
A1UECxMJTmV0c2NpdHVzMRIwEAYDVQQDEwlOZXRzY2l0dXMwHhcNMTQxMTAzMDkyNTM3WhcNMTUw
MjAxMDkyNTM3WjBxMQswCQYDVQQGEwJJTjESMBAGA1UECBMJS2FybmF0YWthMRIwEAYDVQQHEwlC
YW5nYWxvcmUxEjAQBgNVBAoTCU5ldHNjaXR1czESMBAGA1UECxMJTmV0c2NpdHVzMRIwEAYDVQQD
EwlOZXRzY2l0dXMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCIbYWNK5eutpi6HRPJ
E2JS9ULJoWVvtVj0AUgxIN1xjQmA0XRzhhVDFjFQJtjOaQtkP+utgx7/yfGRZXRMzPZjsae+JyGO
1YcvW6Lny4LT5G0UyRgn5+3C32oHL2G9v+tUVOy9Pn9voJBcPxrpsW94xSW5BkhIsJXuLXVdjOnz
X7Dozv7Z8kDB7MgmciuDC/Ur1gONZpOho1d7uGfPPLSzwB2SNOTX3v6GDx1F9u+SvxcB102wQw95
QDmJj7lUSlE0j3bllP93GdoAEDTPqLgltWN4uXyvvJIb1H/bD+PYb79hJFBz0GZEc9rS0GAfvC9A
z5ZHAP1aZJP7mp4Eh8fdAgMBAAGjITAfMB0GA1UdDgQWBBSvgDYtI/NGP8Y0EvsCHASjmr/PmzAN
BgkqhkiG9w0BAQsFAAOCAQEACefje/dhmzEkBoA6OV934WtGXcBQNcb+9/qBGevUBG1cNJIyJddi
dea2gFUB1rx/WffTrJyiOCApV8wXG+zmGm6YJenKnGG9sIQtOTibhs3ll7UN4S0n9xsD+1y7YD1c
DNm9lI/3aFn1WUwPc3T4+RXE6XqkDB3geIvLUXaFUi+Y59XiLPHvk61kcopCGeoweX5yWVZ2Njp/
UUJIxQ6Ni3GvfPlxCxWtRe1MDAkhfT6/aAUr37lxtupHibzm9EAJdUEmAFHMhxkNCJiRDsasAiQ8
7V5uBI3ucdSwh+gPaW8KoWlJpv5SGlAkwzq0lSrxyq2ukkC6ciPeKhUvWtHaPg==
-----END CERTIFICATE-----

它们的键即使长度也不一样。为什么?

java keystore public-key
7个回答
14
投票
来自java2s.com的示例:

import java.io.FileInputStream; import java.security.Key; import java.security.KeyPair; import java.security.KeyStore; import java.security.PrivateKey; import java.security.PublicKey; import java.security.cert.Certificate; public class Main { public static void main(String[] argv) throws Exception { FileInputStream is = new FileInputStream("your.keystore"); KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); keystore.load(is, "my-keystore-password".toCharArray()); String alias = "myalias"; Key key = keystore.getKey(alias, "password".toCharArray()); if (key instanceof PrivateKey) { // Get certificate of public key Certificate cert = keystore.getCertificate(alias); // Get public key PublicKey publicKey = cert.getPublicKey(); // Return a key pair new KeyPair(publicKey, (PrivateKey) key); } } }

另请参见:

http://www.java2s.com/Code/Java/Security/RetrievingaKeyPairfromaKeyStore.htm

  • UPDATE:

    请参阅注释以获取有关该问题的更多信息。


  • 4
    投票
    public String getPublicKeyString( Path path ) throws IOException { byte[] fileBytes = Files.readAllBytes(Paths.get(path)); return new String( fileBytes, "US-ASCII" ); }

    这将为您提供整个文件,包括-----BEGIN CERTIFICATE----------END CERTIFICATE-----

    一旦有了整个文件,就可以使用BouncyCastle库打开它:

    PEMParser pemParser = new PEMParser(new StringReader(certPEMData)); Object parsedObj = pemParser.readObject(); System.out.println("PemParser returned: " + parsedObj); if (parsedObj instanceof X509CertificateHolder) { X509CertificateHolder x509CertificateHolder = (X509CertificateHolder) parsedObj; return x509CertificateHolder.getSubjectPublicKeyInfo().getPublicKeyData().getString(); } else { throw new RuntimeException("The parsed object was not an X509CertificateHolder."); }


    3
    投票
    import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.cert.Certificate; import java.security.cert.CertificateException; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Enumeration; import java.security.PublicKey; import java.util.Base64; //===================== try { File file = new File("C:\\Program Files (x86)\\keyStoreFilehere.kstr"); FileInputStream is = new FileInputStream(file); KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); String password = "password"; keystore.load(is, password.toCharArray()); Enumeration enumeration = keystore.aliases(); while(enumeration.hasMoreElements()) { String alias = (String)enumeration.nextElement(); Certificate certificate = keystore.getCertificate(alias); PublicKey publicKey = keystore.getCertificate(alias).getPublicKey(); byte[] encodedCertKey = certificate.getEncoded(); byte[] encodedPublicKey = publicKey.getEncoded(); String b64PublicKey = Base64.getMimeEncoder().encodeToString(encodedPublicKey); String b64CertKey = Base64.getMimeEncoder().encodeToString(encodedCertKey); String publicKeyString = "-----BEGIN CERTIFICATE-----\n" + b64PublicKey + "\n-----END CERTIFICATE-----"; String certKeyString = "-----BEGIN CERTIFICATE-----\n" + b64CertKey + "\n-----END CERTIFICATE-----"; System.out.println(publicKeyString); System.out.println(certKeyString); } } catch (CertificateException | NoSuchAlgorithmException | KeyStoreException | IOException e) { e.printStackTrace(); }

    2
    投票
    Base64.encodeBase64String(publicKey.getEncoded())

    第二库64包含整个公共证书

    Base64.encodeBase64String(cert.getEncoded())
    

    0
    投票
    通过KeyPair(publicKey, (PrivateKey) key)

    示例,

    FileInputStream is = new FileInputStream("publickey.cert"); KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); keystore.load(is, "my-keystore-password".toCharArray()); String alias = "myalias"; Key key = keystore.getKey(alias, "password".toCharArray()); if (key instanceof PrivateKey) { // Get certificate of public key Certificate cert = keystore.getCertificate(alias); // Get public key PublicKey publicKey = cert.getPublicKey(); // Return a key pair new KeyPair(publicKey, (PrivateKey) key); } }

    将返回新的

    key,value对。

    也请在此处阅读类似的主题Get Private Key from Keystore


    0
    投票
    String publicKeyString value = "-----BEGIN PUBLIC KEY-----\n" + new String(Base64.encode(publicKey.getEncoded())) + "\n-----END PUBLIC KEY-----";

    0
    投票
    KeyStore ks = KeyStore.getInstance("AndroidKeyStore"); ks.load(null); PublicKey publicKey = ks.getCertificate("aliasYouChose").getPublicKey();

    公钥位于证书的“内部”,证书不仅仅是公钥。

    [此外,请务必注意,格式正确的PEM密钥每64个字符后应有一个\ n。因此,例如,如果要在PHP中的openSSL中使用“ \ n ----- END PUBLIC KEY -----”,则可能无法正常工作。] >
    © www.soinside.com 2019 - 2024. All rights reserved.