使用OpenSSL 3与硬件ED25519密钥签署X509证书失败求助
使用OpenSSL 3.3.0结合HSM中的ED25519密钥生成自签名X509证书问题
问题背景
我在HSM(硬件安全模块)中存储了ED25519密钥,想要用OpenSSL 3.3.0版本生成自签名X509证书。我的实现思路是:将ED25519密钥存入EVP_PKEY对象,实现自定义签名函数ed_meth_sign,通过EVP_PKEY_METHOD关联该函数,期望签署X509数据时自动调用这个自定义签名逻辑。
现有代码
static int ed_meth_sign(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *slen, const unsigned char *data, size_t dlen) { size_t siglen = 1024; const struct hw_key *private_key = EVP_PKEY_CTX_get_data(ctx); if (sign_data(private_key, data, dlen, sig, &siglen)) { // sign_data()是其他地方实现的函数 *slen = (unsigned int)siglen; return 1; } return 0; } void get_selfsigned_cert(EVP_PKEY *public_key, hw_key *private_key_data) { X509 *x509 = X509_new(); X509_set_pubkey(x509, public_key); // 在此填充更多X509证书字段 EVP_PKEY *sk = EVP_PKEY_new(); EVP_PKEY_set_type(sk, EVP_PKEY_ED25519); EVP_PKEY_CTX *evp_ctx = EVP_PKEY_CTX_new(sk, NULL); EVP_PKEY_CTX_set_data(evp_ctx, private_key_data); EVP_PKEY_METHOD *ameth = EVP_PKEY_meth_new(0, 0); EVP_PKEY_meth_set_sign(ameth, NULL, ed_meth_sign); EVP_PKEY_meth_add0(ameth); if (X509_sign(x509, sk, NULL) == 0) { ERR_print_errors_fp(stderr); } EVP_PKEY_free(sk); }
报错信息
调用X509_sign()时失败,报错如下:
8077F520107F0000:error:03000086:digital envelope routines:do_sigver_init:initialization error:crypto/evp/m_sigver.c:189
代码追踪结果
我追踪OpenSSL代码后发现,evp_pkey_export_to_provider()中的如下代码片段返回NULL(未处于FIPS模式):
/* No key data => nothing to export */ check = 1; #ifndef FIPS_MODULE check = check && pk->pkey.ptr == NULL; #endif check = check && pk->keydata == NULL; if (check) { return NULL; }
疑问
- 这里的
ptr和keydata是否指私钥? - 除了调用
EVP_PKEY_CTX_set_data(),还有其他设置该数据的方式吗? - 我的整体实现思路是否完全错误?
内容的提问来源于stack exchange,提问作者aveen
相关产品推荐
相关产品推荐

