如何从 cloudformation 模板中的参数文件传递公钥?

Posted

技术标签:

【中文标题】如何从 cloudformation 模板中的参数文件传递公钥?【英文标题】:How to pass public key from parameter file in cloudformation template? 【发布时间】:2021-05-28 16:11:19 【问题描述】:

我定义了以下 Cloudformation 模板,我想从参数文件中传递公钥。 “MyPublicKey”变量是字符串类型的。我通过使用来引用这个变量

EncodedKey !Ref MyPublicKey

在 PublicKeyConfig 下,如下所示。

AWSTemplateFormatVersion: "2010-09-09"

  Parameters:
    MyPublicKey:
      Type: String
      Description: 'Public key for some purpose'
      NoEcho: true

  Resources:
    CloudfrontPublicKey:
      Type: AWS::CloudFront::PublicKey
      Properties:
        PublicKeyConfig:
          CallerReference: 'some-caller-reference'
          Comment: 'Public key for signed url'
          Name: 'cloudfront-public-key'
          EncodedKey: !Ref MyPublicKey

    ...

parameter.json 文件看起来像这样。公钥在原始 .pem 文件中是多行的,但我在字符串中添加了换行符“\n”,只要有换行符。

[
  
    "ParameterKey": "MyPublicKey",
    "ParameterValue": "-----BEGIN PUBLIC KEY-----\naaaa\nbbbb\n-----END PUBLIC KEY-----"
  ,
]
 

尝试更新堆栈时,我收到以下错误:

Invalid request provided: AWS::CloudFront::PublicKey

好像不能导入公钥。

【问题讨论】:

我认为按照create-public-key,最后的编码密钥中应该还有一个\n 字符。只是预感。 @samtoddler 没用。 只是缺少编码,请关闭我附加的示例文档,我不确定您的密钥是什么样的,以及您是如何生成它的。如果是通过 CLI,它已经被编码了。 我使用这些命令来生成密钥:'openssl genrsa -out private_key.pem 2048' 和 ''openssl rsa -pubout -in private_key.pem -out public_key.pem"。 您的密钥应如下所示-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy/a9J+kUsH97bcrAZ7AR\nw/eT/RB9pxGyCWNZpllUqjAxBCqemfoXAH/3SEW+9GjRHOTCDHP8Ds1VUDmh2vZn\nm3SOUHdcWZkCAjhPxmuiU9rhcd3Ti1A9fNv9S8rM+GAA2ElLmHOoXbNHulWqvJO6\nwym57g1uZds3StmHQgWKWvOi792PAgjZUKjx0CD3AyL2ILTjXascuuzaI7bIAiqV\nup7J/3scpbTJpd17hLTzFVjYk/QX20v62s0LS+M/LSKf9yg22ezJzOTaoQA738hI\n1QphXi3LZAcp1uiJNIas6emtaSgBgFp+vHOLJmQQTSADMExzcodnxshBX1h+Ljoy\nSQIDAQAB\n-----END PUBLIC KEY-----\n。如您所见,此键中有多个换行符。 【参考方案1】:

基于 cmets,在传递值时需要额外的 \n 字符,并且应将 Ref 替换为用于放置字符串的 Sub 函数。

  Resources:
    CloudfrontPublicKey:
      Type: AWS::CloudFront::PublicKey
      Properties:
        PublicKeyConfig:
          CallerReference: 'some-caller-reference'
          Comment: 'Public key for signed url'
          Name: 'cloudfront-public-key'
          EncodedKey: !Sub "$MyPublicKey"

以下是内联键示例:

生成密钥:

openssl genrsa -out private_key.pem 2048
openssl rsa -pubout -in private_key.pem -out public_key.pem

Cloudformationt 模板:

AWSTemplateFormatVersion: "2010-09-09"
Resources:
  CloudfrontPublicKey:
    Type: AWS::CloudFront::PublicKey
    Properties:
      PublicKeyConfig:
        CallerReference: 'some-caller-reference'
        Comment: 'Public key for signed url'
        Name: 'cloudfront-public-key'
        EncodedKey: |
          -----BEGIN PUBLIC KEY-----
          MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsG0grTw5uHbO4CkFVyqN
          lKLGd9ZJrj6l68QU20SzrF7jgQtzE7VKfHxWfzE5FDKF1qKVLT0mURjlRfRPUXaT
          sZYsnKv+cTYkraewdLqbVuN7JII2D/cEXTYRn7849kGKycl3YMXeJeBStbLSPWfh
          MNJZnlFnEX6DkYtwk0Ae0bQ3WT1Be/Xhe4pqSQsnU+InSDkIfA+4UTRLa0kTCgON
          8BjcNloJE3NbLYshQPconb8pA+3jjkMF0QAH6rtc452G7CuS3KBfVQwWUeWE77kK
          wQQir6YFvKP3pG8Ls55FxXBTCCNJl5LZcHt1D0cZmuoSLJj2mVzJgKGyLTdoIwAW
          6QIDAQAB
          -----END PUBLIC KEY-----

列表键:

aws cloudfront list-public-keys|jq .PublicKeyList.Items[1]

输出:


  "Id": "08ZCTRKADSADASDAS",
  "Name": "cloudfront-public-key",
  "CreatedTime": "2021-02-27T10:25:43.076Z",
  "EncodedKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsG0grTw5uHbO4CkFVyqN\nlKLGd9ZJrj6l68QU20SzrF7jgQtzE7VKfHxWfzE5FDKF1qKVLT0mURjlRfRPUXaT\nsZYsnKv+cTYkraewdLqbVuN7JII2D/cEXTYRn7849kGKycl3YMXeJeBStbLSPWfh\nMNJZnlFnEX6DkYtwk0Ae0bQ3WT1Be/Xhe4pqSQsnU+InSDkIfA+4UTRLa0kTCgON\n8BjcNloJE3NbLYscZmuoSLJj2mVzJgKGyLTdoIwAW\n6QIDAQAB\n-----END PUBLIC KEY-----\n",
  "Comment": "Public key for signed url"

Public key creation in AWS cloudformation giving following error: Invalid request provided: AWS::CloudFront::PublicKey 已回答。

【讨论】:

必须将 'EncodedKey: !Ref MyPublicKey' 更改为 'EncodedKey: !Sub "$PublicKey "

以上是关于如何从 cloudformation 模板中的参数文件传递公钥?的主要内容,如果未能解决你的问题,请参考以下文章

如何遍历 CloudFormation 模板中的值

将多个参数从外部文件传递到 cloudformation 模板并使用带有 ref 的值

如何在存储桶名称中使用变量 AWS Cloudformation

从 CloudFormation 模板中的 DropDownList 中选择多个值

如何在 CloudFormation 中将字符串列表作为参数传递?

连接fargate的Cloudformation参数