我有 X.509 证书的颁发者作为字符串表示形式:
"C=UT/O=foobar/OU=foo/serialNumber=0123/CN=TEST ca"
如何使用 C 中的 openssl 将可分辨名称元素从字符串表示形式获取为 DER 编码形式(及其各自的 OID)。
i2d_X509_NAME
是将 openSSL X509_NAME*
对象转换为 DER 格式的函数。
我不知道是否有函数可以将整个“C=UT/O=foobar/OU=foo/serialNumber=0123/CN=TEST ca”字符串直接转换为
X509_NAME*
。
但也许很简单(为了简单起见,缺少错误检查)示例有帮助:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <openssl/pem.h>
int main()
{
unsigned char *buffer = NULL;
X509_NAME *name = X509_NAME_new();
X509_NAME_add_entry_by_txt(name, "O", MBSTRING_UTF8,
(unsigned char*)"Organization", -1, -1, 0);
X509_NAME_add_entry_by_txt(name, "CN", MBSTRING_UTF8,
(unsigned char*)"MyName", -1, -1, 0 );
int len = i2d_X509_NAME(name, &buffer);
fwrite(buffer, len, 1, stdout);
OPENSSL_free(buffer);
X509_NAME_free(name);
return EXIT_SUCCESS;
}
测试:
$ gcc x509_name.c -Wall -o x509_name -lcrypto
$ ./x509_name | hexdump -C
00000000 30 28 31 15 30 13 06 03 55 04 0a 0c 0c 4f 72 67 |0(1.0...U....Org|
00000010 61 6e 69 7a 61 74 69 6f 6e 31 0f 30 0d 06 03 55 |anization1.0...U|
00000020 04 03 0c 06 4d 79 4e 61 6d 65 |....MyName|
0000002a
$