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_bn2decBN_bn2hexBN_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的主要内容,如果未能解决你的问题,请参考以下文章

JVM年轻代年老代永久代

JVM : 6 JVM分代模型:年轻代老年代永久代

从初代播种到落地生花,5G商用三周年“催生万物”

广州京东代运营公司经营范围

jvm调优面试怎么答?

post可以直接把get请求代入到目标url中