2011-10-19 23 views
11

Şu anda pointhq.com'un REST API'sine erişmek için bir java kitaplığı yazıyorum.sertifika zincirlerini anlama konusunda yardıma ihtiyacınız var

Ben özel bir TrustManager yazmış ve benzeri bu yazı açıklandığı pointhq.com sertifikası eklendi böylece SSL sertifika varsayılan olarak kabul edilmez olduğunu fark bir Android istemcisi geliştirirken: Bu Trustmanager ve benim ithal kullanma Trusting all certificates using HttpClient over HTTPS

bks dosyası Bağlanmaya çalışırken aşağıdaki hatayı alıyorum: 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.

Neyi yanlış yaptım? Pointhq.com, rapidssl.com, geotrust.com sertifikalarını içe aktardım. Ama hiçbir şey değişmedi. Farkında olmam gereken bir çeşit sertifika var mı? Kök sertifika eksik mi?

DÜZENLEME: İşte ithal sertifikaların listesi:

Tür: BKS Sağlayıcı: MÖ Girişler: 3

Giriş Alias: Geotrust küresel ca Oluşturma Tarihi: 19.10.2011 15:44: 35 MESZ Tür: Güvenilir Sertifika Sertifikalar: 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 

Giriş Alias: pointhq.com (rapidssl ca) Oluşturma Tarihi: 29.09.2011 18:55:12 MESZ Tür: Güvenilir Sertifika Sertifikalar: 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 

Giriş Alias: rapidssl ca (GeoTrust küresel ca) Oluşturma Tarihi: 29.09.2011 18:54: 49 MESZ Türü: Sertifika Sertifikalar Güvenilen: 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 

Şimdi bir SSL Testi uygulaması yazdım. Sonuçlar kafa karıştırıcı. Ekli ekran görüntülerinde de gördüğünüz gibi, bazen ssl bağlantısı kabul edilir ve bazı zamanlarda değil! Bağlandığım aynı site olsa bile.

https://ssltest12.bbtest.net/ RapidSSL sertifikası için kullanacağım demo sitesidir. Android 2.1'de gördüğünüz gibi ekran görüntüsü ilk bağlantıda kabul edilmiyor ama ikinci denemede gayet iyi çalışıyor, sonuncu tekrar çalışmıyor. Bu nasıl olabilir?

BTW: Android 2.3.3'ten beri RapidSSL sertifikası herhangi bir özel kod olmadan kabul edilir!

Scrennshots:

+0

Ayrıca, aldığınız sertifikaları da gönderebilir misiniz? İsimler uyuşmuyor gibi görünüyor. –

+0

Yapılandırmanız, sertifika zincirinizdeki RapidSSL ara sertifikasını kaçırıyor gibi görünüyor. Zincirliğini TrustManager'da zorlamak için bir yol var mı? – kroonwijk

+0

Kroonwijk hangisinin eksik olması gerekir? Zincirini zorla ne demek istiyorsun? BKS dosyasımda sertifikaların sırası yanlış mıydı? Onları yeniden düzenlemeye çalışacağım ... –

cevap

6

Evet, zincir konuda sertifikaların sırası. Temel olarak sertifikaların sizinkilerden CA'ya gönderilmesini istiyorsunuz. Tarayıcılar sizin için yapar, ancak Java yapmaz.Ben zincirindeki sırasız sertifikalarla sorunu vardı ve ben birlikte X509TrustManager basit bir uygulama yazma sona erdi:

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

    } 
} 

Uyarı sipariş "ise" döngüsü.

+1

Dikkatli olun. Verilen zincirde herhangi bir saçmalık varsa (sunucu sertifikasının eski bir sürümü gibi), yoğun bir döngüde sonlanır. Evet, buna rastladım ... Tarayıcılar ve benzerleri ek sertifikayı göz ardı ettiler. –

+0

Bildiğim kadarıyla, sertifikalar [0] .checkValidity(); 'ortadaki bir saldırıyı önlemek için yeterli değildir, çünkü yalnızca sertifikanın geçerli olduğu zaman aralığını kontrol eder. Sanırım, kontrol, 'de ((sertifikalar! = Null) && (sertifikalar.length == 1)) {' dalında 'standardTrustManager' kullanılarak yapılmalıdır. –

İlgili konular