Как преобразовать закодированный Base64 контент pkcs12 в java.security.PrivateKey?

1

Я использую API каталога Google через учетную запись службы, и я получил ключ pkcs12 при создании учетной записи службы.

Google поддерживает два разных способа использования этого, принимая ключ как java.io.File или java.security.PrivateKey и для PoC, я использовал первый способ создания объекта GoogleCredential с помощью java.io.File,

        GoogleCredential credential = new GoogleCredential.Builder()
                .setTransport(httpTransport)
                .setJsonFactory(jsonFactory)
                .setServiceAccountId(serviceAccountId)
                .setServiceAccountScopes(Arrays.asList(DirectoryScopes.ADMIN_DIRECTORY_USER))
                .setServiceAccountUser(serviceAccountUser)
                .setServiceAccountPrivateKeyFromP12File(serviceAccountPrivateKeyFile)
                .build();

Он работает как ожидалось, но в моем фактическом использовании я не могу полагаться на файловую систему, поэтому я не могу использовать первый метод. Поэтому я хотел реализовать реальный прецедент, используя второй способ, который использует java.security.PrivateKey и будет выглядеть следующим, когда это будет сделано.

    GoogleCredential credential = new GoogleCredential.Builder()
            .setTransport(httpTransport)
            .setJsonFactory(jsonFactory)
            .setServiceAccountId(serviceAccountId)
            .setServiceAccountScopes(Arrays.asList(DirectoryScopes.ADMIN_DIRECTORY_USER))
            .setServiceAccountUser(serviceAccountUser)
            .setServiceAccountPrivateKey(serviceAccountPrivateKey)
            .build();

В моем случае использования, я должен сделать возможным загрузить закрытый ключ и сохранить его в базе данных с кодировкой base64. Теперь мне нужно передать это содержимое ключа pkcs12 и создать объект Googlecredential. Для этого я думаю, что второй вариант наиболее подходит, но не смог найти какой-либо пример для создания java.security.PrivateKey из кодированного содержимого base64 загруженного ключа.

Возможно ли создать объект java.security.PrivateKey из кодированного base64 содержимого ключа pkcs12?

Или есть какой-то другой способ для достижения моего удобства?

заранее спасибо

DArray

Теги:
google-admin-sdk
pkcs#12
private-key
google-api-java-client

1 ответ

0

java.securty.KeyStore использует любой метод InputStream для метода load(), поэтому вы можете создать его, используя любой способ получения байтов.p12. Вот альтернативный метод, который я использовал. Хотя этот файл по-прежнему используется для байтов.p12, вы можете ввести ByteArrayInputStream или любой подкласс InputStream:

    private PrivateKey getPrivateKeyFromP12() {
        // Google p12 files all have "notasecret" as the pass and "privatekey" as the PK name
        String p12p = "notasecret";    // not cool!  Change this before exporting your .p12
        try {
            KeyStore keystore = KeyStore.getInstance("PKCS12");
            // This is where you'd adjust to bring in your .p12 bytes or chars
            // as an input stream.  Passwords are a char array!
            keystore.load(
                this.getClass().getClassLoader()
                        .getResourceAsStream("the.p12"),
                p12p.toCharArray());
            // This key name is fixed by Google, but could be changed
            PrivateKey key = (PrivateKey) keystore.getKey("privatekey",
                p12p.toCharArray());
            return key;
        } catch (Exception e) {
            LOG.error("Exception while trying to obtain private key",e);
            return null;
        } 

    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню