2011-10-19 36 views
11

Hiện tại tôi đang viết thư viện java để truy cập API REST của pointhq.com.cần trợ giúp tìm hiểu chuỗi chứng chỉ

Trong khi phát triển một khách hàng Android tôi nhận ra rằng chứng chỉ SSL không được chấp nhận theo mặc định vì vậy tôi đã viết một TrustManager tùy chỉnh và bổ sung giấy chứng nhận pointhq.com như giải thích trong bài này: Trusting all certificates using HttpClient over HTTPS

Sử dụng Trustmanager này và nhập khẩu của tôi bks file Tôi nhận được lỗi sau trong khi cố gắng kết nối: IssuerName(CN=GeoTrust Global CA, O=GeoTrust Inc., C=US) does not match SubjectName(CN=RapidSSL CA, O="GeoTrust, Inc.", C=US) of signing certificate.

Vì vậy, tôi đã làm gì sai? Tôi đã nhập chứng chỉ pointhq.com, rapidssl.com, geotrust.com. Nhưng không có gì thay đổi. Có một loại giấy chứng nhận nào mà tôi phải biết không? Tôi có thiếu chứng chỉ gốc không?

EDIT: Dưới đây là danh sách các giấy chứng nhận nhập khẩu:

Loại: BKS Provider: BC Entries: 3

nhập Bí danh: GeoTrust toàn cầu ca Creation Date: 19.10.2011 15:44: 35 MESZ Loại: Trusted Giấy chứng nhận Chứng chỉ: 1

Certificate 1 of 1 
Version: 3 
Subject: CN=GeoTrust Global CA, O=GeoTrust Inc., C=US 
Issuer: CN=GeoTrust Global CA, O=GeoTrust Inc., C=US 
Serial Number: 0002 3456 
Valid From: 21.05.2002 06:00:00 
Valid Until: 21.05.2022 06:00:00 
Public Key: RSA (2.048 bits) 
Signature Algorithm: SHA1withRSA 
SHA-1 Fingerprint: DE:28:F4:A4:FF:E5:B9:2F:A3:C5:03:D1:A3:49:A7:F9:96:2A:82:12 
MD5 Fingerprint: F7:75:AB:29:FB:51:4E:B7:77:5E:FF:05:3C:99:8E:F5 

nhập Bí danh: pointhq.com (RapidSSL ca)NgàyCreation: 2011/09/29 18:55:12 MESZ Loại: Trusted Giấy chứng nhận Chứng chỉ: 1

Certificate 1 of 1 
Version: 3 
Subject: CN=pointhq.com, OU=Domain Control Validated - RapidSSL(R), OU=See www.rapidssl.com/resources/cps (c)11, OU=GT70151377, O=pointhq.com, C=GB, SERIALNUMBER=8Dvj7qRSYLjGZiX2tHocE2FDaqAp8RwO 
Issuer: CN=RapidSSL CA, O="GeoTrust, Inc.", C=US 
Serial Number: 8971 
Valid From: 31.01.2011 13:20:09 
Valid Until: 03.02.2013 09:15:38 
Public Key: RSA (2.048 bits) 
Signature Algorithm: SHA1withRSA 
SHA-1 Fingerprint: BB:04:D0:3E:1A:36:02:F7:C3:8C:85:99:1D:67:2A:6B:CF:C1:BC:C5 
MD5 Fingerprint: 21:9D:DF:72:E6:4A:33:47:E1:BA:D6:52:86:1E:59:B4 

nhập Bí danh: RapidSSL ca (GeoTrust ca toàn cầu) Creation Date: 2011/09/29 18:54: 49 MESZ Loại: Trusted Giấy chứng nhận Chứng chỉ: 1

Certificate 1 of 1 
Version: 3 
Subject: CN=RapidSSL CA, O="GeoTrust, Inc.", C=US 
Issuer: CN=GeoTrust Global CA, O=GeoTrust Inc., C=US 
Serial Number: 0002 36D1 
Valid From: 19.02.2010 23:45:05 
Valid Until: 18.02.2020 23:45:05 
Public Key: RSA (2.048 bits) 
Signature Algorithm: SHA1withRSA 
SHA-1 Fingerprint: C0:39:A3:26:9E:E4:B8:E8:2D:00:C5:3F:A7:97:B5:A1:9E:83:6F:47 
MD5 Fingerprint: 1B:EE:28:5E:8F:F8:08:5F:79:CC:60:8B:92:99:A4:53 

bây giờ tôi đã viết một ứng dụng SSL thử nghiệm. Kết quả là khó hiểu. Như bạn có thể thấy trên các ảnh chụp màn hình đính kèm, đôi khi kết nối ssl được chấp nhận và một số lần nó không được! Ngay cả khi đó là trang web tôi đang kết nối.

https://ssltest12.bbtest.net/ là trang web demo cho chứng chỉ RapidSSL Tôi phải sử dụng những gì. Như bạn có thể thấy trên Ảnh chụp màn hình Android 2.1, kết nối đầu tiên nhận được không được chấp nhận nhưng lần thử thứ hai hoạt động hoàn toàn tốt, trong khi lần cuối không hoạt động lại. Làm thế nào điều đó có thể xảy ra?

BTW: Kể từ Android 2.3.3 chứng chỉ RapidSSL được chấp nhận mà không có bất kỳ mã tùy chỉnh nào!

Scrennshots:

+0

Bạn cũng có thể đăng các chứng chỉ bạn đã nhập không? Có vẻ như tên không khớp. –

+0

Cấu hình của bạn dường như bỏ lỡ chứng chỉ trung gian RapidSSL trong chuỗi chứng chỉ của bạn. Có cách nào để buộc chuỗi của bạn trong TrustManager không? – kroonwijk

+0

@kroonwijk cái nào nên bị thiếu? Bạn có ý gì với "buộc chuỗi của bạn"? Tôi nghĩ rằng có thể thứ tự của các chứng chỉ là sai trong tập tin BKS của tôi? Tôi sẽ cố gắng sắp xếp lại chúng ... –

Trả lời

6

Vâng, thứ tự của giấy chứng nhận trong vấn đề chuỗi. Về cơ bản bạn muốn chứng chỉ được đánh giá từ bạn đến CA. Trình duyệt làm điều đó cho bạn, nhưng Java thì không.Tôi đã có vấn đề với chứng chỉ có thứ tự trong chuỗi và tôi đã kết thúc viết một thực hiện đơn giản của X509TrustManager với:

public void checkServerTrusted(X509Certificate[] certificates,String authType) throws CertificateException { 
    if ((certificates != null) && LOG.isDebugEnabled()) { 
     LOG.debug("Server certificate chain:"); 
     for (int i = 0; i < certificates.length; i++) { 
      LOG.debug("X509Certificate[" + i + "]=" + certificates[i]); 
     } 
    } 
    if ((certificates != null) && (certificates.length == 1)) { 
     certificates[0].checkValidity(); 
    } else { 
     List<X509Certificate> certs = new ArrayList<X509Certificate>(); 
     certs.addAll(Arrays.asList(certificates)); 
     X509Certificate certChain = certs.get(0); 
     certs.remove(certChain); 
     LinkedList<X509Certificate> chainList= new LinkedList<X509Certificate>(); 
     chainList.add(certChain); 
     Principal certIssuer = certChain.getIssuerDN(); 
     Principal certSubject = certChain.getSubjectDN(); 
     while(!certs.isEmpty()){ 
      List<X509Certificate> tempcerts = new ArrayList<X509Certificate>(); 
      tempcerts.addAll(certs); 
      for (X509Certificate cert : tempcerts){ 
       if(cert.getIssuerDN().equals(certSubject)){ 
        chainList.addFirst(cert); 
        certSubject = cert.getSubjectDN(); 
        certs.remove(cert); 
        continue; 
       } 

       if(cert.getSubjectDN().equals(certIssuer)){ 
        chainList.addLast(cert); 
        certIssuer = cert.getIssuerDN(); 
        certs.remove(cert); 
        continue; 
       } 
      } 
     } 
    standardTrustManager.checkServerTrusted(chainList.toArray(new X509Certificate[]{}),authType); 

    } 
} 

Thông báo đặt hàng "trong khi" chu kỳ.

+1

Hãy cẩn thận. Điều này kết thúc trong một vòng lặp bận rộn, nếu bạn có bất kỳ nhảm nhí trong chuỗi cung cấp (giống như một phiên bản cũ hơn của chứng chỉ máy chủ). Có, tôi chạy vào đó ... Các trình duyệt và những thứ tương tự đã bỏ qua chứng chỉ bổ sung. –

+0

Theo như tôi biết, 'certificate [0] .checkValidity();' là không đủ để ngăn chặn một cuộc tấn công man-in-the-middle, bởi vì nó chỉ kiểm tra khoảng thời gian chứng chỉ hợp lệ. Tôi đoán kiểm tra nên được thực hiện bằng cách sử dụng 'standardTrustManager', quá, trên' if ((giấy chứng nhận! = Null) && (certificates.length == 1)) {'chi nhánh. –

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