登录
首页 >  Golang >  Go问答

问题分析:Terraform的自定义提供程序GPG问题

来源:stackoverflow

时间:2024-03-03 16:42:24 162浏览 收藏

在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《问题分析:Terraform的自定义提供程序GPG问题》,聊聊,希望可以帮助到正在努力赚钱的你。

问题内容

希望你一切顺利。

我正在用 go 编写一个 api,其工作方式与 terraform 提供者协议类似

所以我已经有两个端点通过 https 在我的本地计算机上工作:

  • https://myapi:9000/v1/provider/:namespace/:type/versions
  • https://myapi:9000/v1/provider/:namespace/:type/:version/download/:os/:arch

比方说这些完整端点:

  • https://myapi:9000/v1/provider/myprovider/custom/versions
  • https://myapi:9000/v1/provider/myprovider/custom/0.1.0/download/linux/amd64

所以我有下一个 .tf.json 文件:

{
    "module": {
        "linux": {
            "source": "myapi:9000/v1/module/mymodule/custom",
            "version": "0.1.2"
        }
    }
}

使用这两个文件

  1. provider.tf.json
provider "mycustomprovider" {
    username = "abc"
    password = "def"
    host = "yjk"
}
  1. 版本.tf.json
terraform {
    required_providers {
        mycustomprovider = {
            source: "myapi:9000/v1/myprovider/custom",
            version: "0.1.0"
        }
    }
    required_version = ">=1.0.2"
}

然后我只需运行:terraform init 即可获取我的资产。

所以,当我获得自定义模块时,效果很好。 输出(模块下载):

initializing modules...
downloading myapi:9000/mymodule/custom/gnu 0.1.2 for linux...
- linux in .terraform/modules/linux

initializing the backend...

但是当我得到我的provdier时,我遇到了这个错误:

initializing provider plugins...
- finding myapi:9000:9000/myprovider/custom versions matching "0.1.0"...
- installing myapi:9000:9000/myprovider/custom v0.1.0...
╷
│ error: failed to install provider
│ 
│ error while installing myapi:9000/myprovider/custom v0.1.0: error checking signature:
│ openpgp: invalid data: tag byte does not have msb set

所以,我的提供商 versions 端点正在工作。这就是为什么 terraform 能够识别我的提供程序的版本。

问题应该出在我的 download 端点上。

在讨论此端点之前,我想添加一些上下文,我正在使用 localstack 运行 s3 客户端并通过 ngrok 公开它。这两件事有效,我可以毫无问题地上传或下载文件。

terraform 自定义提供程序应该具有三个文件(据我所知):

  1. zip 格式的提供商(如示例所示)
  2. 一个 provider_sha256sums 文件,其中包含每个提供商 zip 文件的 shasum(在本例中我只有一个)
  3. provider_sha256sums.sig,用于识别 provider_sha256sums 文件的完整性。

为了获取这些文件,我正在运行以下命令:

provider_sha256sums

$ sha256sum 0.1.0.zip > 0.1.0_sha256sums

provider_sha256sums

$ gpg --gen-key # generating a new key
$ gpg --armor --output 0.1.0_sha256sums.sig --detach-sig 0.1.0_sha256sums

我的端点的响应是这样的。 (gpg信息只是示例数据,这里没有真正的警告。)

{
  "protocols": [
    "5.0"
  ],
  "os": "linux",
  "arch": "amd64",
  "filename": "0.1.0.zip",
  "download_url": "https://d4f6-186-84-89-138.ngrok.io/terraform/v1/providers/myprovider/custom/0.1.0.zip",
  "shasums_url": "https://d4f6-186-84-89-138.ngrok.io/terraform/v1/providers/myprovider/custom/0.1.0_sha256sums",
  "shasums_signature_url": "https://d4f6-186-84-89-138.ngrok.io/terraform/v1/providers/myprovider/custom/0.1.0_sha256sums.sig",
  "shasum": "1dd61b508aad0d65b32c71159775e409fd618adc5ba945cc2eebb42f29e085d3",
  "signing_keys": {
    "gpg_public_keys": [
      {
        "key_id": "9f21ea3c1c9f793c",
        "ascii_armor": "-----begin pgp public key block-----\n\nmqgnbgeuvh8bdadyt3jlssqnslk0i2mrfpjgcvcyppfsfjgfdx2ewl7tggdeslan\ndooq05x+9vkym6qq1jqmpfs5dzsqishtulsu0nphs21zvym10azut3dxxlmwu2is\nso+q8o4wsmxclisbuyhzp6tmq7nisxhundvx7b/s/beyucoimeymqg1pkid55u4g\n7y/8w6mmzx6nvf97fryn37fbqvx8q2sxt5ib3c2sbfd7i/smvjc0tqobv1ekh3rn\ncelp5nljbv58ysz+utu21epkkvph4pluucb9/0uwzi5y/268ewty3+ulwnoh12ds\neszfgijzusdvomcozkdd5x1radzr+6vkvxhhiprkgo5alvjfolqk0nzzmixjhyuf\nk9plo7ket4dy9ztysjyutx5enmjinf5mykndh3h36thxaipptau8wjjctyok78c5\nilpv7ctim9f5g7slxnku+xfmbzhsnyxth9dehro9uflit1df76iuqpc8b79sutuh\nwvf7qigkl6htl5maeqeaabqybxlhcgkgpg15yxbpqgn1c3rvbs5jb20+iqhubbmb\ncga+fieebk3gwdlc9ypn5wg9nyhqpbyfetwfameuvh8cgwmfcqpczwafcwkibwig\nfqojcascbbycawechgecf4aacgkqnyhqpbyfetzfqgwayqcgjfbu2zn45f/2ecbs\ne6vybfk9qrxpvu6pwode0t5sqcxy2oz0r29ogaw5mdyzre+zrgir4yqki3rqi6vy\nh66utwmybuv6qipv3qxhiqbsn3h/ss4tuf9c2//pz/lpmkimijilpxycy8f8l504\nesm+pu3ctnionzckoeh6kjwkjxdgqwqk58r4sfrfhcjma03+gypgv5ba593/zgqh\nl2gmmwbajhcnsh1ebaulcd48nqcmoyuviqa40cdohcz+rilqivvp6kvx+qmrvmav\ny1u391a40wfaromuk46jckfqveelaz4tac8uaov2x0gobziw7/1cwuln2vvojiej\nvj0q6sz/k7+du4h7nlq1ain+vv3t7viisu3wzract5c1aduh4ylio83w9rs4ecrj\nhmej5jg4b16hommrm1caq+cvpyymczbleshplcdmq7qcyoqvryw8ewvpnqwjstir\nc/kpq1n8ookdg0th8ja4jfrkfexlocduolsokktk8uu+uqgnbgeuvh8bdadomux3\nxatbgt4sarbknlnzwrzzcrfhxzegazsy9esny6d722igou40iys6ky08boqt/g8o\nfsooa6dknhxvcm/r99rsiyrnizt9s/ywkmub6jipgaigpd5w9lbab/u6pq039ni2\nqi+5cyz+8i6v2b6oogdnym8p2k14o+keah7z6aonpb8yiq3b7khtco+ohvp820sb\noa0hlms39qqhkg70ybae0hdczahxvvsmrn6eddz8szmrsavbiv84a9t5b8swnhxz\nt3csxqdawbz3gociummajuyodgylwac2bnsryxznq66h962uk9hygrdrjjspnnxu\n/vdxcrxyzclquhgpmds/gqwr/30jmxlkpqbg/3v4d+wy5ofsr+uquk4helqhjdq9\nfowrmyuxshzhz476yurn1vbaf4a5x5zi2obsxyk9vjsfaedismtvsrixomgu0ext\nnkratboqtx2zivjy0fwvehgniupsszqrokrz2zfttc+tu5x/ffaybu3qzhuaeqea\naykbvaqyaqoajhyhbg5nxshs3pwkz+vopz8h6jwcn3k8bqjhlr4fahsmbqkdwmca\naaojej8h6jwcn3k8qu4majetwc4o/f9m0tjko6dyqx5bsnglp1u3oyg0atvsvt9e\nbtxbqlpciorj16be/92smfvagbbqwywqjkngk7s08zbbk7wonzyag8nr5/b5cgi9\ncjrr73dbdnijvhjdkaan414+m57dg65tpt1vlxdqa8lsqobddszn1i/ugvqxqj1y\n6nmfvvpxor67n9r67iq4pzwf3wk7tospuatbfczbs2xs4sinpceddb2ima5cixl0\nh2pni/jonyo4rcwmuvpmx48cevgxfczwogdaosi75mklcah4ibe2efacbn3iumla\nhi2tour0kxsx0r3jzmdzvjkxaxwmqpjcflxvxumte4ooi6dibn7+2xaqfyourmy1\nwjfwwcvr3oapy2cgvxwpniz2mtkjhriaywfzdvdr5vlsu/ywkjuv11p6y8ypx7jw\nryvfttkd7qghjvwmbmpabtxywxvd74eguunyofoei97nkonb3loj+xdozegcmyl7\nczwzontmkefkob1ukxie+q==\n=wzdi\n-----end pgp public key block-----"
      }
    ]
  }
}

响应中的 shasum 属性应该是与提供程序 zip 文件相对应的 shasum,它也可以在 provider_sha256sums 文件中找到。

要获取 key_idascii_armor 道具,我正在运行以下命令:

$ gpg --list-secret-keys --keyid-format=long ## key_id
$ gpg --armor --export  > public.gpg ## export to public key to base64
$ cat public.gpg | sed -e ':a;n;$!ba;s/\r{0,1}\n/\\n/g' ## one-lined ascii_armor

简短问题

我对 gpg 密钥做了什么错误才会出现此错误?是我步骤不够,还是一切都错了?

openpgp:无效数据:标记字节没有 msb set

----更新----

这就是我在 go 中构建响应的方式:

我没有放置完整的代码,因为我相信问题出在 keyidasciiarmor 属性上。

如您所见:shasumkeyidasciiarmor 是硬编码的。

response := ProviderDownloadResponse{
        Protocols:           protocols,
        Os:                  os,
        Arch:                arch,
        Filename:            filename,
        DownloadURL:         downloadURL,
        ShasumsURL:          SHASUMsURL,
        ShasumsSignatureURL: SHASUMSSignatureURL,
        Shasum:              "1dd61b508aad0d65b32c71159775e409fd618adc5ba945cc2eebb42f29e085d3",
        SigningKeys: SigningKeys{
            GpgPublicKeys: []GPGPublicKey{
                {
                    KeyID:      "9F21EA3C1C9F793C",
                    ASCIIArmor: "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\n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\nCZWzoNTMkeFkob1UkxIe+Q==\n=wZDI\n-----END PGP PUBLIC KEY BLOCK-----",
                },
            },
        },
    }

正确答案


terraform使用的x/crypto/openpgp不支持读取装甲消息,参见issue,这就是错误的来源。

shasums_signature_url 提交的文档提到:

二进制、独立的 GPG 签名

另外,请参阅 Manually preparing a release doc

这是一个有效的 GPG 二进制(非 ASCII 装甲)签名

因此,您应该尝试在不使用 --armor 标志的情况下进行签名。

终于介绍完啦!小伙伴们,这篇关于《问题分析:Terraform的自定义提供程序GPG问题》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>