【问题标题】:Bitbucket cannot load google cloud key fileBitbucket 无法加载谷歌云密钥文件
【发布时间】:2020-03-24 20:34:40
【问题描述】:

Bitbucket 不会使用 Google 云服务密钥读取我的 base64 编码 json 文件。 我已经成功编码然后自己解码了 Bitbucket 尝试解码的同一个文件。 但是 Bitbucket 无法做到这一点,并出现 base64: invalid input 错误。 以下是完整的错误信息:

Status: Downloaded newer image for bitbucketpipelines/google-app-engine-deploy:0.6.1
INFO: Setting up environment.
echo "${KEY_FILE}" | base64 -d >> /tmp/key-file.json
base64: invalid input
gcloud auth activate-service-account --key-file /tmp/key-file.json --quiet --verbosity=warning
ERROR: (gcloud.auth.activate-service-account) Could not read json file /tmp/key-file.json: Unterminated string starting at: line 3 column 17 (char 49)
gcloud config set project wowzers --quiet --verbosity=warning
Updated property [core/project].
INFO: Starting deployment to GCP app engine...
gcloud app --quiet deploy app.yaml --version=14 --promote --stop-previous-version --verbosity=debug --quiet --verbosity=warning
ERROR: (gcloud.app.deploy) You do not currently have an active account selected.

据我了解,它在 "project_id": " 上失败了。 解码后的文件如下所示:

{
  "type": "service_account",
  "project_id": "project-318",
  "private_key_id": "...",
  ...
}

我尝试先通过环境变量然后通过文件提供我的 base64 编码密钥文件。但同样的错误。当它无法提取 JSON bitbucket 时会写入此错误: ERROR: (gcloud.auth.activate-service-account) Could not read json file /tmp/key-file.json: No JSON object could be decoded

【问题讨论】:

    标签: google-app-engine bitbucket-pipelines


    【解决方案1】:

    原来来自谷歌云的密钥文件包含换行符:\n。 所以结果 base64 编码文件也看起来像这样:

    HhsUUrAkupWJ6vdesSRHwNhnPpgxByYT7z7HVBEPsrUpjLWdX6TQm4pHNJydsC34F
    RvVYyBAedgLhWPPGPvU6UBJww3aNxQnJS95ZvKDBuNr5CNTtAgh6EgsattRrZtawH
    fjphVs82UWZZFq3JUeGwGdTs88XWu6ejaPYZknnD94W7pU6Ds8vJHGhAnBw9FtkrA
    gjp4UFZN2Yg9KJFSrTfFA6dUsp2dPVN6VzVfpqJzGrxbFBjWQAp4zK5TXhJaN4zDr
    .....
    

    但为了将其传递给 Bitbucket,您需要将其全部放在一行中:

    HhsUUrAkupWJ6vdesSRHwNhnPpgxByYT7z7HVBEPsrUpjLWdX6TQm4pHNJydsC34FRvVYyBAedgLhWPPGPvU6UBJww3aNxQnJS95ZvKDBuNr5CNTtAgh6EgsattRrZtawHfjphVs82UWZZFq3JUeGwGdTs88XWu6ejaPYZknnD94W7pU6Ds8vJHGhAnBw9FtkrAgjp4UFZN2Yg9KJFSrTfFA6dUsp2dPVN6VzVfpqJzGrxbFBjWQAp4zK5TXhJaN4zDr....
    

    在我手动删除新行符号后,它给出了成功消息: Activated service account credentials for: [project]

    【讨论】:

    • 当我从 bash 复制/粘贴时,它也在添加新行。我使用命令base64 key.json > base64-key.tmp 然后使用文件中的字符串。
    【解决方案2】:

    我可以建议使用 GCP 的 KMS(密钥管理服务)。解密 base 64 非常容易,在 KMS 下,您需要具有相应的用户角色才能相应地解密。 KMS的使用步骤如下代码sn-p:

    KEYRING=kubernetes-secrets
    KEY=generic-type-encryption-key
    
    gcloud kms keyrings create $KEYRING --location asia-east2
    gcloud kms keys create $KEY --location asia-east2 \
                                --keyring $KEYRING \
                                --purpose encryption
    
    gcloud kms encrypt --location asia-east2 \
                           --keyring $KEYRING \
                           --key $KEY \
                           --plaintext-file example.txt \
                           --ciphertext-file encrypted.example.txt
    

    【讨论】:

    • 您能否说明如何通过身份验证才能使用 KMS?在我看来,为了在 bitbucket 构建管道中向 KMS 进行身份验证,您需要传递一个服务帐户密钥,这需要传递已经成为 OP 问题的密钥。
    • 是的,您通常需要一个服务帐户才能访问 Google API。在 CircleCI 中,我只是将服务帐户 JSON 作为环境变量传递,因为环境变量在 CircleCI UI 中显示为“*”
    • 所以你需要传递json密钥文件才能使用KMS,而OP的问题在于传递密钥文件。因此,我认为 KMS 在这里不是一个有用的解决方案 - 能够使用 KMS 将允许 OP 直接使用应用引擎部署管道。
    猜你喜欢
    • 2014-07-11
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多