验证证书时我正在
EVP_F_EVP_PKEY_GET1_DH
我的目标 - 验证证书签名。 我有两张证书: 1. CA证书 2.由CA颁发的证书。 我使用
从CA证书中提取了'RSA公钥(密钥)'模数pPublicKey = X509_get_pubkey(x509);
buf_len = (size_t) BN_num_bytes (bn);
key = (unsigned char *)malloc (buf_len);
n = BN_bn2bin (bn, (unsigned char *) key);
if (n != buf_len)
LOG(ERROR," : key error\n");
if (key[0] & 0x80)
LOG(DEBUG, "00\n");
现在,我有CA公钥& CA密钥长度并且还具有CA在缓冲区中发布的证书,缓冲区长度&公钥。为了验证签名,我有以下代码
int iRet1, iRet2, iRet3, iReason;
iRet1 = EVP_VerifyInit(&md_ctx, EVP_sha1());
iRet2 = EVP_VerifyUpdate(&md_ctx, buf, buflen);
iRet3 = EVP_VerifyFinal(&md_ctx, (const unsigned char *)CAkey, CAkeyLen, pubkey);
iReason = ERR_get_error();
if(ERR_GET_REASON(iReason) == EVP_F_EVP_PKEY_GET1_DH)
{
LOG(ERROR, "EVP_F_EVP_PKEY_GET1_DH\n");
}
LOG(INFO,"EVP_VerifyInit returned %d : EVP_VerifyUpdate returned %d : EVP_VerifyFinal = %d \n", iRet1, iRet2, iRet3);
EVP_MD_CTX_cleanup(&md_ctx);
EVP_PKEY_free(pubkey);
if (iRet3 != 1)
{
LOG(ERROR,"EVP_VerifyFinal() failed\n");
ret = -1;
}
LOG(INFO,"signature is valid\n");
我无法弄清楚会出现什么问题?如果有人遇到同样的问题,请
什么 EVP_F_EVP_PKEY_GET1_DH
错误意味着什么?
先谢谢 - opensid
答案 0 :(得分:1)
X509证书未使用与OpenSSL的信封加密功能相同的方法进行签名,因此EVP_*
是错误的工具。
正确的功能只是X509_verify(x509, X509_get_pubkey(x509))
(对于自签名证书)。
答案 1 :(得分:0)
这是我验证证书的方式:
我将证书存储在我的计算机本地,我加载它然后我自己验证它,因为在我的情况下它是一个自签名证书。如果您有根CA和使用此根证书签名的证书,它应该以相同的方式工作。
int verify_certificate(const char* certfile, const char* CAfile)
{
int ret=0;
X509_STORE *cert_ctx=NULL;
X509_LOOKUP *lookup=NULL;
cert_ctx=X509_STORE_new();
if (cert_ctx == NULL) goto end;
OpenSSL_add_all_algorithms();
lookup=X509_STORE_add_lookup(cert_ctx,X509_LOOKUP_file());
if (lookup == NULL)
goto end;
if(!X509_LOOKUP_load_file(lookup,CAfile,X509_FILETYPE_PEM))
goto end;
lookup=X509_STORE_add_lookup(cert_ctx,X509_LOOKUP_hash_dir());
if (lookup == NULL)
goto end;
X509_LOOKUP_add_dir(lookup,NULL,X509_FILETYPE_DEFAULT);
ret = check(cert_ctx, certfile);
end:
if (cert_ctx != NULL) X509_STORE_free(cert_ctx);
return ret;
}
X509 *load_cert(const char *file)
{
X509 *x=NULL;
BIO *cert;
if ((cert=BIO_new(BIO_s_file())) == NULL)
goto end;
if (BIO_read_filename(cert,file) <= 0)
goto end;
x=PEM_read_bio_X509_AUX(cert,NULL, NULL, NULL);
end:
if (cert != NULL) BIO_free(cert);
return(x);
}
int check(X509_STORE *ctx, const char *file)
{
X509 *x=NULL;
int i=0,ret=0;
X509_STORE_CTX *csc;
x = load_cert(file);
if (x == NULL)
goto end;
csc = X509_STORE_CTX_new();
if (csc == NULL)
goto end;
X509_STORE_set_flags(ctx, 0);
if(!X509_STORE_CTX_init(csc,ctx,x,0))
goto end;
i=X509_verify_cert(csc);
X509_STORE_CTX_free(csc);
ret=0;
end:
ret = (i > 0);
if (x != NULL)
X509_free(x);
return(ret);
}
您所要做的就是实现这3个功能,然后调用:
int verify_certificate(const char* certfile, const char* CAfile)
希望它有所帮助。 最诚挚的问候