2013-04-08 34 views
6

Tôi có thể lấy chủ đề tên thay thế nhưLàm thế nào để lấy tên tổ chức phát hành thay thế cho giấy chứng nhận ssl bằng openssl

X509_NAME_get_text_by_NID(X509_get_subject_name(x), NID_subject_alt_name, hc->https_domain_name, 256) 

Với cùng một phương pháp bằng cách thay đổi 2. tham số để NID_issuer_alt_name Tôi đang mong đợi để có được tên tổ chức phát hành tương tự;

X509_NAME_get_text_by_NID(X509_get_subject_name(x), NID_issuer_alt_name, hc->https_ca_name, 256); 

Nhưng thay vào đó tôi nhận được một chuỗi rỗng. Làm thế nào tôi có thể lấy tên thay thế của tổ chức phát hành một cách chính xác?

+1

Vui lòng kiểm tra xem chứng chỉ đã cho có tên thay thế của tổ chức phát hành hay không. Tôi nghĩ rằng đó là một phần mở rộng. – doptimusprime

+2

Bạn không nên ** sử dụng 'X509_NAME_get_text_by_NID' vì nó bị các thủ thuật' NULL' được nhúng của Marlinspike. Từ tài liệu OpenSSL (không đề cập đến lỗ hổng bảo mật): "' X509_NAME_get_index_by_NID' hoặc 'X509_NAME_get_index_by_OBJ' nên được sử dụng, tiếp theo là' X509_NAME_get_entry' " – jww

+0

Đồng thời xem trang wiki của OpenSSL về [Xác thực tên máy chủ] (https: //wiki.openssl. org/index.php/Hostname_validation). – jww

Trả lời

7

Bạn có thể thử các giải pháp sau đây, theo khuyến cáo trong https://github.com/iSECPartners/ssl-conservatory:

static HostnameValidationResult matches_subject_alternative_name (const char *hostname, const X509 *server_cert) { 
    HostnameValidationResult result = MatchNotFound; 
    int i; 
    int san_names_nb = -1; 
    STACK_OF(GENERAL_NAME) *san_names = NULL; 

    // Try to extract the names within the SAN extension from the certificate 
    san_names = X509_get_ext_d2i((X509 *) server_cert, NID_subject_alt_name, NULL, NULL); 
    if (san_names == NULL) { 
     return NoSANPresent; 
    } 
    san_names_nb = sk_GENERAL_NAME_num(san_names); 

    // Check each name within the extension 
    for (i=0; i<san_names_nb; i++) { 
     const GENERAL_NAME *current_name = sk_GENERAL_NAME_value(san_names, i); 

     if (current_name->type == GEN_DNS) { 
      // Current name is a DNS name, let's check it 
      char *dns_name = (char *) ASN1_STRING_data(current_name->d.dNSName); 

      // Make sure there isn't an embedded NUL character in the DNS name 
      if (ASN1_STRING_length(current_name->d.dNSName) != strlen(dns_name)) { 
       result = MalformedCertificate; 
       break; 
      } 
      else { // Compare expected hostname with the DNS name 
       if (strcasecmp(hostname, dns_name) == 0) { 
        result = MatchFound; 
        break; 
       } 
      } 
     } 
    } 
    sk_GENERAL_NAME_pop_free(san_names, GENERAL_NAME_free); 

    return result; 
} 

Hy vọng nó sẽ giúp!

+0

Khi tôi hiểu điều này là để có được tên thay thế chủ đề. Tôi cần tên thay thế của tổ chức phát hành. –

+0

Cố gắng thay thế 'NID_subject_alt_name' bằng' NID_issuer_alt_name', tôi sẽ cố gắng thực hiện điều này trên PC của tôi ngay bây giờ và xem cách nó hoạt động cho tôi. – Paul

+0

Bạn muốn nói đúng như vậy, X509_get_ext_d2i ((X509 *) server_cert, NID_issuer_alt_name, NULL, NULL). Tôi đã cố gắng vẫn còn chuỗi rỗng nhờ lời khuyên mặc dù. –

0

Trong cuộc gọi của bạn tới X509_NAME_get_text_by_NID với hằng số NID_issuer_alt_name, tôi đã thay thế X509_get_subject_name (x) bằng X509_get_issuer_name (x). Tôi nghĩ rằng điều này nên làm các trick bạn đang sau.

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