2016-02-12 11 views
6

Oracle belgelerinin, Java 8'in SNI'yi otomatik olarak ve varsayılan olarak gönderdiği belirtiliyor. Wireshark aksini gösterir. Ben bir Java geliştiricisi değil, bir PowerShell sysadmin'im.Java 8'de, sunucu adı gösterimi (SNI) göndermek için HttpsURLConnection yapılabilir.

Uygun güven anahtar deposu ile kullanıldığında, aşağıdaki kod, SNI gerektirmeyen tüm SSL web sitelerinden 200 durumunu döndürür. Ayrıca, birden çok ana bilgisayarlı bir Apache sunucusunun varsayılan SSL web sitesine bağlanırken de iyi döner. Varsayılan olmayan bir siteye bağlanmanız istendiğinde, varsayılan siteye bağlandığından, site adıyla eşleşmeyen sertifika adı için başarısız olur.

import java.util.*; 
import java.net.*; 
import javax.net.ssl.*; 
import java.io.*; 

public class testJavaHttpConn { 
    public static void main(String[] args) throws Exception { 
     String strUrl = args[0]; 
     System.out.println("Trying to connect to " + strUrl); 
     try { 
      URL url = new URL(strUrl); 
      HttpsURLConnection urlConn = (HttpsURLConnection) url.openConnection(); 
      System.out.println("Connecting"); 
      urlConn.connect(); 
      System.out.println("Done"); 
      System.out.println("Response " + urlConn.getResponseCode()); 
     } catch (IOException e) { 
      System.err.println("Error creating HTTP connection"); 
      e.printStackTrace(); 
      throw e; 
     } 
    } 
} 

Ben ettik değil seti System.setProperty ("jsse.enableSNIExtension", "sahte"); -Djavax.net.debug = ssl'yi ayarladığımda, sunucu adı uzantısının ayarlanmadığını açıkça gösterir.

Bir SSLSocket uygulayabildiğimden ve bir sonraki daha derin soyutlama katmanına dalmaya istekliysem SSLParameter serverName'i ayarlayabildiğimin farkındayım, ancak bundan kaçınmak istiyorum.

Düzenleme: Kod, Flo için yorumlarda yukarıda yazılı olarak çalışır. Linux 2.6.18-194.11.3.el5 üzerinde 1.8.0_72 ve Windows 7'de 1.8.0_51 ile benim için başarısız oluyor. Linux yüklemesi urandom değerini securerandom.source = dosyasına güncellerken Windows kurulumu vanilyadır: /dev/./urandom. Kurulumlarımın neyin Flo'lardan farklı olduğunu nasıl belirleyebileceğimi bilmiyorum.

+0

Yani dışındaki yöntemlerle aradığınız [burada belgelenmiştir] (https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#SNIExtension)? –

+0

Cehalet tarafından sınırlandırıldım. SSLSocket kullanan kod parçacıkları, önceki ve sonraki tüm öğeleri oluşturma bilgisini varsayar ve ben buna sahip değilim. Bağlantının nasıl gerçekleştirileceğini ve SSLSocket kullanarak nasıl alınacağını ve çıktıyı aynı nesne HttpURLConnection döndürülerine dönüştürdüğünü gösteren bir örnek bulamadım. Bu parçacıkların başına bu nesneleri inşa ettim, ancak onlara sahip olduğumda onlarla hiçbir şey yapamam. Benim cehalet göz önüne alındığında ben HttpsURLConnection SNI göndermek için neden bir yere basit bir özellik bakan olup olmadığını sormak akıllıca görünüyordu. Cevabınız hayır ise, o zaman SSLSocket olur. – codepoke

+1

Kodunuzu "https://sni.velox.ch" kullanarak test ettim ve debug "Extension server_name, server_name: [type = host_name (0), value = sni.velox.ch]' diyor. Durum 200 ile sonuçlanır. 'System.setProperty (" jsse.enableSNIExtension "," false ") ile bir hata alıyorum (beklendiği gibi) ve hata ayıklamada eksik. Sistem: Ubuntu Linux, Java 1.8.0_72 (fakat aynı zamanda 1.7.0_95 ile çalıştı). Ne yazık ki senin için bir çözümüm yok. – flo

cevap

3

HttpsURLConnection IFF varsayılan olarak ve kutunun dışına o bağlandığını hangi bir tam adıdır URL SNI gönderiyor. Yerel intranet kısa adı takma adları için SNI göndermez.

Extension server_name, server_name: [type=host_name (0), value=site.company.com] 

(Kayıt için, ben de kısa ve tam nitelikli adları için SAN kullanan yeni bir sertifika dağıtmak için gerekli, ama bu önemsiz oldu.)

İlgili konular