Как видно из названия, у меня есть файл .p12, необходимый для доступа к учетной записи google службы. Чтобы получить учетные данные для подключения к api, есть поле .setServiceAccountPrivateKey (PrivateKey privateKey). Итак, какой самый простой способ сделать это? У меня есть папка с ресурсами, которая находится в моем пути к классам, поэтому, если я добавлю там файл p12, я могу получить ресурс из getClass(). GetResource() как входной поток или URL-адрес. Я пробовал метод URL, но он не работает (я получаю ошибку «URI не является иерархической», пытаясь создать объект File из URL.toURI()).Получение объекта PrivateKey из файла .p12 в Java
ответ
Вы можете загрузить файл .p12 с помощью метода ClassLoader.getResourceAsStream(String)
, загрузить его в KeyStore и получить ключ от KeyStore.
KeyStore keystore = KeyStore.getInstance("PKCS12");
keystore.load(this.getClass().getClassLoader().getResourceAsStream("keyFile.p12"), p12Password.toCharArray());
PrivateKey key = (PrivateKey)keystore.getKey(keyAlias, p12Password.toCharArray());
ClassLoader.getResourceAsStream(String)
загружает ресурсы из любого места при условии, что они уже на пути к классам, нет необходимости указывать путь к файлу.
keyAlias
- это имя записи в вашем файле p12, которая соответствует закрытому ключу. Файлы PKCS12 могут содержать несколько записей, поэтому вам нужно каким-то образом указать, к какой записи вы хотите получить доступ. Псевдоним заключается в том, как это достигается.
Если вы не знаете, что такое псевдоним для вашего закрытого ключа, вы можете использовать утилиту keytool
из командной строки, чтобы отобразить содержимое вашего файла p12. Этот инструмент включен во все установки JRE и JDK.
keytool -list -keystore keyFile.p12 -storepass password -storetype PKCS12
Выход
Keystore type: PKCS12
Keystore provider: SunJSSE
Your keystore contains 1 entry
yourKeyAlias, Sep 4, 2013, PrivateKeyEntry,
Certificate fingerprint (MD5): 48:A8:C4:12:8E:4A:8A:AD:58:81:26:90:E7:3D:C8:04
Если вы получаете null
от getKey()
(например, вы используете BouncyCastle
в качестве поставщика.), Вы должны найти последний keyAlias
элемент:
KeyStore keystore = KeyStore.getInstance("PKCS12", "BC");
keystore.load(this.getClass().getClassLoader().getResourceAsStream("keyFile.p12"), p12Password.toCharArray());
Enumeration aliases = keystore.aliases();
String keyAlias = "";
while (aliases.hasMoreElements()) {
keyAlias = (String) aliases.nextElement();
}
PrivateKey key = (PrivateKey)keystore.getKey(keyAlias, pass);
Я думаю, что это проще позвонить в SecurityUtils Google напрямую, например:
PrivateKey privateKey = SecurityUtils.loadPrivateKeyFromKeyStore(SecurityUtils.getPkcs12KeyStore(), this.getClass().getResourceAsStream("keyFile.p12"), "notasecret", "privatekey", "notasecret")
Это однострочный код, и вам не нужно беспокоиться об псевдониме.
Спасибо, что поместил пароль прямо там, я волновался, что забыл об этом. – dhakim
@Robert Watts Итак, в этом вызове вы используете «privatekey» в качестве псевдонима. Это потому, что privateKey является псевдонимом по умолчанию для ключей pkcs12? Я искал, но не смог найти документацию по этому вопросу.Я запустил keytool, и мой псевдоним на самом деле «privatekey», но я хотел бы быть уверенным, что он всегда будет для новых ключей. –
@UsmanMutawakil Я не верю, что есть стандартный псевдоним по умолчанию для формата файла pkcs12. Keytool может по умолчанию использовать этот псевдоним, и, возможно, другие инструменты/программы тоже, но это не является неотъемлемой частью формата файла. –
Вышеуказанные предложения не помогли мне. Затем я попробовал один на http://www.java2s.com/Code/Java/Security/RetrievingaKeyPairfromaKeyStore.htm, и он сработал. Скопируйте вставку ниже
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);
}
}
}
- 1. Создание PrivateKey объекта из PKCS12
- 2. NoSuchElementException при чтении файла p12 в приложении java из системы?
- 3. Получение секретного ключа из файла p12 с помощью javascript
- 4. Экспорт PublicKey и PrivateKey из файла PKCS12
- 5. Преобразование ключа объекта PrivateKey
- 6. Получение секретного ключа из файла в java
- 7. Использование файла p12 без пароля в Java
- 8. decrypt pfx OR p12 с помощью iaik_jce.jar в Java-бросках Невозможно дешифровать PrivateKey! exception
- 9. Получение данных из объекта; JAVA
- 10. Получение PrivateKey нуль X509Certificate2 C#
- 11. Как получить PrivateKey из keystore.pkcs12 файла
- 12. RSA Sign with PrivateKey из файла
- 13. Получение PrivateKey из модуля и D в данных RSAKey XML
- 14. JSTL - получение объекта из java
- 15. Преобразование файла закрытого ключа PEM в объект JAVA PrivateKey
- 16. Создание файла .p12 с KeyStore
- 17. Как извлечь закрытый ключ из файла .p12 с помощью java sun security
- 18. Конструктор PublicKey и PrivateKey в Android (Java)
- 19. Создание P12-файла
- 20. Java - Получение размера объекта
- 21. Импорт .p12-файла в AndroidKeyStore
- 22. Использование файла .p12 из пути к классам для GoogleCredential
- 23. Экспорт файла p12 из брелка «Мои сертификаты»
- 24. Экспортировать открытый ключ из p12-файла
- 25. Экспорт файла p12 из командной строки
- 26. Получить идентификатор пакета из файла p12/pem
- 27. Получение массива из объекта JSON в Java
- 28. Получение объекта Connection из DataSource в Java
- 29. Получение значений из объекта в java
- 30. Java - Получение строки из файла
Не знаком с этим методом шифрования ... что такое ключАлиса? – gratsby
Добавлена информация о том, как перечислить содержимое вашего хранилища ключей, чтобы найти псевдоним. – Syon
Спасибо! Он отлично работал. – gratsby