使用openssl api识别证书中的EC曲线

使用openssl api识别证书中的EC曲线,openssl,certificate,Openssl,Certificate,我试图在屏幕上显示一些证书信息,用于生成密钥的曲线给我带来了麻烦。在所用曲线中,正确标识为prime256v1。但是,我希望使用OpenSsl api获取此信息。什么功能可以实现这一点 我正在使用ManagedOpenSsl,但这并不重要。问题是,对于我遇到的其他问题,我都可以在C中找到例子,但对于这个问题,我找不到。OpenSSL wiki的页面上有一些这样的东西。您需要的大多数EC函数都在/crypto/EC/EC.h中 您必须使用EVP\u PKEY*PKEY=X509\u get\u p

我试图在屏幕上显示一些证书信息,用于生成密钥的曲线给我带来了麻烦。在所用曲线中,正确标识为prime256v1。但是,我希望使用OpenSsl api获取此信息。什么功能可以实现这一点


我正在使用ManagedOpenSsl,但这并不重要。问题是,对于我遇到的其他问题,我都可以在C中找到例子,但对于这个问题,我找不到。

OpenSSL wiki的页面上有一些这样的东西。您需要的大多数EC函数都在
/crypto/EC/EC.h

您必须使用
EVP\u PKEY*PKEY=X509\u get\u pubkey(X509)
从证书中提取公钥

使用
EVP\u PKEY\u get\u type(PKEY)
检查钥匙类型。它应该返回
EVP\u PKEY\u EC
。您需要编写
EVP\u PKEY\u get\u type
。这是:

int EVP_PKEY_get_type(EVP_PKEY *pkey)
{
    ASSERT(pkey);
    if (!pkey)
        return NID_undef;

    return EVP_PKEY_type(pkey->type);
}
您使用
EC_key*key=EVP_PKEY\u get1_EC_key(PKEY)
获取密钥。由于它是一个
get1
,因此它会在
EC_键*
上增加引用计数。一定要在上面调用
EC\u KEY\u free
。(A
get0
将不需要免费登录)

如果设置了
OPENSSL\u EC\u NAMED\u CURVE
,则可以使用
EC\u GROUP\u get\u CURVE\u name
。它将返回所用曲线的NID(更准确地说,是域参数)。例如,
prime256v1
将返回
NID\u X9\u 62\u prime256v1

否则,您需要使用
EC\u GROUP\u get\u curve\u GFp
(或
EC\u GROUP\u get\u curve\u GF2m
)、
EC\u GROUP\u get\u order
)和朋友逐个获取域参数,如
curve
G
h

OPENSSL_EC_name_CURVE
是一个标志。您可以使用
EC\u GROUP\u get\u asn1\u flag
获取标志,并使用
flag&OPENSSL\u EC\u NAMED\u CURVE
对其进行测试


在中可以看到命名曲线和非命名曲线的示例。更有可能的是,您将拥有一条命名曲线。在OpenSSL的情况下,省略
OpenSSL_EC_NAMED_CURVE
标志会导致握手失败。

谢谢你的回答,jww。您的意思是get1“在代码片段后的第一段中,在EVP_PKEY*(而不是EC_KEY*)上增加引用计数,对吗?