2011-03-05 40 views
10

Bir sertifikanın süresi dolduğunda java'nın TrustManager uygulaması yok sayılıyor mu?
Aşağıdakileri denedim:
- keytool ve -startdate "1970/01/01 00:00:00" parametresini kullanarak Süresi dolmuş bir sertifikayla bir P12 anahtar deposu oluşturdum.Geçerli sertifikalardaki Java istemci yöneticisi davranışı

Keystore type: PKCS12 
Keystore provider: SunJSSE 

Your keystore contains 1 entry 

Alias name: fake 
Creation date: 5 ╠ά± 2011 
Entry type: PrivateKeyEntry 
Certificate chain length: 1 
Certificate[1]: 
Owner: CN=Malicious, OU=Mal, O=Mal, L=Fake, ST=GR, C=GR 
Issuer: CN=Malicious, OU=Mal, O=Mal, L=Fake, ST=GR, C=GR 
Serial number: -1c20 
Valid from: Thu Jan 01 00:00:00 EET 1970 until: Fri Jan 02 00:00:00 EET 1970 
Certificate fingerprints: 
     MD5: A9:BE:3A:3D:45:24:1B:4F:3C:9B:2E:02:E3:57:86:11 
     SHA1: 21:9D:E1:04:09:CF:10:58:73:C4:62:3C:46:4C:76:A3:81:56:88:4D 
     Signature algorithm name: SHA1withRSA 
     Version: 3 


******************************************* 

Tomcat için sunucu sertifikasının olarak bu sertifikayı kullandı: -
ben sertifikayı ihraç etti.
Sonra erkek kedi bağlı bir apache'yi HttpClient kullanarak, ancak ilk önce müşterinin güvenini-deposuna süresi bitmiş bir sertifika eklenir (

TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 

bir TrustManager

kullanılarak ve süresi sertifikası yükleme).
Bağlantı başarısız olma bekliyordum.
Bunun yerine bağlantı başarılı. System.setProperty("javax.net.debug", "ssl");
kullanma
görüyorum:

*** 
Found trusted certificate: 
[ 
[ 
    Version: V3 
    Subject: CN=Malicious, OU=Mal, O=Mal, L=Fake, ST=GR, C=GR 
    Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5 

    Key: Sun RSA public key, 1024 bits 
    modulus: 10350555024148635338735220482157687267055139906998169922552357357346372886164908067983097037540922519808845662295379579697361784480052371935565129553860304254832565723373586277732296157572040989796830623403187557540749531267846797324326299709274902019299 
    public exponent: 65537 
    Validity: [From: Thu Jan 01 00:00:00 EET 1970, 
       To: Fri Jan 02 00:00:00 EET 1970] 
    Issuer: CN=Malicious, OU=Mal, O=Mal, L=Fake, ST=GR, C=GR 
    SerialNumber: [ -1c20] 

] 

ben TLS içinde süresi dolmuş sertifika Tomcat bağlayıcı tarafından göndermek olduğunu el sıkışma görüyoruz.
Ancak istemci (örn. TrustManager) bağlantıyı reddetmez.
Varsayılan davranış bu mu?
Son kullanma tarihini kontrol etmek için bir şekilde trustmanager'ı yapılandırmam gerekiyor mu?

GÜNCELLEME:
Ben kullanılan gerçek TrustManager X509TrustManagerImpl olduğunu gördük. Burada X509TrustManagerImpl bu sınıfın minimal bir mantığa sahip olduğunu söylüyor. Yanlış TrustManager'ı kullanıyorum mı?

Update2: Bir sertifika yolunu inşa eş tarafından sağlanan kısmi veya tam sertifika zinciri göz önüne alındığında sertifika sona erme

void checkServerTrusted(X509Certificate[] chain,String authType) 
           throws CertificateException 

için kontrol ederse javadoc X509TrustManager itibaren net değil güvenilen köke geri dönüp doğrulanmışsa ve sunucu için güvenilir güvenilen kimlik doğrulaması numaralı SSL kimlik doğrulaması ation type.The kimlik doğrulaması türü, "RSA", "DHE_DSS" gibi bir String olarak gösterilen şifre takımları anahtar değiştirme algoritmasıdır. Not: Bazı ihraç edilebilir şifre setleri için, değiştirme algoritması, el sıkışması sırasında çalışma zamanında belirlenir. Örneğin, TLS_RSA_EXPORT_WITH_RC4_40_MD5 için, AuthType bir geçici RSA anahtarı değişimi için kullanılan ve RSA anahtar sunucu sertifikası kullanıldığında RSA_EXPORT zaman olmalıdır. Denetleme, büyük/küçük harfe duyarlıdır.

Teşekkür

+0

Tomact onay sertifikasının geçerlilik süresini uzatma konusunda herhangi bir çözüm buldunuz mu? Var olan herhangi bir diğer 'X509TrustManager' uygulaması? – Andremoniy

+1

@Andremoniy: Kendi özel güven yöneticinizi yazmanız gerekiyor – Cratylus

cevap

1

Ben senin örneğini deneyin vermedi, ama şimdi ben düzenli olarak sertifikalar oldukça kısa geçerlilik süreleri sebebiyle (geliştirme sunucusu için) benim sunucu sertifikaları yeniden zorundayız.

Bizim örneğimizde, istemcinin sunucu sertifikaları kendisinde değil, yalnızca CA sertifikamız (daha uzun geçerlilik ile) ve istemci sunucuya bağlanmaya çalıştığında, her iki taraf bir SSLException alır (Sizin durumunuzda başka bir istisna ile sarılmış olabilir).

Güven yöneticisinin "güvenmek için zaman aşımına uğramış sertifikalar verirseniz, yapacağım" gibi bir şey varsaydığını tahmin ediyorum. Bunun yerine yaklaşımımızı deneyin (ayrıca sunucu sertifikasının her dolduğu zaman istemciyi güncellemenizi de sağlar).

+1

@Paulo: 1) Yalnızca CA sertifikasını saklarsınız. İstemcinin geçerlilik süresi sona ermiş bir sertifika alması durumunda (CA'nız tarafından imzalanmışsa) trustmanager bunu reddeder mi? 2) Önerdiğiniz şey adil, ama benim bakış açımdan, eğer bu güven-yöneticisinin varsayılan davranışıysa, en azından gariptir. Eğer sertifika 10 saat önce sona ermişse, Trustmanager bunu güvenilir olarak kabul ederdi, çünkü zaten güvendedir? Bu doğru bir davranış değil bence – Cratylus

+0

1) evet, bu benim gözlemim. 2) için, bunun amaçlanan bir davranış mı yoksa bir hata mı olduğu konusunda emin değilim, hem sizin hem de gözlemlerimi nasıl açıklayacağımı bir tahmin. –

+0

@Paulo: Kullanılan TrustManager'ın 'X509TrustManagerImpl' olduğunu buldum. Burada http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Modules-sun/security/sun/security/ssl/X509TrustManagerImpl.java.java-doc.htm bu sınıfın minimal mantık.Yani yanlış TrustManager kullanıyorum? – Cratylus

2

IBM'in JSSE'sinin, Sun'ın yapamadığı süre dolduğunu kontrol ettiğine inanıyorum.

+0

Bunun bir hata olduğunu mu düşünüyorsunuz yoksa SUN'ta böyle mi tasarladılar? Benim bakış açımdan, davranış en azından karşı sezgiseldir. – Cratylus

+0

Kasıtlı görünüyor. Niyetin önemli olduğunu düşündüğünüzde, bir el sıkışma dinleyicisinde kendinize bir son kullanmadığınızı düşünüyorum. – EJP

5

checkServerTrusted'u geçersiz kılarken kendim de benzer bir sorunla karşılaştım.

Son kullanma tarihini kontrol etmeniz gerekirse, X509Certificate.checkValidity() numaralı telefonu arayabilir ve bir CertificateExpiredException veya CertificateNotYetValidException atar. Bunların ikisi de CertificateException'ı genişletir, böylece checkServerTrusted tarafından mutlu bir şekilde atılabilir.

sen onun kurucu orijinal örneğini oluşturur Yeni X509TrustManager uygulamak sorunu çözmek için, orijinal örneğine çağrılar gibi tüm yöntemleri uygular ve checkServerTrustedcerts[] her sertifika için checkValidity bir çağrı ekler.