SORU
13 Mayıs 2009, ÇARŞAMBA


Nasıl bir Java HttpsURLConnection ile kendinden imzalı bir sertifika kabul ediyorsunuz?

Büyük Java uygulaması için ekliyorum bir modülü başka bir şirketin SSL güvenli Web sitesi ile sohbet etti. Sorun site otomatik olarak imzalanan bir sertifika kullanır. Elimde bir kopyası var sertifikayı doğrulamak için değilim karşılaşmış bir man-in-the-middle saldırısı, ve ben dahil bu sertifika içine kodumuzu şekilde sunucuya bağlantı başarılı olacaktır.

Burada temel kod:

void sendRequest(String dataPacket) {
  String urlStr = "https://host.example.com/";
  URL url = new URL(urlStr);
  HttpURLConnection conn = (HttpURLConnection)url.openConnection();
  conn.setMethod("POST");
  conn.setRequestProperty("Content-Length", data.length());
  conn.setDoOutput(true);
  OutputStreamWriter o = new OutputStreamWriter(conn.getOutputStream());
  o.write(data);
  o.flush();
}

Kendinden imzalı bir sertifika için bir yerde herhangi bir ek işleme olmadan bu dümende ölür.() getOutputStream aşağıdaki hariç:

Exception in thread "main" javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
....
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
....
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

İdeal olarak, benim kod bu, kabul edilmesi için kendinden imzalı bir sertifika, uygulamada bu bir Java spot, Ve başka hiçbir yerde öğretmesi lazım.

Bu TOTEM sertifika yetkilisi deposuna sertifika almak biliyorum, Ve bunu kabul etmek Java izin verir. O değil bir yaklaşım almak istiyorum eğer yardım edebilirim; öyle görünüyor ki çok invaziv yapmak tüm müşterilerimizin makineler için bir modül olmayabilir kullanın; bu etkiler tüm diğer Java uygulamaları kullanarak aynı TOTEM, ve bu benim hoşuma gitmiyor olsa da bu oran başka herhangi bir Java uygulaması bugüne kadar erişen bu site yoktur. Ayrıca önemsiz bir ameliyat değil: UNIX erişim haklarını elde etmek için bu şekilde. bu TOTEM değiştirmek zorundayım

Bazı özel denetimi yapan TrustManager bir örnek yaratmak da gördüm. Hatta bu sertifika dışındaki tüm durumlarda gerçek TrustManager için delegeler bir TrustManager oluşturmak mümkün olabilir gibi görünüyor. Ama bu TrustManager küresel yüklü alır gibi görünüyor, ve sanırım bizim uygulama tüm diğer bağlantılar etkileyecek, ve bu çok doğru bence de kokmuyor.

Kendinden imzalı bir sertifika kabul etmek için bir Java uygulaması ayarlamak için tercih edilen, standart, ya da en iyi yolu nedir? Akılda yukarıdaki tüm başarabilir miyim, ya da ödün vermek zorunda kalacak mıyım? Bir seçenek dosyalar ve dizinler ve ilgili yapılandırma ayarları, ve küçük-için-herhangi bir kodu var mı?

CEVAP
13 Mayıs 2009, ÇARŞAMBA


SSLSocket Bir fabrika oluşturmak kendinizi ve bağlamadan önce HttpsURLConnection üzerinde ayarlayın.

...
HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();
conn.setSSLSocketFactory(sslFactory);
conn.setMethod("POST");
...

11 ** Bir tane oluşturun ve bunu etrafında tutmak için isteyeceksiniz. İşte bunu başlatmak için nasıl bir çizim:

/* Load the keyStore that includes self-signed cert as a "trusted" entry. */
KeyStore keyStore = ... 
TrustManagerFactory tmf = 
  TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(keyStore);
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null, tmf.getTrustManagers(), null);
sslFactory = ctx.getSocketFactory();

Eğer anahtar deposu oluşturmak için yardıma ihtiyacınız varsa, yorum lütfen.

< / ^ hr .

İşte anahtar deposunda yükleme bir örnek:

KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(trustStore, trustStorePassword);
trustStore.close();

PEM formatında bir sertifika ile anahtar deposu oluşturmak için, kendi kodu CertificateFactory kullanarak yazma veya sadece alma ile İLGİLENİYORUZ (keytool. keytool ile yapabilirsiniz ^em>olmazbir iş "anahtar girişi", ama sadece bir iyi vardır "güvenli giriş").

keytool -import -file selfsigned.pem -alias server -keystore server.jks

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Richard Laxa

    Richard Laxa

    30 AĞUSTOS 2012
  • RickardRick

    RickardRick

    9 Mart 2007
  • theavettbrothers

    theavettbrot

    9 ŞUBAT 2007