X509_NAME_oneline返回的免费字符串
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了X509_NAME_oneline返回的免费字符串相关的知识,希望对你有一定的参考价值。
我试图使用一个简单的SSL示例。
这是一些代码:
void ShowCerts(SSL* ssl)
{
X509 *cert;
char *line;
cert = SSL_get_peer_certificate(ssl); /* get the server's certificate */
if ( cert != NULL )
{
printf("Server certificates:
");
line = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0);
printf("Subject: %s
", line);
free(line); /* free the malloc'ed string */
line = X509_NAME_oneline(X509_get_issuer_name(cert), 0, 0);
printf("Issuer: %s
", line);
free(line); /* free the malloc'ed string */
X509_free(cert); /* free the malloc'ed certificate copy */
}
else
printf("No certificates.
");
}
程序在free(line)
代码行中崩溃。没有这些行,该程序可以正常运行而不会崩溃。如果我删除这些行,我担心在这种情况下,某些已分配的资源将不会被释放 - 我该怎么办?
谢谢。
答案
不确定,也许你可以使用:
OPENSSL_free(线);
我只是在我的Windows客户端上使用此代码,它工作正常:)
另一答案
根据http://linux.die.net/man/3/x509_name_oneline中函数X509_NAME_oneline的描述,如果指针line
是NULL
,那么函数将为它动态分配内存。否则,它只返回指针line
。
我想预先分配空间并手动释放。如下:
#define MAX_SIZE 1000
char* line = new char[ MAX_SIZE + 1 ];
printf( "%s
", X509_NAME_oneline( X509_get_subject_name( cert ), line, MAX_SIZE ) );
delete line;
另一答案
我建议你尝试这样的事情:
#define MAX_DN_SIZE 2000 // whatever big enough size here
char line[MAX_DN_SIZE+1];
....
X509_NAME_oneline(X509_get_subject_name(cert), line, MAX_DN_SIZE ); // convert
line[MAX_DN_SIZE] = ' '; // set paranoid terminator in case DN is exactly MAX_DN_SIZE long
并删除'免费'。当然这只会打印你DN的第一个MAX_DN_SIZE字符:)
以上是关于X509_NAME_oneline返回的免费字符串的主要内容,如果未能解决你的问题,请参考以下文章
C# X509Certificate2.Verify 无撤销测试
将 python x509 签名请求对象 (x509.CertificateSigningRequest) 对象转换为字节
symbol X509_get_signature_nid, version libcrypto.so.10 not defined