Windows本地Vault实例签署CSR时提示‘csr contains no data’
Vault签署中间CA时"csr contains no data"错误解决方法
问题背景
按照官方教程使用Vault签署中间CA时,执行签署命令持续收到csr contains no data错误,尝试了@file引用、变量存储、内联内容等方式均无效,PowerShell中无法识别网上提到的反引号处理方法;抓包发现用@引用文件时,发送内容每个字符间带有\u0000,内联内容格式看似正常但仍报错。
原执行命令
vault write -format=json rootCA/root/sign-intermediate ` issuer_ref="root" ` csr=@nt.csr ` format=pem_bundle ttl="43800h" ` | jq -r ".data.certificate" > int.cert.pem
错误信息
Error writing data to rootCA/root/sign-intermediate: Error making API request. URL: PUT http://localhost:8200/v1/rootCA/root/sign-intermediate Code: 400. Errors: * csr contains no data
解决方法
1. 修正PowerShell的CSR内容读取方式
PowerShell默认以UTF-16编码读取文件,导致发送给Vault的内容带有空字节\u0000,需强制以UTF-8读取并传入:
$csrContent = Get-Content -Path .\nt.csr -Raw -Encoding UTF8 vault write -format=json rootCA/root/sign-intermediate issuer_ref="root" csr="$csrContent" format=pem_bundle ttl="43800h" | jq -r ".data.certificate" > int.cert.pem
-Raw参数确保读取整个CSR为单字符串,保留原始换行格式-Encoding UTF8避免UTF-16编码带来的空字节问题
2. 使用子表达式直接嵌入CSR内容
也可以直接用子表达式在命令中读取文件,省去变量步骤:
vault write -format=json rootCA/root/sign-intermediate issuer_ref="root" csr="$(Get-Content -Path .\nt.csr -Raw -Encoding UTF8)" format=pem_bundle ttl="43800h" | jq -r ".data.certificate" > int.cert.pem
3. 验证CSR文件有效性
如果上述方法仍无效,先检查CSR文件本身是否合法:
openssl req -in nt.csr -text -noout
若命令报错,说明CSR文件损坏或格式错误,需重新生成符合PEM标准的CSR文件。
注意事项
- PowerShell不支持类Unix shell的
@filename语法,不要用反引号转义@ - 确保Vault客户端与服务器版本一致,避免API兼容性问题
- 确认PKI引擎已正确挂载到
rootCA路径,且rootissuer存在
内容的提问来源于stack exchange,提问作者BananaSupreme
相关产品推荐
相关产品推荐

