2011-10-07 14 views
7

Apache Commons HttpClient kitaplığı (sürüm 3.1), sunucu sertifikasının güvenilen olarak belirlenemediğini (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 atılan istisna tarafından kanıtlandığı gibi) görmezden gelmeye çalışıyorum.Apache Commons HttpClient 3.1 nasıl HTTPS sertifikası geçersizliğini dikkate almaz?

Ben Make a connection to a HTTPS server from Java and ignore the validity of the security certificate yanı sıra Disable Certificate Validation in Java SSL Connections, buldunuz ama ilk kabul cevap birisi aynı iki farklı sürümü nasıl kullanılacağı yönünde beni işaret edebilir sürece, HttpClient 4,0 (ne yazık ki yükseltemezsiniz içindir Aynı proje içindeki kütüphane), another answer with little more than a dead link that supposedly went to a 3.x solution olmasına rağmen. İkinci sayfadaki kodun, biraz ayarlanmış bir sürümünü kullandığımda hiç bir etkisi yok gibi görünüyor (temel olarak, anonim olanları satır içi kullanarak değil de eski moda sınıfları ilan ederek, SSL'a ek olarak TLS örnek kodda olduğu gibi varsayılan HTTPS soket fabrikası için SSL'u kullanarak). (Ve/veya sınıfları ilgili) herhangi HttpClient örneği başka servlet çalışan (değil benim servlet kodu içinde yaratılan bu yüzden

Tercihen, ben parçacığı/örnek çapında olan bir şeyi istiyorum Aynı kapsayıcı), lax sertifikası doğrulama mantığını kullanacaktır, ancak bu noktada, kendinden imzalı sertifikayı geçerli olarak kabul ettiği sürece herhangi bir şey yapacağı gibi hissetmeye başlıyorum.

Evet, güvenlik etkilerinin olduğunu biliyorum, ancak buna neden ihtiyacımın tek nedeni test amaçlıdır. Buradaki fikir, normalde güvenilmeyen sertifikaların güvenilir olup olmadığını denetleyen bir yapılandırma seçeneği uygulamak ve varsayılan olarak "güvenilir olmayan sunucu sertifikalarına güvenme" bölümünde bırakmaktır. Böylelikle, geliştirme aşamasında kolayca açılıp kapatılabilir, ancak üretimde bunu yapmak yoldan çıkmayı gerektirir.

cevap

11

Kendinden imzalı sertifikaları kabul etmek için, özel bir HttpConnection için aşağıdaki kodu commons http istemcisinden kullanırız.

HttpConnection con = new HttpConnection(host, port); 
con.setProtocol(new Protocol("easyhttps", (ProtocolSocketFactory)new EasySSLProtocolSocketFactory(), port)); 

EasySSLProtocolSocketFactory

Contrib SSL paketinde bulunabilir. Ve bu, azaltılmış güvenlik ayarıyla sadece tek bağlantılar yapmak için kullanılabilir.

Protocol easyhttps = new Protocol("https", (ProtocolSocketFactory)new EasySSLProtocolSocketFactory(), 443); 
Protocol.registerProtocol("https", easyhttps); 

HttpClient client = new HttpClient(); 
GetMethod httpget = new GetMethod("https://localhost/"); 
client.executeMethod(httpget); 

Ama bu aynı zamanda diğer servlet gelen bağlantıları etkileyecektir düşünüyorum: Bu da her müşteri için protokol ayarlamak için kullanılabilir gibi burada gösterildiği gibi görünüyor.

[Düzenle] Üzgünüz, bunun sizin için çalışıp çalışmayacağını bilmiyorum. Sadece istemci 3.0.1 ve 3.1 değil kullandığımızı kabul etti.

+0

Evet, 3.1 uyguladığınız Protokol yapıcısını kullanımdan kaldırmış ve görünüşte HttpConnection # setProtocol yöntemine sahip değildir. Yazık, umut verici görünüyordu. :( –

+0

Kurucu ayrıca 3.0.1'de kullanımdan kaldırıldı;) Apache kaynak deposu 'HttpConnection''a göre 3.1'de hala bir“ setProtocol ”yöntemi var: http://svn.apache.org/viewvc/httpcomponents/oac.hc3x /tags/HTTPCLIENT_3_1/src/java/org/apache/commons/httpclient/HttpConnection.java?view=markup – Gandalf

+0

Fabrika, yalnızca bir yayın niteliğindeki "ProtocolSocketFactory" e dönüştürülebilir ve bu nedenle kullanımdan kaldırılan yapıcıyı kaldırırlarsa gerekli değildir Daha sonra, şu anda kullanılmayan kullanım sorumlusu kullanıyor, gönderimi güncelleyeceğim. – Gandalf