2012-04-04 39 views
5

Tôi đang sử dụng openssl để phân tích chứng chỉ X509. Tôi quản lý để nhận tiện ích, nhưng tôi không biết cách trích xuất giá trị tiện ích.openssl nhận tiện ích mở rộng chứng chỉ

Mã Tôi đang sử dụng là:

X509_EXTENSION *extension = sk_X509_EXTENSION_pop(exts); 
    int critical = X509_EXTENSION_get_critical(extension); 

    ASN1_OBJECT *obj = extension-> object; 
    ln = OBJ_nid2ln(OBJ_obj2nid(obj)); 
    if(!ln) ln = ""; 
    OBJ_obj2txt(objbuf,sizeof(objbuf),obj,1); 
    int nid = OBJ_txt2nid(ln); 

Mã này nói với tôi cho dù phần mở rộng là rất quan trọng hay không và mang lại cho tôi nid của phần mở rộng.

Tôi cho rằng giá trị có thể thu được bằng cách:

ASN1_OCTET_STRING * data = X509_EXTENSION_get_data (phần mở rộng);

nhưng tôi không chắc chắn cách xử lý đối tượng data đã truy lục. Đối tượng dữ liệu được cho là được mã hóa. Bất kỳ ý tưởng nào về cách lấy dữ liệu tiện ích?

EDIT: Như đã đề cập here, tôi đã cố gắng để làm:

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); 

nhưng chuỗi tôi nhận được sau khi giải mã là giống như trước khi nó - cái gì đó như: 4Á˃◊∫NsΣäP∂ W ≠% £ A

+0

Tôi nghĩ rằng một số (các) chứng chỉ mẫu và mã biên dịch tốt, chỉ cần không có hiển thị thích hợp các giá trị tiện ích, sẽ cực kỳ hữu ích. – ThiefMaster

+0

Tôi đang làm một dự án iOS và openssl được biên dịch cho iOS. Tuy nhiên, nếu nó giúp, tôi sẽ thêm một liên kết đến nó. – Maggie

+0

iOS? Bạn có thực sự sử dụng C hay đúng hơn là ObjC? – ThiefMaster

Trả lời

1

Nếu bạn muốn có một biểu diễn văn bản, bạn có thể sử dụng BIO bộ nhớ. Tôi đã trả lời cách thức này cho tiện ích mở rộng Sử dụng khóa trong chuỗi this, nhưng cách thực hiện việc này là giống nhau cho mọi tiện ích mở rộng.

Trân trọng.

+0

BIO thực sự là một tệp, phải không? – Maggie

+1

Theo [link] này (http://www.openssl.org/docs/crypto/bio.html): BIO là một trừu tượng I/O, nó ẩn chứa nhiều chi tiết I/O cơ bản từ một ứng dụng. Nếu một ứng dụng sử dụng một BIO cho I/O của nó, nó có thể xử lý một cách minh bạch các kết nối SSL, các kết nối mạng không được mã hóa và tệp I/O. – Felipe

+1

Nói cách khác, một BIO hoạt động như một luồng dữ liệu tới bất kỳ I/O nào, kể cả chính bộ nhớ. Do đó một BIO bộ nhớ chỉ là một luồng đến hoặc từ bộ nhớ. BIO cũng có thể bị xích cùng với BIO_push() theo cách rất hữu ích, như được giải thích [ở đây] (http://www.openssl.org/docs/crypto/BIO_push.html) – Felipe

1

Điều này rất thú vị. Tôi đã theo dõi cuộc nói chuyện transpire across the link you provided và ở đây, và tôi đồng tình với Roger Dahl trên bình luận của mình trong errata câu trả lời của mình:

Có vẻ như bạn đang tìm kiếm một giải pháp chung về cách giải nén thông tin trong một tiện ích mở rộng x509v3. Vì tiêu đề của câu hỏi này là trạng thái , nó chỉ là về trường hợp đặc biệt giải mã một đơn OCTET STRING. Ngoài ra, tôi chỉ có thể chỉ cho bạn đề xuất ban đầu của @Francois, sử dụng trình phân tích cú pháp ASN.1 bên ngoài, chẳng hạn như SNACC hoặc libtasn1 và để xem mã nguồn OpenSSL (khoảng crypto/asn1/asn1_par .c: 135).

(bổ sung liên kết của tôi.)

Bí quyết là bạn đang cố gắng để làm việc với một mô hình mở rộng phương thức mà không được xử lý tốt quát. This answer cung cấp một cái nhìn tổng quan về cách hoạt động. Đối với phần còn lại của câu trả lời, tôi đồng ý với quan sát của ông rằng nơi các tài liệu thất bại, đọc the source là một cách trung thực giải pháp tốt nhất.

+0

cảm ơn các đề xuất của bạn, tôi đã xem xét SNACC, nhưng bây giờ tôi đang gắn bó với openssl và sử dụng giải pháp Felipe đề xuất. – Maggie

1

Nếu tôi ở vị trí của bạn, tôi sẽ xem xét nghiêm túc việc sử dụng một trong các thư viện ASN.1 chuyên dụng để giải mã chứng chỉ. Hãy để OpenSSL làm những gì nó tốt, để xác nhận chứng chỉ của bạn dựa vào chuỗi tin cậy. Một khi bạn biết rằng bạn có một chứng chỉ tốt, hãy chuyển nó tới một thư viện ASN.1 và để nó xử lý phần còn lại. (SNACC có vẻ tốt.) Lưu ý rằng toàn bộ chứng chỉ được mã hóa với ASN.1, vì vậy cùng một thư viện mà bạn sẽ sử dụng để xử lý các phần mở rộng v3 có thể được sử dụng để xử lý toàn bộ chứng chỉ.

+0

cảm ơn các đề xuất của bạn, tôi đã xem xét SNACC, nhưng bây giờ tôi đang gắn bó với openssl và sử dụng giải pháp Felipe đề xuất. – Maggie

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