2016-04-13 32 views
2

öncül truststore: Ben bir sertifika var ve doğrulamak istediğiniz sistem 'güvenir' (Java/İşletim Sistemi tarafından güvenilen bir kök CA tarafından imzalanan) bu sertifika BenJava - sistemle doğrulayarak sertifika

Bunun nasıl gerçekleştirileceğine dair bazı değişken çözümler buldum.

Seçenek 1:

SSL Kullan sınıfları güven türetmek.

TrustManagerFactory tmfactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
tmfactory.init((KeyStore) null); 
for (TrustManager trustManager : tmfactory.getTrustManagers()) { 
    if (trustManager instanceof X509TrustManager) { 
     try { 
      ((X509TrustManager) trustManager).checkClientTrusted(new X509Certificate[] {new JcaX509CertificateConverter().getCertificate(holder)}, "RSA"); 
      System.out.println("This certificate is trusted by a Root CA"); 
     } catch (CertificateException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

bu yaklaşım alternatifler arıyoruz (geçerli projeye göre gerekli değildir) SSL sınıfları dayanır yana

.

Seçenek 2: Java'nın cacerts dosyasını bir anahtar deposuna yükleyin ve her bir 'en güvenilir' sertifikayı sertifikam için eşitlik açısından kontrol edin.

String filename = System.getProperty("java.home") + "/lib/security/cacerts".replace('/', File.separatorChar); 
FileInputStream is = new FileInputStream(filename); 
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); 
String password = "changeit"; 
keystore.load(is, password.toCharArray()); 

// This class retrieves the most-trusted CAs from the keystore 
PKIXParameters params = new PKIXParameters(keystore); 
// Get the set of trust anchors, which contain the most-trusted CA certificates 
Set<X509Certificate> rootCertificates = params.getTrustAnchors().parallelStream().map(TrustAnchor::getTrustedCert).collect(Collectors.toSet()); 
return rootCertificates.contains(holderX509); 

Bu yaklaşımdaki sorun, JKS kodlu dosyanın bütünlüğünü doğrulamak için bir parola gerektirmesidir. SSL görünüşte görünmüyorsa (veya daha çok SSL'ye sıkı sıkıya bağlı olan System.getProperty("javax.net.ssl.trustStorePassword")'u kullanıyor.)

Soru: Bir dosyadan ve saf SSL'den sertifikaları manuel olarak yüklemek arasında bir çözüm var mı? sadece birkaç çemberler üzerinden atlamak zorunda kalmadan bir sertifikanın sistem güvenini teyit edip bazı sınıf olmalıdır.

, muhtemelen başka bir alternatif bir üçüncü taraf kitaplığı indirme
+0

Burada TrustManager'ı kullanmanın yanlış bir tarafı yoktur. Bunun için böyle. Avukatlığınızı aşın. – EJP

cevap

0

David Hook tarafından Java ile başlayan Kriptografi okuduktan sonra ben Bu aynı zamanda gerçekleştirir

CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509", new BouncyCastleProvider()); 
InputStream is = new ByteArrayInputStream(some bytes in an array); 
CertPath certPath = certificateFactory.generateCertPath(is, "PKCS7"); // Throws Certificate Exception when a cert path cannot be generated 
CertPathValidator certPathValidator = CertPathValidator.getInstance("PKIX", new BouncyCastleProvider()); 
PKIXParameters parameters = new PKIXParameters(KeyTool.getCacertsKeyStore()); 

PKIXCertPathValidatorResult validatorResult = (PKIXCertPathValidatorResult) certPathValidator.validate(certPath, parameters); // This will throw a CertPathValidatorException if validation fails 

(Kök CA adlı doğrulamak için sistem truststore kullanarak orijinal hedefi gerçekleştirir) bir sertifika zinciri doğrulamak için aşağıdaki örneği ürettiler SSL sınıfları kullanmak zorunda kalmamanın amacı - bunun yerine Java güvenlik sınıfları/algoritmaları kullanılır.

1

Kısa yoktur .

Neden "SSL" kitaplığından kaçınmaya çalışıyorsunuz? Bu standart kitaplığın bir parçası ve bu nedenle programınıza hiçbir yük getirmiyor.

Her halükarda, sertifika doğrulaması SSL'nin büyük bir parçasıdır. SSL protokolünün bazı önemli alt kümelerini uygulamadan, bunu yapan bir kütüphane oluşturma zahmetine girdiğinden şüpheliyim. Bunu yapmak için hiçbir sebep yok.