如何将SSH私钥格式化为Azure Function的环境变量?
我有一个用Python编写的Azure Functions函数,它通过paramiko使用SFTP复制一个文件,并将该文件中的数据加载到数据库中。用于认证连接的私钥文件,是由我的组织提供给我的。在本地测试函数时,我能够通过将密钥文件的内容放入我的 .env 文件中来完成认证,格式如下:
SSH_PKEY='-----BEGIN RSA PRIVATE KEY-----
<key line 1>
...
<key line 25>
-----END RSA PRIVATE KEY-----'
随后在一个在 function_app.py 中被调用的函数里建立连接。下面是相关代码片段(基于 这个回答 在类似问题中的解答):
load_dotenv()
SSH_HOSTNAME = str(os.getenv('SSH_HOSTNAME'))
SSH_USERNAME = str(os.getenv('SSH_USERNAME'))
SSH_PKEY = str(os.getenv('SSH_PKEY'))
...
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
key = paramiko.RSAKey.from_private_key(io.StringIO(SSH_PKEY))
ssh.connect(hostname = SSH_HOSTNAME, username = SSH_USERNAME, pkey = key)
本地运行时,这一切都工作得很完美。然而,当将函数部署到Azure时,我遇到了一个问题:Azure Functions的环境变量不支持多行值。将密钥完整地复制粘贴到环境变量中看起来像这样:
然后在Azure中运行该函数时,我得到错误:“not a valid RSA private key file”。
如何将我的私钥格式化为在Azure函数的环境变量中使用的形式?
我尝试在Azure中编辑环境变量,以下几种方式都没有奏效或没有产生不同的错误:
- 将密钥字符串用单引号括起来
- 在每一行末尾添加 \n
- 将密钥字符串用单引号括起来并在每一行末尾再添加 \n
- 省略开头和结尾的分隔符
在尝试解决问题的过程中,我还遇到以下一些类似的问题。某些信息有用,但这里没有一个能解决我的具体问题:
- Paramiko - connect with private key - not a valid OPENSSH private/public key file
- How do use paramiko.RSAKey.from_private_key()?
- Paramiko: "not a valid RSA private key file"
结合我所读到和尝试过的内容,这些看起来是解决问题的可行思路,按偏好由高到低排序如下:
- 找出在Azure中如何将SSH密钥字符串正确格式化为环境变量的方法(这将涉及最少的代码改动);
- 找出如何将私钥作为文件包含而不暴露密钥内容的方法;
- 使用Azure Key Vault。
是不是我对密钥文件的内容做错了什么,可以简单修正?
解决方案
一个思路:把它做成一个单字符串,用唯一分隔符代替换行符存放——例如 |
-----BEGIN RSA PRIVATE KEY-----|<key line 1>|...|<key line 25>|-----END RSA PRIVATE KEY-----
随后在Python中将 | 替换为换行符 \n
SSH_PKEY = os.getenv('SSH_PKEY').replace("|", "\n")
在本地电脑上也应该能用同样的方式工作,即把它作为带换行的字符串保存——因此运行时不需要任何 if/else 来切换不同的代码。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。
