我正在尝试通过 Azure 的 REST API 检索 ssl 证书的指纹,并将其从逻辑应用程序内转换为十六进制值。 REST API 的返回值包括一个属性
x5t
,其中包含指纹:
{
"id": "https://myvault.vault.azure.net/certificates/selfSignedCert01/f60f2a4f8ae442cfb41ca2090bd4b769",
"kid": "https://myvault.vault.azure.net/keys/selfSignedCert01/f60f2a4f8ae442cfb41ca2090bd4b769",
"sid": "https://myvault.vault.azure.net/secrets/selfSignedCert01/f60f2a4f8ae442cfb41ca2090bd4b769",
"x5t": "a9gQzwmHiKJ3vHoKhXVTFuMohMX",
...
但是,我需要的是门户中显示的格式的指纹,它表示它是十六进制的:
文本格式:
X.509 SHA-1 Thumbprint (in hex)
54795FFE62D9088DD6D4AA47393...
这个十六进制值是我随后需要写入单独秘密的值。 (Azure,为什么你用这种明显非标准的格式表示指纹?这也是搜索证书时证书存储中使用的格式,这就是我最终需要它的原因。但我离题了......)
如何将 REST API 返回的
x5t
字符串值(我认为是 base64 编码的二进制(?))转换为门户中作为逻辑应用步骤使用的十六进制值?我没有找到“base64 文本到十六进制”转换函数。
编辑: 如果我用“=”将值填充为 4 个字符的倍数,我可以在 Compose 步骤中成功使用
baseto64String()
函数。这给了我这样的二进制表示:
Outputs:
k�� ���w�z
�uS�(��
现在我只需要弄清楚如何在逻辑应用程序中制作该十六进制。 python 中有效的示例:
import base64
base64.b64decode('a9gQzwmHiKJ3vHoKhXVTFuMohMX=').hex()
我最终创建了一个可以从逻辑应用程序调用的 Azure 函数:
/// <summary>
/// This function takes a base64 encoded string and converts it to hex. This is useful for converting the x5t
/// certificate thumbprint the key vault REST api returns to the hex thumbprint the .net API expects.
/// </summary>
/// <param name="logger"></param>
/// <param name="base64value"</param>
[FunctionName("Base64ToHex")]
public static async Task<IActionResult> Base64ToHex(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request for Base64ToHex.");
var requestBody = await new StreamReader(req.Body).ReadToEndAsync();
dynamic bodyData = JsonConvert.DeserializeObject(requestBody);
var encodedString = bodyData?.encodedString;
var responseMessage = "";
if (string.IsNullOrEmpty(encodedString))
{
responseMessage = /*lang=json,strict*/ "{\"error\":\"No encodedString provided\"}";
}
else
{
encodedString = encodedString.Replace("-", "+").Replace("_", "/");
encodedString = encodedString.PadRight(encodedString.Length + (encodedString.Length * 3 % 4), '=');
byte[] data = Convert.FromBase64String(encodedString);
responseMessage = $@"{{""hexString"":""{Convert.ToHexString(data)}""}}";
}
return new OkObjectResult(responseMessage);
}