1

我通過服務帳戶使用Google Directory API,並在服務帳戶創建時收到pkcs12密鑰。如何將Base64編碼的pkcs12內容轉換爲java.security.PrivateKey?

谷歌不支持兩種不同的方式來使用它作爲考慮重點爲java.io.Filejava.security.PrivateKey和的PoC,我用它創建使用java.io.FileGoogleCredential對象,

 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對象。爲了做到這一點,我認爲第二個選項是最合適的方式,但是找不到任何示例從上傳密鑰的base64編碼內容創建java.security.PrivateKey。

是否有可能創建java.security.PrivateKey對象來自base34編碼的內容pkcs12的關鍵?

或者有沒有其他的方式來實現我的用例?

在此先感謝

DarRay

回答

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; 
     } 

    } 
相關問題