2014-11-03 6 views
9

Привета Я хочу, чтобы извлечь открытый ключ из KeyStore с помощью кода JavaЧитать открытый ключ из файла в хранилище ключей

Я создаю хранилище ключей

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

И экспорт общественности в другой файл

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

Как я могу получить строку открытого ключа из хранилища ключей или файл publickey.cert с помощью кода Java?

Спасибо.

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----- 

Они ключи отличаются, даже в длину. Зачем?

ответ

10

Вы можете найти решение, просто перейдя по вашему вопросу.

Пример из 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); 
    } 
    } 
} 

Смотрите также:

ОБНОВЛЕНИЕ:

См. Комментарии для получения дополнительной информации.

+0

Привет Пожалуйста, смотрите ** ** обновление в вопросе – iCode

+1

@iProgrammer Привет, ответить на вопрос, в конце ваш вопрос: разница в том, что publickey.cert - это целый сертификат, а не только сам ключ. Он также содержит много дополнительной информации. См. Http://en.wikipedia.org/wiki/Public_key_certificate#Contents_of_a_typical_digital_certificate –

+0

Я получил это. Но см. Открытый ключ, который я получил от java-кода и открытого ключа в файле public.cert. Просто проверьте первые несколько символов, вы можете понять, что они разные. – iCode

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); 
    } 
    } 

возвращает новый ключ, значение пары.

прочитать Также подобную нить здесь Get Private Key from Keystore

+0

Пожалуйста, ознакомьтесь с ** обновлением ** в вопросе – iCode

+0

Извините, что я не могу сделать вторую часть в вашем обновлении. Вы можете быть более ясным. –

+0

См. Общедоступный ключ. Я получил код Java и открытый ключ в файле public.cert. Просто проверьте первые несколько символов, вы можете понять, что они разные. – iCode

3

Если это просто строка открытого ключа, который вы хотите, это легче получить файл publickey.cert, так как это обычный текстовый файл. Если предположить, что у вас есть полный путь к файлу (например, «/home/users/iprogrammer/publickey.cert» или «D: \ MyDocuments \ publickey.cert») вы делаете что-то вроде:

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."); 
    } 
+0

Тогда я могу прочитать весь файл. Есть функции безопасности Java для чтения открытого ключа из keystore – iCode

+0

Вы просили строку открытого ключа. Конечно, есть способы прочитать из хранилища ключей. Но поскольку вы уже экспортировали его, я дал вам возможность его прочитать. – RealSkeptic

+0

На самом деле, если он может прочитать сертификат в виде такой строки, то он может использовать класс «PEMParser» от Bouncycastle. – EpicPandaForce

0

Если вы хотите версию строковое ОткрытыйКлюч:

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

0

Первый основание 64 содержит только ключ

Base64.encodeBase64String(publicKey.getEncoded()) 

Вторая база 64 содержит весь публичный сертификат

Base64.encodeBase64String(cert.getEncoded()) 
0

Попробуйте это:

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(); 
} 
+0

Хотя этот код может ответить на вопрос, было бы лучше включить некоторый контекст, объяснив, как он работает и когда его использовать. Ответы только на код не полезны в долгосрочной перспективе. – glennsl

Смежные вопросы