如何使用OpenSSL为X509证书生成持有证明?
用OpenSSL生成X.509证书验证代码的签名(持有证明)
我刚好对Azure IoT Hub的X.509证书持有证明流程很熟悉,这就给你一步步拆解用OpenSSL完成签名的操作:
前提准备
你需要:
- 与验证代码关联的X.509证书对应的私钥(PEM格式最佳,比如
device-private-key.pem) - 你的验证代码:
7A69A4702DA903A41C3A5BC5575A8E3F49BEC5E5BA2D4CE1
步骤1:把十六进制验证代码转成二进制文件
OpenSSL签名是对原始二进制数据操作的,所以得先把十六进制字符串转成二进制:
# Unix/Linux/Git Bash环境 echo -n "7A69A4702DA903A41C3A5BC5575A8E3F49BEC5E5BA2D4CE1" | xxd -r -p > verification-code.bin
echo -n是为了避免额外的换行符干扰,xxd -r -p负责把十六进制转成原始二进制,输出到verification-code.bin文件。
如果是Windows PowerShell环境,用这个命令:
$hexCode = "7A69A4702DA903A41C3A5BC5575A8E3F49BEC5E5BA2D4CE1" $bytes = [byte[]]::new($hexCode.Length/2) for($i=0; $i -lt $hexCode.Length; $i+=2){ $bytes[$i/2] = [convert]::ToByte($hexCode.Substring($i,2), 16) } [IO.File]::WriteAllBytes("verification-code.bin", $bytes)
步骤2:用私钥对二进制验证代码签名
Azure IoT Hub要求用SHA256哈希算法+PKCS#1 v1.5签名格式,执行以下OpenSSL命令:
openssl dgst -sha256 -sign device-private-key.pem -out verification-signature.bin verification-code.bin
参数解释:
-sha256:指定哈希算法为SHA256,符合Azure的要求-sign device-private-key.pem:指定用来签名的私钥文件-out verification-signature.bin:将签名后的二进制数据输出到这个文件verification-code.bin:待签名的二进制验证代码文件
如果你的私钥设置了密码,需要加上-passin参数传入密码,比如:
openssl dgst -sha256 -sign device-private-key.pem -passin pass:your-key-password -out verification-signature.bin verification-code.bin
步骤3:将签名转为Base64格式(提交Azure时需要)
Azure IoT Hub通常要求提交Base64编码的签名字符串,所以把二进制签名转成Base64:
# Unix/Linux/Git Bash base64 verification-signature.bin > verification-signature.b64
Windows PowerShell版本:
[Convert]::ToBase64String([IO.File]::ReadAllBytes("verification-signature.bin")) | Out-File -Encoding ASCII verification-signature.b64
可选:验证签名的有效性
如果你想确认签名是否正确,可以用对应的X.509证书公钥来验证:
openssl dgst -sha256 -verify <(openssl x509 -in device-cert.pem -pubkey -noout) -signature verification-signature.bin verification-code.bin
如果输出Verified OK,说明签名完全有效。
内容的提问来源于stack exchange,提问作者Dalton Cézane
相关产品推荐
相关产品推荐

