Jak sugeruje tytuł, mam plik .p12 wymagany do uzyskania dostępu do konta usługi Google google. Aby uzyskać poświadczenie połączenia z interfejsem API, istnieje pole .setServiceAccountPrivateKey (PrivateKey privateKey). Jaki jest najłatwiejszy sposób na zrobienie tego? Mam folder zasobów, który jest w mojej ścieżce klas, więc jeśli dodaję tam plik p12, mogę pobrać zasób z getClass(). GetResource() jako inputStream lub URL. Próbowałem już metody URL, ale to nie działa (otrzymuję błąd "URI nie jest hierarchiczny", próbując utworzyć obiekt File z adresu URL.toURI()).Uzyskiwanie obiektu PrivateKey z pliku .p12 w Javie
Odpowiedz
Możesz załadować plik .p12 przy użyciu metody ClassLoader.getResourceAsStream(String)
, załadować go do magazynu kluczy i pobrać klucz z magazynu kluczy.
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)
obciążenia zasobów z dowolnego miejsca pod warunkiem, że jesteśmy już na ścieżce klasy, nie ma potrzeby, aby określić ścieżkę do pliku.
keyAlias
to nazwa wpisu w pliku p12, który odpowiada kluczowi prywatnemu. Pliki PKCS12 mogą zawierać wiele wpisów, więc potrzebujesz sposobu wskazania wpisu, do którego chcesz uzyskać dostęp. Pseudonim jest tym, jak to osiągnąć.
Jeśli nie masz pewności, jaki jest alias dla Twojego klucza prywatnego, możesz użyć narzędzia keytool
z wiersza poleceń, aby wyświetlić zawartość pliku p12. To narzędzie jest dołączone do wszystkich instalacji JRE i JDK.
keytool -list -keystore keyFile.p12 -storepass password -storetype PKCS12
Wyjście
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
Jeśli masz null
z getKey()
(np używanego BouncyCastle
jako dostawcy.) Należy znaleźć ostatnią keyAlias
element:
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);
myślę, że to łatwiej zadzwonić bezpośrednio do Google SecurityUtils, np .:
PrivateKey privateKey = SecurityUtils.loadPrivateKeyFromKeyStore(SecurityUtils.getPkcs12KeyStore(), this.getClass().getResourceAsStream("keyFile.p12"), "notasecret", "privatekey", "notasecret")
To jedna linia i nie musisz się martwić o aliasing.
Dzięki za umieszczenie hasła również tam, martwiłem się, że zapomniałem. – dhakim
@Robert Watts Więc w tym wywołaniu używasz "privatekey" jako aliasu. Czy to dlatego, że privateKey jest domyślnym aliasem dla kluczy pkcs12? Szukałem, ale nie mogłem znaleźć żadnej dokumentacji na ten temat.Uruchomiłem keytool i mój pseudonim jest w rzeczywistości "privatekey", ale chciałbym mieć pewność, że zawsze będzie to dotyczyć nowych kluczy. –
@UsmanMutawakil Nie wierzę, że istnieje standardowy alias domyślny dla formatu pliku pkcs12. Keytool może domyślnie używać tego aliasu, a być może inne narzędzia/programy też tak robią, ale nie jest to z natury format pliku. –
Powyższe sugestie nie działają dla mnie. Potem wypróbowałem ten pod adresem http://www.java2s.com/Code/Java/Security/RetrievingaKeyPairfromaKeyStore.htm i zadziałało. Kopiuj wklejając go poniżej:
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. Get PrivateKey od A RSA pliku .pem
- 2. Uzyskaj identyfikator pakunku z pliku p12/pem
- 3. jak uzyskać SecIdentityRef z SecCertificateRef i PrivateKey?
- 4. Konwersja pliku .jks na p12
- 5. Uzyskiwanie obiektu z NSSet
- 6. Uzyskiwanie użytkownika Tomcat w Javie
- 7. Uzyskiwanie obrazu Mathematica w Javie
- 8. Uzyskiwanie hierarchii klas w Javie?
- 9. Uzyskiwanie indeksu obiektu z NSArray?
- 10. Nie uzyskiwanie tablicy z obiektu
- 11. Jak uzyskać nazwę obiektu File bez jego rozszerzenia w Javie?
- 12. Podpisywanie pakietu apk z .p12
- 13. Odszyfruj z certyfikatem PrivateKey X.509
- 14. Uzyskiwanie dostępu do obiektu DOM zdefiniowanego w zewnętrznym pliku SVG
- 15. Resetowanie obiektu Graphics2D w Javie
- 16. Obliczanie rozmiaru obiektu w Javie
- 17. Uzyskiwanie obiektu obrazu z tablicy bajtów
- 18. Uzyskiwanie deszyfrowania GPG do pracy w Javie (Bouncy Castle)
- 19. Uzyskiwanie stanu obiektu
- 20. uzyskiwanie atrybutów twórcy plików/właściciela w Javie
- 21. Uzyskiwanie dostępu do pól z obiektu Proxied
- 22. Uzyskiwanie aktywnych informacji o oknie w Javie
- 23. Uzyskiwanie określonego pliku z ZipInputStream
- 24. Uzyskiwanie nazwy obiektu z obiektu klasy podklasy NSMangedObject
- 25. iPhone - uzyskiwanie unikatowych wartości z obiektu NSArray
- 26. Czytanie tekstu z pliku obrazu w Javie
- 27. Wyodrębnij współrzędne z pliku KML w Javie
- 28. Uzyskiwanie obiektu z observingArray według indeksu
- 29. Uzyskiwanie elementu betonowego z obserwowalnego obiektu
- 30. Eksportuj klucz prywatny z obiektu X509Certyfikat
Nieznajomość tej metody szyfrowania ... co to jest keyAlias? – gratsby
Dodano informacje o tym, jak wyświetlić zawartość pliku kluczy, aby znaleźć alias. – Syon
Dzięki! Działało idealnie. – gratsby