Hallo, ich möchte den öffentlichen Schlüssel mit Java-Code aus KeyStore extrahieren
Ich erstelle einen Schlüsselspeicher
keytool -genkey -alias mykeystore -keyalg RSA -keystore mykeystore.jks -keysize 2048
Und die Öffentlichkeit in eine andere Datei exportieren
keytool -export -alias mykeystore -keystore mykeystore.jks -rfc -file publickey.cert
Wie kann ich den öffentlichen Schlüssel aus dem Keystore oder der Datei publickey.cert mithilfe des Java-Codes abrufen?
Vielen Dank.
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();
}
}
Dann gibt es gerne
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiG2FjSuXrraYuh0TyRNiUvVCyaFlb7VY9AFIMSDdcY0JgNF0c4YVQxYxUCbYzmkLZD/rrYMe/8nxkWV0TMz2Y7GnvichjtWHL1ui58uC0+RtFMkYJ+ftwt9qBy9hvb/rVFTsvT5/b6CQXD8a6bFveMUluQZISLCV7i11XYzp81+w6M7+2fJAwezIJnIrgwv1K9YDjWaToaNXe7hnzzy0s8AdkjTk197+hg8dRfbvkr8XAddNsEMPeUA5iY+5VEpRNI925ZT/dxnaABA0z6i4JbVjeLl8r7ySG9R/2w/j2G+/YSRQc9BmRHPa0tBgH7wvQM+WRwD9WmST+5qeBIfH3QIDAQAB
Wenn ich cat publickey.cert
mache, zeigt es dies
-----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-----
Die Tasten unterscheiden sich sogar in der Länge. Warum?
Sie können eine Lösung finden, indem Sie einfach nur Ihre Fragen beantworten.
Beispiel von 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);
}
}
}
Siehe auch:
UPDATE:
Weitere Informationen zum Problem finden Sie in den Kommentaren.
Wenn Sie nur die Zeichenfolge des öffentlichen Schlüssels wünschen, ist es einfacher, die publickey.cert
-Datei abzurufen, da es sich um eine reine Textdatei handelt. Angenommen, Sie haben den vollständigen Pfad der Datei (wie "/home/users/iprogrammer/publickey.cert" oder "D:\MyDocuments\publickey.cert"), so tun Sie Folgendes:
public String getPublicKeyString( Path path ) throws IOException {
byte[] fileBytes = Files.readAllBytes(Paths.get(path));
return new String( fileBytes, "US-ASCII" );
}
Dadurch erhalten Sie die gesamte Datei, einschließlich -----BEGIN CERTIFICATE-----
und -----END CERTIFICATE-----
.
Sobald Sie die gesamte Datei haben, können Sie sie mit der BouncyCastle-Bibliothek öffnen:
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.");
}
Versuche dies:
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();
}
Die erste Basis 64 enthält nur den Schlüssel
Base64.encodeBase64String(publicKey.getEncoded())
Die zweite Basis 64 enthält das gesamte öffentliche Zertifikat
Base64.encodeBase64String(cert.getEncoded())
Nachdem Sie den Export erfolgreich durchgeführt haben, können Sie ihn aus dem Schlüsselspeicher erhalten.
durch KeyPair(publicKey, (PrivateKey) key)
Ein Beispiel ,
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);
}
}
gibt das neue key, value -Paar zurück.
Lesen Sie auch den ähnlichen Thread hier Get Private Key von Keystore
Wenn Sie die String-Version des PublicKey wünschen:
String publicKeyString value = "-----BEGIN PUBLIC KEY-----\n"
+ new String(Base64.encode(publicKey.getEncoded()))
+ "\n-----END PUBLIC KEY-----";