在GitHub Actions中安全传递多行PEM密钥:解决YAML解析问题

在GitHub Actions中安全传递多行PEM密钥:解决YAML解析问题

本文探讨了在github actions工作流中,将包含多行字符的`.pem`密钥从github secret传递给环境变量时,可能遇到的yaml解析错误。核心问题在于yaml对换行符的处理方式。解决方案是利用yaml的多行字符串字面量(`|`)语法,确保密钥内容作为单个字符串正确解析,从而避免因特殊字符导致的解析失败,确保ci/cd流程的顺畅执行。

GitHub Actions中传递多行密钥的挑战

在自动化部署和持续集成/持续交付(CI/CD)流程中,我们经常需要在GitHub Actions工作流中使用敏感凭证,例如SSH私钥(通常为.pem格式)或API密钥。这些密钥通常以GitHub Secrets的形式存储,以确保安全性。然而,当这些密钥包含多行字符(即换行符)时,直接将其赋值给工作流中的环境变量可能会导致YAML解析错误。

例如,一个典型的.pem密钥会包含如下结构,其中包含多行文本和换行符:

-----BEGIN RSA PRIVATE KEY-----MIIEpAIBAAKCAQEAw......-----END RSA PRIVATE KEY-----

当尝试将这样的多行密钥从GitHub Secret(例如 secrets.GITHUBAPP_KEY)直接传递给环境变量时,常见的错误赋值方式如下:

  - name: 执行特定步骤    run:  echo "执行命令..."    env:      GITHUBAPP_KEY: "${{ secrets.GITHUBAPP_KEY }}"

这种写法在执行时,GitHub Actions可能会抛出类似 error: error parsing STDIN: invalid Yaml document separator: –END RSA PRIVATE KEY—–” 的错误。这是因为YAML解析器在处理包含换行符的字符串时,如果没有明确的指示,可能会将换行符误认为是文档分隔符或新的YAML结构元素,从而导致解析失败。尽管使用了双引号,但它们不足以告诉YAML解析器将整个多行内容视为一个单一的字符串字面量。

解决方案:使用YAML多行字符串字面量

为了正确地将包含多行字符的密钥作为单个字符串传递给环境变量,我们需要利用YAML的多行字符串字面量语法,特别是管道符 |。管道符告诉YAML解析器,其后的所有缩进内容都应被视为一个多行字符串,并保留其中的所有换行符。

AI建筑知识问答 AI建筑知识问答

用人工智能ChatGPT帮你解答所有建筑问题

AI建筑知识问答 22 查看详情 AI建筑知识问答

正确的赋值方式如下:

  - name: 执行特定步骤    run:  echo "执行命令..."    env:      GITHUBAPP_KEY: |        ${{ secrets.GITHUBAPP_KEY }}

在这个示例中:

GITHUBAPP_KEY: 后面紧跟的管道符 | 指示YAML解析器,接下来的内容是一个多行字符串。${{ secrets.GITHUBAPP_KEY }} 会被GitHub Actions在运行时替换为实际的密钥内容。由于 | 的存在,即使密钥内容包含多行,它也会被完整地作为一个环境变量的字符串值传递,所有换行符都将保留在其内部,而不会干扰YAML的解析结构。

工作原理与注意事项

保留换行符: 管道符 | 是“字面量块标量”的指示符。它会保留字符串中所有的换行符和缩进(除非额外指定缩进)。这对于.pem密钥这类依赖精确格式(包括换行符)的数据至关重要。缩进: 在 | 之后,${{ secrets.GITHUBAPP_KEY }} 必须有至少一个空格的缩进,以表明它是 GITHUBAPP_KEY 键的值。这个缩进在最终字符串中通常会被剥离,但其存在是YAML语法的一部分。其他多行样式: YAML还提供了“折叠块标量”指示符 >。> 会将所有换行符替换为空格,并将连续的空行替换为单个换行符。对于需要精确保留所有换行符的密钥,| 是更合适的选择。安全性: 始终将敏感数据存储在GitHub Secrets中,而不是直接硬编码在工作流文件中。GitHub Secrets会在运行时安全地注入,并且不会暴露在日志中(除非您明确打印出来)。调试: 如果仍然遇到问题,请确保您的GitHub Secret中存储的密钥本身是正确的,没有额外的空格或损坏。您可以通过临时在工作流中打印密钥的长度或部分内容来辅助调试(但请务必在调试完成后移除这些敏感输出)。

总结

在GitHub Actions中处理多行敏感数据(如.pem密钥)时,理解YAML的多行字符串语法至关重要。通过简单地在环境变量赋值时使用管道符 |,可以有效地解决因换行符导致的YAML解析问题,确保密钥内容作为完整的字符串传递,从而保证CI/CD流程的顺畅和安全。这种方法不仅适用于.pem密钥,也适用于任何需要精确保留换行符的多行字符串数据。

以上就是在GitHub Actions中安全传递多行PEM密钥:解决YAML解析问题的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/567949.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月10日 04:25:24
下一篇 2025年11月10日 04:30:22

相关推荐

  • 适用于 SQL 思维的 ChromaDB

    您好,chroma db 是一个矢量数据库,对于使用 genai 应用程序非常有用。在本文中,我将通过查看 mysql 中的类似关系来探索如何在 chroma db 上运行查询。 模式 与 sql 不同,您无法定义自己的架构。在 chroma 中,您会获得固定的列,每个列都有自己的用途: impor…

    2025年12月13日
    000
  • 如何在Reactjs中使用Shadcn/UI

    如何在 react.js 中使用 shadcn/ui 了解如何利用 react.js 中的 shadcn/ui 来构建可定制的轻量级界面。了解如何将其与 echoapi 集成以实现高效的 api 管理和测试。非常适合希望增强 react.js 项目的开发人员! 使用 shadcn/ui 构建现代界面…

    2025年12月13日 好文分享
    000
  • 干净的架构:从哪里开始?

    在上一篇文章中我们有: 我们的问题域:具有一些要求的 todo 应用程序配置为使用 python 和 python polylith 的基本存储库。 因此,一些决定已经完成。我们拥有一些工具并已经决定了存储库的外观。 这是我喜欢 polylith 的原因之一:无论您编码什么或您的组织有多大,所有存储…

    2025年12月13日
    000
  • Python日循环-使用范围函数和索引、任务

    斐波那契数列:1)使用3个变量: f, s = -1, 1t = 0while t<=13: t= f + s print(t,end= ' ') f,s = s, t 输出: 0 1 1 2 3 5 8 13 21 2) 使用 2 个变量: f, s = -1, 1 wh…

    2025年12月13日
    000
  • AoC &#- Day 仔细考虑(C# 和 Python)

    仔细考虑一下 今天的挑战我第一次看到regex时就尖叫起来,主要是因为每当我看到“提取该字符串的一部分”时,regex就是我的首选; 基本概念和要求 所以我们需要找到所有 mul(number1, number2) 并将它们相乘,但忽略所有其他字符。 所以我们需要找到一种机制来查找所有有效的 mul…

    2025年12月13日
    000
  • 打包 Python RPM

    最近,我正在为 Red Hat 工作的当前项目中执行一项非常具体的任务,即 RHEL LightspeedShellAI,这个项目相对较新,但我们想开始发货开发 RPM,让我们的 QE 朋友开始使用该工具并在他们的管道中进行测试。 我知道包装和一般Python东西的方法,但是伙计,我必须告诉你,这个…

    2025年12月13日
    000
  • 无法从 Companies House 和 HMRC API 获取营业额数据超过英镑的数据

    无法从 Companies House 和 HMRC API 获取营业额数据超过 200 万英镑的数据 2024 年 12 月 4 日 评论:2 答案:0 0 我已经处理这个问题一天了,但在从 hmrc 和 companies house api 获取公司数据时遇到了麻烦。我主要需要营业额超过 10…

    2025年12月13日
    000
  • python中grid的用法

    Python 中的 Tkinter 库中的网格小部件用于创建带有规则排列行和列的网格状布局,以便组织和对齐图形元素。要使用网格,可以使用以下步骤:使用 Grid 类创建网格。使用 rowconfigure() 和 columnconfigure() 方法配置行和列的属性。使用 grid() 方法将小…

    2025年12月13日
    000
  • 如何使用 Python 抓取 Google 搜索结果

    抓取 google 搜索可提供基本的 serp 分析、seo 优化和数据收集功能。现代抓取工具使这个过程更快、更可靠。 我们的一位社区成员撰写了此博客,作为对 crawlee 博客的贡献。如果您想向 crawlee 博客贡献此类博客,请通过我们的 discord 频道与我们联系。 在本指南中,我们将…

    2025年12月13日 好文分享
    000
  • python爬虫怎么点按钮

    使用 Seleniumwebdriver 来模拟浏览器操作,通过单击元素的 ID 或 XPath 来点击按钮。步骤包括:安装 Seleniumwebdriver、导入模块、创建 WebDriver 实例、导航到页面、定位按钮(使用 find_element_by_id() 或 find_elemen…

    2025年12月13日
    000
  • 快速编程

    快速编程是指自动插入代码并解决简单问题的模板。 从文件中卸载样本并用标签填充数据数组是可以复制并粘贴到不同项目中的基本操作。 from google.colab import drivedrive.mount(‘/content/gdrive’, force_remount=true)!cp /co…

    2025年12月13日
    000
  • 用于快速启动 Polylith 的 Cookiecutter

    向您展示一个python cookiecutter,用于在python 中快速启动polylith。如果您不知道什么是 polylith,请阅读文档,对于不耐烦的读者: polylith 是一种软件架构,旨在构建简单、可维护、可测试和可扩展的后端系统。它通过在系统规模上应用功能思维来实现这一点,将代…

    2025年12月13日
    000
  • [CVHSV 与 RGB:理解和利用 HSV 进行图像处理

    在上一篇文章中,我们探索了在 opencv 中处理 rgb 图像的基础知识,包括绘图以及调整亮度和对比度。虽然 rgb 色彩空间非常适合计算机显示器,因为它以屏幕发出的光强度来表示颜色,但它与人类在自然世界中感知颜色的方式并不相符。这就是 hsv(色相、饱和度、明度)发挥作用的地方——一个旨在以更接…

    2025年12月13日 好文分享
    000
  • 单一性下界

    幺正性确保矩阵和顶点被相同数量的内存覆盖。每个存储单元的单一数据类型简化了其每个单独函数的代码和操作。修剪可选参数(例如 3 个限制)可以更轻松地测试和验证复杂的 python 机制。 a.numerical_approx(digits = 3)x.numerical_approx(digits =…

    2025年12月13日
    000
  • 人工智能如何塑造更智能的游戏和模拟世界

    人工智能 (AI) 正在迅速改变游戏格局,使视频游戏变得更加身临其境、智能且引人入胜。从增强 NPC(非玩家角色)行为到创建逼真的虚拟环境,人工智能是游戏开发和模拟体验中许多创新的核心。 在本文中,我们将探讨人工智能如何将游戏提升到一个新的水平,深入探讨埃隆·马斯克对游戏中人工智能的愿景,并讨论这些…

    2025年12月13日
    000
  • 如何使用 Python 创建带有时间和日期的动态壁纸

    如果您曾经想要一张能根据当前时间和日期自动更新的壁纸,那么本教程适合您。我们将使用 python 和一些库(如 pil (pillow))生成图像,添加带有时间和日期的动态文本,然后将此图像设置为 windows 上的壁纸。 我们需要什么? 已安装 python:如果您尚未安装 python,可以从…

    2025年12月13日
    000
  • 配置 Django 项目以将敏感数据存储在 YAML 文件中

    .py 文件中硬编码令牌、数据库凭据和其他敏感数据并不安全。很多人使用django-environ库,但我认为它不方便。因此,我使用 yaml 文件来存储敏感数据,并使用 pyyaml 库来读取它们的数据。 创建项目文件夹: mkdir myproject 切换创建的文件夹: cd myprojec…

    2025年12月13日
    000
  • Jinbase – 多模型事务嵌入式数据库

    嗨,开发者! 我是 Alex,一名技术爱好者。我很高兴向您展示 Jinbase,我的多模型事务嵌入式数据库。 大约一年前,我介绍了 Paradict,这是我对多格式流序列化的看法。鉴于其可读性,Paradict 文本格式实际上是配置文件的一种有趣的数据格式。但是使用 Paradict 来管理配置文件…

    2025年12月13日
    000
  • 理解自我反思的简单代码(代理设计模式)

    反思/自我反思有点被低估了。如果您的应用程序依赖于提示,我强烈建议您探索这个概念。实施起来并不难,反思技术可以帮助迭代地完善 llm 响应。 from mirascope.core import BaseMessageParam, ResponseModelConfigDict, openaifro…

    2025年12月13日
    000
  • Python 初学者指南:快速教程 – 2

    python 是最流行的编程语言之一,以其简单性和多功能性而闻名。无论您是编程新手还是希望为您的项目选择 python,本教程都将指导您完成基础知识。 1.什么是python? python 是一种高级解释型编程语言,强调可读性和效率。它广泛应用于网页开发、数据分析、人工智能、科学计算等领域。 2.…

    2025年12月13日
    000

发表回复

登录后才能评论
关注微信