You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 22:07:43