1

クライアント側のserviceAccounts.keys.create Google IAM APIを使用してGAEで生成されたサービスアカウントキーを使用して、GCSにファイルをアップロードしています。このAPIは、次のように私は、クライアント側のコードで使用していますprivateKeyDataフィールドを返します。しかしJavaのクライアント側でserviceAccounts.keys.create APIを使用して生成されたGoogleクラウドプラットフォームのサービスアカウントキーの使用方法は?

public class GCSTest { 
    public static final String CLOUD_STORAGE_SCOPE = 
      "https://www.googleapis.com/auth/cloud-platform"; 
    private GoogleCredential credential = null; 
    private HttpTransport HTTP_TRANSPORT = null; 
    private Storage storage = null; 
    private final JsonFactory json_factory = JacksonFactory 
      .getDefaultInstance(); 
    public String APPLICATION_NAME = "GCSTest"; 
    private String privKeyString = 
      <copy the privateKeyData from response of serviceAccounts.keys.create>; 

    public void startTests() { 
     initStorageService(); 
     writeObject(); 
    } 

    private void initStorageService() { 
     List<String> scopeList = new ArrayList<String>(); 
     scopeList.add(CLOUD_STORAGE_SCOPE); 
     HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); 

     byte[] privKeyBytes = Base64.decodeBase64(privKeyString.getBytes()); 
     PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(privKeyBytes); 
     KeyFactory kf = KeyFactory.getInstance("RSA"); 
     PrivateKey privateKey = kf.generatePrivate(spec); 
     credential = 
      new GoogleCredential.Builder() 
       .setTransport(HTTP_TRANSPORT) 
       .setJsonFactory(json_factory) 
       .setServiceAccountId(
         "<service_account_name>@<project-id>.iam.gserviceaccount.com") 
       .setServiceAccountScopes(scopeList) 
       .setServiceAccountPrivateKey(privateKey) 
       .setServiceAccountPrivateKeyId(
         "<key_id>") 
       .build(); 

     storage = 
      new Storage.Builder(HTTP_TRANSPORT, json_factory, 
       credential).setApplicationName(APPLICATION_NAME) 
       .build(); 
    } 
    private void writeObject() { 
     String fileName = "StorageSample"; 
     Path tempPath = Files.createTempFile(fileName, ".txt");; 
     Files.write(tempPath, "Sample file".getBytes()); 
     File tempFile = tempPath.toFile(); 
     tempFile.deleteOnExit(); 

     InputStreamContent contentStream = 
       new InputStreamContent("text/plain", new FileInputStream(
         tempFile)); 
     contentStream.setLength(tempFile.length()); 
     StorageObject objectMetadata = new StorageObject().setName(fileName); 
     Storage.Objects.Insert insert = 
      storage.objects().insert(<bucket_name>, 
         objectMetadata, contentStream);; 
     insert.setName(fileName); 
     insert.execute(); 
    } 
} 

storage.objects().insertが呼び出されたとき、私はjava.security.InvalidKeyException: invalid key format exceptionを取得します。 サービスアカウントキーを使用してGoogleCredentialを生成する正しい方法ですか? P.S:JSONまたはP12キーファイルについて知っています。私はそれが私のユースケースに適合しないので、それを使用したくない。

答えて

0

serviceAccounts.keys.createを使用して生成された秘密鍵文字列のパスワードがnotasecretであることが分かります。次のコードは、API応答のprivateKeyDataフィールドからPrivateKeyを取得します。このPrivateKeyGoogleCredential

byte[] privKeyBytes = Base64.decodeBase64(privKeyString.getBytes()); 
KeyStore ks = KeyStore.getInstance("PKCS12"); 
ks.load(new ByteArrayInputStream(privKeyBytes), "notasecret".toCharArray()); 
PrivateKey privateKey = (PrivateKey) ks.getKey("privatekey", "notasecret".toCharArray()); 
0

デフォルトでは、serviceAccounts.keys.createはGOOGLE_CREDENTIALS_FILEを生成します.GOOGLE_CREDENTIALS_FILEは、キーとその他のものを記述するJSONドキュメントです。 gcloud-javaのようなクライアントはそうのように、それらのファイルを読むことができます:

StorageOptions options = StorageOptions.builder().projectId(PROJECT_ID) 
    .authCredentials(AuthCredentials.createForJson(
      new FileInputStream(PATH_TO_JSON_KEY))).build(); 
Storage service = options.service(); 

あなたのコードを、しかし、P12キーファイルを期待しています。このような形式にJSONファイルのキーを抽出できますが、serviceAccountPrivateKeyパラメータをTYPE_PKCS12_FILEに設定してserviceAccounts.keys.createを呼び出すほうが簡単です。

+0

ありがとうを取得するために使用することができます。私は 'TYPE_PKCS12_FILE'を使ってキーを生成しましたが、' java.security.InvalidKeyExceptionが発生しました:IOException:バージョンの不一致:(サポートされている:00、解析済み:03'のエラーです。 –

関連する問題