1

Я использую API Google Directory через учетную запись службы, и я получил ключ при создании учетной записи службы.Как преобразовать содержимое pkcs12 в кодировке Base64 в java.security.PrivateKey?

Google поддерживает два различных способа использовать это как вынимая ключ как java.io.File или java.security.PrivateKey и для РоС, я использовал первый способ, который, создавая 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(); 

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

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

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

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

DArray

ответ

0

java.securty.KeyStore принимает любой InputStream для метода загрузки(), так что вы можете создать это, используя любой метод, который Вы имеете получения .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; 
     } 

    } 
Смежные вопросы