ASN1_INTEGER到ASN1_STRING
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ASN1_INTEGER到ASN1_STRING相关的知识,希望对你有一定的参考价值。
我使用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);
一种可能性是您可以将ASN1_INTEGER的值提取为普通的C整数:
#include <openssl/asn1.h>
#include <stdio.h>
int main(int argc, char** argv) {
long value;
ASN1_INTEGER asn1int = {0};
ASN1_INTEGER_set(&asn1int, 42);
value = ASN1_INTEGER_get(&asn1int);
printf("The value is %ld.
", value);
return 0;
}
编译如下:
gcc -Wall -o sploots sploots.c -lcrypto
这会产生输出:
The value is 42.
要将值作为char数组中的字符串,请使用snprintf
。
我怀疑还有可能使用BIO打印例程将值转储到某种BIO(可能是内存BIO)。但是,这种方法似乎更简单。
我得出这个答案的方式是我查看了ASN1_INTEGER的OpenSSL头文件。在寻找适合基于BIO的解决方案的API之后,我注意到了ASN1_INTEGER_get函数。
在OpenSSL头文件中查看通常是我学习如何使用OpenSSL的方式,因为大部分API都没有记录,或者记录不正确或不完整。
我终于找到了一个解决方案,这可能不是最简单的解决方案:
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]];
}
如果你只想要一个可读的NSString,BN_bn2dec
比BN_bn2hex
或BN_bn2bin
更有用。
无需使用十六进制编码。
这是我的方式,在iOS / ObjC中,使用pod 'OpenSSL-Universal', '1.0.2.10'
:
ASN1_INTEGER *serialAsn1 = X509_get_serialNumber(certX509);
BIGNUM *serialBigNumber = ASN1_INTEGER_to_BN(serialAsn1, NULL);
char *serialChar = BN_bn2dec(serialBigNumber);
NSString *serialString = [NSString stringWithCString:(const char *) serialChar
encoding:NSUTF8StringEncoding];
干杯。
以上是关于ASN1_INTEGER到ASN1_STRING的主要内容,如果未能解决你的问题,请参考以下文章