2013-09-04 8 views
26

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

45

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

Nieznajomość tej metody szyfrowania ... co to jest keyAlias? – gratsby

+0

Dodano informacje o tym, jak wyświetlić zawartość pliku kluczy, aby znaleźć alias. – Syon

+0

Dzięki! Działało idealnie. – gratsby

4

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

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.

+2

Dzięki za umieszczenie hasła również tam, martwiłem się, że zapomniałem. – dhakim

+0

@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. –

+0

@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. –

1

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); 
    } 
    } 
} 
Powiązane problemy