0

0

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

花韻仙語

花韻仙語

发布时间:2025-11-05 14:52:01

|

275人浏览过

|

来源于php中文网

原创

在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解析器,其后的所有缩进内容都应被视为一个多行字符串,并保留其中的所有换行符。

VWO
VWO

一个A/B测试工具

下载

正确的赋值方式如下:

  - 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密钥,也适用于任何需要精确保留换行符的多行字符串数据。

相关专题

更多
scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

188

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

288

2023.10.25

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

258

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

209

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1468

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

620

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

551

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

566

2024.04.29

AO3中文版入口地址大全
AO3中文版入口地址大全

本专题整合了AO3中文版入口地址大全,阅读专题下面的的文章了解更多详细内容。

1

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 2.9万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.5万人学习

Git中文开发手册
Git中文开发手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号