如何将pkcs11-tool生成的椭圆曲线密钥用于OpenSSL验证?
问题:SoftHSM生成的prime256v1密钥对签名无法被OpenSSL验证
已验证通过的RSA操作流程
通过pkcs11-tool在SoftHSM中生成RSA密钥对并完成OpenSSL签名验证的命令如下:
# 生成RSA密钥对 pkcs11-tool --module /usr/lib/softhsm/libsofthsm2.so -l --token-label token-label -k --key-type rsa:2048 --usage-sign --id 1002 --label rsatest --pin mysecret1 # 导出公钥 pkcs11-tool --module /usr/lib/softhsm/libsofthsm2.so --id 1002 --read-object --type pubkey -o rsa.der # 使用HSM签名 pkcs11-tool --module /usr/lib/softhsm/libsofthsm2.so --login --pin mysecret1 --sign --id 1002 -m SHA512-RSA-PKCS --input text.txt --output rsa.signature # OpenSSL验证签名 openssl dgst -verify rsa.der -sha512 -keyform DER -signature rsa.signature text.txt
EC密钥对签名验证失败场景
生成prime256v1椭圆曲线密钥对后,pkcs11-tool可正常验证签名,但OpenSSL验证失败(提示Error verifying data),操作命令如下:
# 生成prime256v1密钥对(注意标签与密钥类型不匹配,建议修正为prime256v1test) pkcs11-tool --module /usr/lib/softhsm/libsofthsm2.so -l --token-label token-label -k --key-type EC:prime256v1 --usage-sign --id 1001 --label ed25519test --pin mysecret1 # 导出EC公钥 pkcs11-tool --module /usr/lib/softhsm/libsofthsm2.so --id 1001 --read-object --type pubkey -o prime256v1-pub.der # 使用HSM生成ECDSA签名 pkcs11-tool --module /usr/lib/softhsm/libsofthsm2.so --login --pin mysecret1 --sign --id 1001 -m ECDSA --input text.txt --output ed25519.signature # pkcs11-tool验证签名(成功) pkcs11-tool --module /usr/lib/softhsm/libsofthsm2.so --id 1001 --verify -m ECDSA --input-file text.txt --signature-file ed25519.signature # OpenSSL验证签名(失败) openssl dgst -verify prime256v1-pub.der -sha512 -keyform DER -signature ed25519.signature text.txt
OpenSSL原生EC密钥对验证正常流程
OpenSSL自行生成的prime256v1密钥对可正常完成签名验证,命令如下:
# 生成EC密钥对 openssl ecparam -in openssl_prime256v1.pem -genkey -noout -out openssl_prime256v1-key.pem # 导出EC公钥 openssl ec -in openssl_prime256v1-key.pem -pubout -out openssl_prime256v1-pub.pem # OpenSSL签名 openssl dgst -sign openssl_prime256v1-key.pem -sha256 -keyform PEM -out openssldemo.txt.sign -binary openssldemo.txt # OpenSSL验证签名 openssl dgst -verify openssl_prime256v1-pub.pem -sha256 -keyform PEM -signature openssldemo.txt.sign -binary openssldemo.txt
问题分析与解决办法
核心问题:哈希算法不匹配
prime256v1曲线的安全哈希算法默认对应SHA-256,但你在OpenSSL验证时指定了-sha512,而pkcs11-tool使用-m ECDSA签名时默认采用SHA-256(与曲线匹配),导致哈希算法不一致,验证失败。
修正步骤
重新生成签名,明确指定SHA-256算法
使用pkcs11-tool签名时,指定具体的哈希算法标识SHA256-ECDSA,避免歧义:pkcs11-tool --module /usr/lib/softhsm/libsofthsm2.so --login --pin mysecret1 --sign --id 1001 -m SHA256-ECDSA --input text.txt --output prime256v1.signature使用对应哈希算法验证
OpenSSL验证时改用-sha256,与签名时的哈希算法一致:openssl dgst -verify prime256v1-pub.der -sha256 -keyform DER -signature prime256v1.signature text.txt可选:验证公钥格式正确性
确认导出的公钥是合法的SubjectPublicKeyInfo格式(DER编码):openssl ec -in prime256v1-pub.der -inform DER -pubin -text -noout若输出包含
prime256v1曲线信息及公钥参数,则公钥格式正常。建议修正密钥标签
生成EC密钥时的标签ed25519test与实际密钥类型(prime256v1)不符,建议改为prime256v1test,避免后续混淆。
内容的提问来源于stack exchange,提问作者Kjeld Flarup
相关产品推荐
相关产品推荐

