我正在使用openssl获取有关x509证书的数据。
有没有一种方法可以将ASN1_INTEGER转换为ASN1_STRING,然后可以轻松地将其转换为char数组?有没有办法将其转换为其他任何人类可读的格式?
编辑:我正在使用为iOS编译的openssl,因为我有iOS项目。这是我用来从证书中提取序列号的代码:
ASN1_INTEGER *serial = X509_get_serialNumber(certificateX509);
long value = ASN1_INTEGER_get(serial);
NSLog(@"Serial %ld", value);
certificateX509
是有效的X509对象,我设法从中获取其他一些字段(发布者名称,有效日期等)编辑2:
我终于找到了一种解决方案,它可能不是最简单的一种:
ASN1_INTEGER *serial = X509_get_serialNumber(certificateX509);
BIGNUM *bnser = ASN1_INTEGER_to_BN(serial, NULL);
int n = BN_num_bytes(bnser);
unsigned char outbuf[n];
int bin = BN_bn2bin(bnser, outbuf);
char *hexbuf = (char*) outbuf;
然后hexBuf包含字符,其值需要读取为十六进制整数才能检索逻辑值。
我使用NSMutableString创建人类可读的字符串:
NSMutableString *str = [[NSMutableString alloc] init];
for (int i=0; i<n; i++) {
NSString *temp = [NSString stringWithFormat:@"%.6x", hexbuf[i]];
[str appendString:[NSString stringWithFormat:@"%@ ", temp]];
}
如果有更简单的方法,我真的很想知道。
最佳答案
使用内置的BN_bn2hex(BIGNUM *)函数可以更轻松地完成ascii十六进制转换
ASN1_INTEGER *serial = X509_get_serialNumber(certificateX509);
BIGNUM *bnser = ASN1_INTEGER_to_BN(serial, NULL);
char *asciiHex = BN_bn2hex(bnser);
关于c - ASN1_INTEGER至ASN1_STRING,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9646929/