问题分析:Terraform的自定义提供程序GPG问题
在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" } } }
使用这两个文件
- provider.tf.json
provider "mycustomprovider" { username = "abc" password = "def" host = "yjk" }
- 版本.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 自定义提供程序应该具有三个文件(据我所知):
- zip 格式的提供商(如示例所示)
- 一个
provider_sha256sums
文件,其中包含每个提供商 zip 文件的 shasum(在本例中我只有一个) 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_id
和 ascii_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 中构建响应的方式:
我没有放置完整的代码,因为我相信问题出在 keyid
和 asciiarmor
属性上。
如您所见:shasum
、keyid
和 asciiarmor
是硬编码的。
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相关知识,快来关注吧!

- 上一篇
- 在Mac上如何在终端中搜索文件夹?

- 下一篇
- 极创快速NZP服务快速拓展,36座城市已启用,将覆盖90%的地级市,二季度完成
-
- Golang · Go问答 | 1年前 |
- 在读取缓冲通道中的内容之前退出
- 139浏览 收藏
-
- Golang · Go问答 | 1年前 |
- 戈兰岛的全球 GOPRIVATE 设置
- 204浏览 收藏
-
- Golang · Go问答 | 1年前 |
- 如何将结构作为参数传递给 xml-rpc
- 325浏览 收藏
-
- Golang · Go问答 | 1年前 |
- 如何用golang获得小数点以下两位长度?
- 477浏览 收藏
-
- Golang · Go问答 | 1年前 |
- 如何通过 client-go 和 golang 检索 Kubernetes 指标
- 486浏览 收藏
-
- Golang · Go问答 | 1年前 |
- 将多个“参数”映射到单个可变参数的习惯用法
- 439浏览 收藏
-
- Golang · Go问答 | 1年前 |
- 将 HTTP 响应正文写入文件后出现 EOF 错误
- 357浏览 收藏
-
- Golang · Go问答 | 1年前 |
- 结构中映射的匿名列表的“复合文字中缺少类型”
- 352浏览 收藏
-
- Golang · Go问答 | 1年前 |
- NATS Jetstream 的性能
- 101浏览 收藏
-
- Golang · Go问答 | 1年前 |
- 如何将复杂的字符串输入转换为mapstring?
- 440浏览 收藏
-
- Golang · Go问答 | 1年前 |
- 相当于GoLang中Java将Object作为方法参数传递
- 212浏览 收藏
-
- Golang · Go问答 | 1年前 |
- 如何确保所有 goroutine 在没有 time.Sleep 的情况下终止?
- 143浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 魔匠AI
- SEO摘要魔匠AI专注于高质量AI学术写作,已稳定运行6年。提供无限改稿、选题优化、大纲生成、多语言支持、真实参考文献、数据图表生成、查重降重等全流程服务,确保论文质量与隐私安全。适用于专科、本科、硕士学生及研究者,满足多语言学术需求。
- 21次使用
-
- PPTFake答辩PPT生成器
- PPTFake答辩PPT生成器,专为答辩准备设计,极致高效生成PPT与自述稿。智能解析内容,提供多样模板,数据可视化,贴心配套服务,灵活自主编辑,降低制作门槛,适用于各类答辩场景。
- 37次使用
-
- Lovart
- SEO摘要探索Lovart AI,这款专注于设计领域的AI智能体,通过多模态模型集成和智能任务拆解,实现全链路设计自动化。无论是品牌全案设计、广告与视频制作,还是文创内容创作,Lovart AI都能满足您的需求,提升设计效率,降低成本。
- 49次使用
-
- 美图AI抠图
- 美图AI抠图,依托CVPR 2024竞赛亚军技术,提供顶尖的图像处理解决方案。适用于证件照、商品、毛发等多场景,支持批量处理,3秒出图,零PS基础也能轻松操作,满足个人与商业需求。
- 46次使用
-
- PetGPT
- SEO摘要PetGPT 是一款基于 Python 和 PyQt 开发的智能桌面宠物程序,集成了 OpenAI 的 GPT 模型,提供上下文感知对话和主动聊天功能。用户可高度自定义宠物的外观和行为,支持插件热更新和二次开发。适用于需要陪伴和效率辅助的办公族、学生及 AI 技术爱好者。
- 45次使用
-
- GoLand调式动态执行代码
- 2023-01-13 502浏览
-
- 用Nginx反向代理部署go写的网站。
- 2023-01-17 502浏览
-
- Golang取得代码运行时间的问题
- 2023-02-24 501浏览
-
- 请问 go 代码如何实现在代码改动后不需要Ctrl+c,然后重新 go run *.go 文件?
- 2023-01-08 501浏览
-
- 如何从同一个 io.Reader 读取多次
- 2023-04-11 501浏览