2011-09-07 63 views
8

Sử dụng API OpenSSL, tôi đã trích ra một phần mở rộng tùy chỉnh từ một chứng chỉ X.509v3 với:Giải mã một ASN.1 DER OCTET STRING với OpenSSL

X509_EXTENSION* ex = X509_get_ext(x509, 4); 

Đối tượng X509_EXTENSION chứa một giá trị (ex- > giá trị) là một ASN.1 OCTET STRING. OCTET STRING chứa chuỗi UTF-8 được mã hóa DER. Tôi đang cố gắng giải mã OCTET STRING để nhận được chuỗi UTF-8 thuần túy.

Tôi đã thử một vài điều, chẳng hạn như:

ASN1_STRING_to_UTF8(&buf, ex->value); 

M_ASN1_OCTET_STRING_print(bio, ex->value); 
int len = BIO_read(bio, buf, buf_size); 
buf[len] = '\0'; 

Những cả cho tôi chuỗi DER mã hóa. Làm cách nào để nhận được chuỗi UTF-8 thuần túy?

+0

Tôi đã sử dụng 'asn1_get_object' để thực hiện việc này trong khi trước, theo ví dụ trong mã openssl (xung quanh crypto/asn1/asn1_par.c: 135). Thật là đau đớn khi giải mã một cấu trúc lớn theo cách này mà tôi khuyên bạn nên sử dụng một trình phân tích cú pháp asn1 thay thế như SNACC hoặc libtasn1. – Francois

+0

@Francois: Cảm ơn bạn về mẹo. Vì tôi không cố gắng giải mã một cấu trúc lớn, chỉ là một chuỗi duy nhất, ASN1_get_object() có thể là đủ. Tuy nhiên, tôi đã cố gắng sử dụng nó, dựa trên cách nó được sử dụng trong asn1_par.c, nhưng không thể làm cho nó hoạt động. Bạn có thể cung cấp một ví dụ? –

+0

@Francois: Tôi đã tìm hiểu cách sử dụng hàm và đăng câu trả lời dựa trên đó. Cảm ơn một lần nữa. –

Trả lời

5

@Francois chỉ cho tôi chức năng ASN1_get_object(). Hàm đó thích hợp cho trường hợp này, trong đó phần mở rộng chứng chỉ chỉ chứa một giá trị duy nhất.

ASN1_get_object() lấy con trỏ tới con trỏ tới bộ đệm C chứa đối tượng được mã hóa DER. Nó trả về chính dữ liệu (bằng cách điều chỉnh con trỏ), độ dài của dữ liệu, giá trị thẻ ASN.1 và lớp đối tượng ASN.1.

ASN1_OCTET_STRING* octet_str = X509_EXTENSION_get_data(extension); 
const unsigned char* octet_str_data = octet_str->data; 
long xlen; 
int tag, xclass; 
int ret = ASN1_get_object(&octet_str_data, &xlen, &tag, &xclass, octet_str->length); 
printf("value: %s\n", octet_str_data); 
+0

Tôi đã cố gắng để làm điều tương tự, nhưng khi áp dụng giải pháp của bạn, tôi nhận được cùng một chuỗi như trước khi gọi hàm ASN1_get_object. Bạn có chắc chắn chức năng này der giải mã? – Maggie

+0

@Maggie: Đối với loại ASN.1 mà tôi đang xử lý, 'OCTET STRING', nó hoạt động. Nhưng nó có thể là nó hoạt động bởi vì điều duy nhất mà mã hóa DER thực hiện cho một 'OCTET STRING' là kết thúc nó với một tiêu đề. Các byte tự giữ nguyên. ASN1_get_object() không loại bỏ tiêu đề, nhưng có lẽ đó là * tất cả * nó? –

+0

như tôi đã nói, tôi đang làm điều tương tự EXACT, nghĩa là. cố gắng để có được giá trị con người có thể đọc được của phần mở rộng chứng chỉ được mã hóa bằng cách sử dụng openssl. giải pháp bạn cung cấp không hoạt động. – Maggie

Các vấn đề liên quan