2016-06-11 112 views
0

我創建了一個處理HTTP代理與遠程服務器進行Web服務連接的類。部署在Windows Server 2008上的Tomcat 6上,並在servlet中調用。Tomcat 6 - Windows上的Java代理隧道失敗 - 錯誤 - 407

  1. 它與$ CATALINA_HOME \ bin \ tomcat6.exe完美協作,即在cmd上。
  2. 它無法通過代理與Windows服務實用程序,即$ CATALINA_HOME \ bin \ tomcat6w.exe。

兩者都讀取相同的配置,但在通過代理建立與遠程服務器的連接時行爲不同。

我發現一些方式來獲得代理設置,如下所示:

  1. 代理田鼠實用JAR(代理vole_20131209.jar)。
  2. java.net.useSystemProxies設置爲true並獲取代理信息。
  3. 用Java代碼讀取PAC(deploy.jar)。
  4. 傳遞常量主機名/ IP和端口。

以及所有與$ CATALINA_HOME \ BIN \ tomcat6.exe,其他則PAC閱讀,因爲它獲取私有IP代替或公網IP上面的工作(當然可以,只要忽略現在我知道確切的主機名和端口)。 注意:我沒有找到代理憑證,它在cmd中也沒有代理憑證。 但是,當我嘗試使用tomcat windows服務實用程序(即$ CATALINA_HOME \ bin \ tomcat6w.exe)運行它時,它無法連接遠程服務器並拋出異常: java.io.IOException:無法通過代理進行隧道傳輸。代理返回「HTTP/1.1 407代理驗證必需」

請找到我的班級,它會逐一重試上述所有情況(PAC跳過)。類的

import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.InetAddress; 
import java.net.InetSocketAddress; 
import java.net.MalformedURLException; 
import java.net.Proxy; 
import java.net.ProxySelector; 
import java.net.SocketAddress; 
import java.net.URI; 
import java.net.URISyntaxException; 
import java.net.URL; 
import java.net.URLConnection; 
import java.security.KeyManagementException; 
import java.security.KeyStore; 
import java.security.KeyStoreException; 
import java.security.NoSuchAlgorithmException; 
import java.security.cert.CertificateException; 
import java.util.ArrayList; 
import java.util.List; 
import javax.net.ssl.SSLContext; 
import javax.net.ssl.TrustManager; 
import javax.net.ssl.TrustManagerFactory; 
import com.btr.proxy.search.ProxySearch; 
import com.btr.proxy.search.ProxySearch.Strategy; 
import com.btr.proxy.util.PlatformUtil; 
import com.btr.proxy.util.PlatformUtil.Platform; 
import com.sun.deploy.net.proxy.BrowserProxyInfo; 
import com.sun.deploy.net.proxy.DummyAutoProxyHandler; 
import com.sun.deploy.net.proxy.ProxyConfigException; 
import com.sun.deploy.net.proxy.ProxyInfo; 
import com.sun.deploy.net.proxy.ProxyType; 

public class ProxyPacManager { 
public static void main(String args[]) throws Exception{ 
    getProxy(); 
} 

public static Proxy getProxy(){ 
    String almProtocol = Constants.getPropereties().getProperty("dashboard.alm.protocol"); 
    String almHost = Constants.getPropereties().getProperty("dashboard.alm.host"); 
    String almPort = Constants.getPropereties().getProperty("dashboard.alm.port"); 
    String urlStr = almProtocol+almHost+":"+almPort; 
    Proxy proxy = null; 
    List<Proxy> proxyList = null; 
    String successMsg = "Proxy not found."; 
    try{ 
     System.out.println("Trying to connect through Proxy Vole plugin."); 
     proxyList = getSSLCertificateAutoProxy(urlStr); 
     proxy = getProxyTested(proxyList, urlStr); 
     successMsg="Successfully connected through Proxy Vole plugin."; 
    } catch(Exception ex){ 
     System.out.println("Proxy Vole plugin didn't work."+ex.getMessage()); 
     try{ 
      System.out.println("Trying to connect through java.net.useSystemProxies Proxy."); 
      proxyList = getSSLCertificateSysProxy(urlStr); 
      proxy = getProxyTested(proxyList, urlStr); 
      successMsg="Successfully connected through java.net.useSystemProxies Proxy."; 
     } catch(Exception ex1){ 
      System.out.println("java.net.useSystemProxies didn't work."+ex1.getMessage()); 
      try{ 
       /*System.out.println("Trying to connect through PAC Proxy."); 
       proxyList = getSSLCertificatePACProxy(urlStr); 
       proxy = getProxyTested(proxyList, urlStr); 
       successMsg="Successfully connected through PAC Proxy.";*/ 
       throw new Exception("Bypass PAC Proxy for testing."); 
      }catch(Exception ex2){ 
       System.out.println("PAC Proxy read didn't work."+ex2.getMessage()); 
       try{ 
        System.out.println("Trying to connect through Constant Proxy."); 
        proxyList = getSSLCertificateConstantProxy(); 
        proxy = getProxyTested(proxyList, urlStr); 
        successMsg="Successfully connected through Constant Proxy."; 
       }catch(Exception ex3){ 
        System.out.println("Constant Proxy read didn't work."+ex3.getMessage()); 
        proxyList = new ArrayList<Proxy>(); 
        proxyList.add(Proxy.NO_PROXY); 
        proxy = getProxyTested(proxyList, urlStr); 
        successMsg = "Connected with NO_PROXY"; 
       } 
      } 
     } 
    } 
    System.out.println(successMsg); 
    return proxy; 
} 

private static Proxy getProxyTested(List<Proxy> proxyList, String urlStr){ 
    if (proxyList != null && !proxyList.isEmpty()) { 
     for (Proxy proxy : proxyList) { 
      SocketAddress address = proxy.address(); 
      if (address instanceof InetSocketAddress) { 
       System.out.println("Trying to connect through proxy: "+((InetSocketAddress) address).getHostName()+":"+((InetSocketAddress) address).getPort()); 
       try { 
        URLConnection connection = new URL(urlStr).openConnection(proxy); 
        connection.connect();    
        System.out.println("Connected through proxy: "+((InetSocketAddress) address).getHostName()+":"+((InetSocketAddress) address).getPort()); 
        return proxy; 
       } catch (MalformedURLException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       }         
      } 
     } 
    } 
    return null; 
} 

private static List<Proxy> getSSLCertificateConstantProxy() throws Exception{ 
    setCertificate(); 
    List<Proxy> proxyList = new ArrayList<Proxy>(); 
    String proxyHost = Constants.getPropereties().getProperty("dashboard.alm.proxy.host"); 
    InetAddress hostIp = InetAddress.getByName(proxyHost); 
    int proxyPort = Integer.parseInt(Constants.getPropereties().getProperty("dashboard.alm.proxy.port")); 

    //Create your proxy and setup authentication for it. 
    Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(hostIp.getHostAddress(), proxyPort));       
    //Setup authentication for your proxy. 
    /*Authenticator.setDefault(new Authenticator() { 

      @Override 
      protected PasswordAuthentication getPasswordAuthentication() { 
      return new PasswordAuthentication("<user>", "<password>".toCharArray()); 
      } 
    });*/ 

    proxyList.add(proxy); 
    return proxyList; 
} 

private static void setCertificate() throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException, KeyManagementException{ 
    //First, load the key store file 
    String jksFile = Constants.getPropereties().getProperty("dashboard.alm.certificate"); 
    InputStream trustStream = new FileInputStream(jksFile); 
    String jksPass = Constants.getPropereties().getProperty("dashboard.alm.certificate.pass"); 
    char[] trustPassword = jksPass.toCharArray(); 

    //Initialize a KeyStore 
    KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
    trustStore.load(trustStream, trustPassword); 

    //Initialize TrustManager objects. 
    TrustManagerFactory trustFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
    trustFactory.init(trustStore); 
    TrustManager[] trustManagers = trustFactory.getTrustManagers(); 

    //Create a new SSLContext, load the TrustManager objects into it and set it as default. 
    SSLContext sslContext = SSLContext.getInstance("SSL"); 
    sslContext.init(null, trustManagers, null); 
    SSLContext.setDefault(sslContext); 
} 
private static ProxyInfo[] getProxyInfo(String urlStr) throws ProxyConfigException, MalformedURLException{  
    String proxypac = Constants.getPropereties().getProperty("dashboard.alm.proxy.pac");   
    BrowserProxyInfo b = new BrowserProxyInfo(); 
    /*WDefaultBrowserProxyConfig wd = new WDefaultBrowserProxyConfig(); 
    BrowserProxyInfo b = wd.getBrowserProxyInfo();  */ 
    b.setType(ProxyType.AUTO); 
    b.setAutoConfigURL(proxypac);  
    DummyAutoProxyHandler handler = new DummyAutoProxyHandler(); 
    handler.init(b); 

    URL url = new URL(urlStr); 
    ProxyInfo[] ps = handler.getProxyInfo(url);  

    return ps; 
} 

public static List<Proxy> getSSLCertificateAutoProxy(String urlStr) throws Exception{   
    setCertificate(); 
    /*ProxySearch proxySearch = ProxySearch.getDefaultProxySearch();*/ 
    ProxySearch proxySearch = new ProxySearch(); 
    proxySearch.setPacCacheSettings(32, 1000*60*5); 
    if (PlatformUtil.getCurrentPlattform() == Platform.WIN) { 
     proxySearch.addStrategy(Strategy.IE); 
     proxySearch.addStrategy(Strategy.FIREFOX); 
     proxySearch.addStrategy(Strategy.JAVA); 
    } else if (PlatformUtil.getCurrentPlattform() == Platform.LINUX) { 
     proxySearch.addStrategy(Strategy.GNOME); 
     proxySearch.addStrategy(Strategy.KDE); 
     proxySearch.addStrategy(Strategy.FIREFOX); 
    } else { 
     proxySearch.addStrategy(Strategy.OS_DEFAULT); 
    }  


    ProxySelector proxySelector = proxySearch.getProxySelector(); 
    /*BufferedProxySelector cachedSelector = new BufferedProxySelector(32, 1000*60*5, proxySelector);*/ 


    ProxySelector.setDefault(proxySelector); 
    //ProxySelector.setDefault(cachedSelector); 
    URI home = URI.create(urlStr); 
    //List<Proxy> proxyList = cachedSelector.select(home); 
    List<Proxy> proxyList = proxySelector.select(home); 
    return proxyList; 
} 

public static List<Proxy> getSSLCertificatePACProxy(String urlStr) throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException, KeyManagementException, ProxyConfigException{ 
    List<Proxy> proxyList = new ArrayList<Proxy>(); 
    setCertificate();  
    ProxyInfo[] ps = getProxyInfo(urlStr);  
    for(ProxyInfo p: ps){ 

     String proxyHost = p.getProxy(); 
     int proxyPort = p.getPort(); 

     //Create your proxy and setup authentication for it. 
     Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));      
     //Setup authentication for your proxy. 
     /*Authenticator.setDefault(new Authenticator() { 

       @Override 
       protected PasswordAuthentication getPasswordAuthentication() { 
       return new PasswordAuthentication("<user>", "<password>".toCharArray()); 
       } 
     });*/ 
     proxyList.add(proxy); 

    } 
    return proxyList; 

} 


public static List<Proxy> getSSLCertificateSysProxy(String urlStr) throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException, KeyManagementException, ProxyConfigException, URISyntaxException{ 
    setCertificate();  
    System.setProperty("java.net.useSystemProxies","true"); 
    List<Proxy> proxyList = ProxySelector.getDefault().select(new URI(urlStr)); 

    return proxyList; 

} 

} 

故障輸出,

Trying to connect through java.net.useSystemProxies Proxy. 
java.net.useSystemProxies didn't work.null 
PAC Proxy read didn't work.Bypass PAC Proxy for testing. 
Trying to connect through Constant Proxy. 
Trying to connect through proxy: XX.XX.XXX.XX:8080 [Masked for security reasons] 
java.io.IOException: Unable to tunnel through proxy. Proxy returns "HTTP/1.1 407 Proxy Authentication Required" 

請幫我通過與Tomcat的6個窗口服務程序的代理得到。 注意:Windows安全策略: 網絡安全:LAN Manager身份驗證級別=僅發送NTLM響應

回答

0

請如果有人有任何問題的解決方案,請儘快通知我。 我會打破代碼爲更多的理解:通過代理田鼠插件/

  1. 獲取代理罐子

    public static List<Proxy> getSSLCertificateAutoProxy(String urlStr) throws Exception{   
    setCertificate(); 
    /*ProxySearch proxySearch = ProxySearch.getDefaultProxySearch();*/ 
    ProxySearch proxySearch = new ProxySearch(); 
    proxySearch.setPacCacheSettings(32, 1000*60*5); 
    if (PlatformUtil.getCurrentPlattform() == Platform.WIN) { 
        proxySearch.addStrategy(Strategy.IE); 
        proxySearch.addStrategy(Strategy.FIREFOX); 
        proxySearch.addStrategy(Strategy.JAVA); 
    } else if (PlatformUtil.getCurrentPlattform() == Platform.LINUX) { 
        proxySearch.addStrategy(Strategy.GNOME); 
        proxySearch.addStrategy(Strategy.KDE); 
        proxySearch.addStrategy(Strategy.FIREFOX); 
    } else { 
        proxySearch.addStrategy(Strategy.OS_DEFAULT); 
    }  
    
    
    ProxySelector proxySelector = proxySearch.getProxySelector(); 
    /*BufferedProxySelector cachedSelector = new BufferedProxySelector(32, 1000*60*5, proxySelector);*/ 
    
    
    ProxySelector.setDefault(proxySelector); 
    //ProxySelector.setDefault(cachedSelector); 
    URI home = URI.create(urlStr); 
    //List<Proxy> proxyList = cachedSelector.select(home); 
    List<Proxy> proxyList = proxySelector.select(home); 
    return proxyList; 
    } 
    
  2. 使用java.net獲取代理。useSystemProxies

    public static List<Proxy> getSSLCertificateSysProxy(String urlStr) throws Exception{ 
    setCertificate();  
    System.setProperty("java.net.useSystemProxies","true"); 
    List<Proxy> proxyList = ProxySelector.getDefault().select(new URI(urlStr)); 
    
    return proxyList; 
    
    } 
    
  3. 從PAC獲取代理:通過直接使已知的代理主機名和端口

    public static List<Proxy> getSSLCertificatePACProxy(String urlStr) throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException, KeyManagementException, ProxyConfigException{ 
    setCertificate();  
    List<Proxy> proxyList = new ArrayList<Proxy>(); 
    String proxypac = "<http://mydomain/proxy.pac>";   
    BrowserProxyInfo b = new BrowserProxyInfo(); 
    /*WDefaultBrowserProxyConfig wd = new WDefaultBrowserProxyConfig(); 
    BrowserProxyInfo b = wd.getBrowserProxyInfo();  */ 
    b.setType(ProxyType.AUTO); 
    b.setAutoConfigURL(proxypac);  
    DummyAutoProxyHandler handler = new DummyAutoProxyHandler(); 
    handler.init(b); 
    
    URL url = new URL(urlStr); 
    ProxyInfo[] ps = handler.getProxyInfo(url); 
    for(ProxyInfo p: ps){ 
    
        String proxyHost = p.getProxy(); 
        int proxyPort = p.getPort(); 
    
        //Create your proxy and setup authentication for it. 
        Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));      
        //Setup authentication for your proxy. 
        /*Authenticator.setDefault(new Authenticator() { 
    
          @Override 
          protected PasswordAuthentication getPasswordAuthentication() { 
          return new PasswordAuthentication("<user>", "<password>".toCharArray()); 
          } 
        });*/ 
        proxyList.add(proxy); 
    
    } 
    return proxyList; 
    
    } 
    
  4. 獲取代理

    private static List<Proxy> getSSLCertificateConstantProxy() throws Exception{ 
    
    setCertificate(); 
    List<Proxy> proxyList = new ArrayList<Proxy>(); 
    String proxyHost = "<myproxy.hostname>"; 
    InetAddress hostIp = InetAddress.getByName(proxyHost); 
    int proxyPort = Integer.parseInt("<myProxyPort>")); 
    
    //Create your proxy and setup authentication for it. 
    Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(hostIp.getHostAddress(), proxyPort));      
    //Setup authentication for your proxy. 
    /*Authenticator.setDefault(new Authenticator() { 
    
         @Override 
         protected PasswordAuthentication getPasswordAuthentication() { 
         return new PasswordAuthentication("<user>", "<password>".toCharArray()); 
         } 
    });*/ 
    
    proxyList.add(proxy); 
    return proxyList; 
    }