Tomcat 6 - Windows上的Java代理隧道失败 - 错误 - 407

时间:2016-06-11 00:51:28

标签: java tomcat proxy proxy.pac

我创建了一个处理HTTP代理的类,用于连接远程服务器以进行Web服务。部署在Tomcat 6上,在Windows Server 2008上,并在servlet中调用。

  1. 它与$ CATALINA_HOME \ bin \ tomcat6.exe完美配合,即在cmd上。
  2. 它无法通过Windows服务实用程序进行代理,即$ CATALINA_HOME \ bin \ tomcat6w.exe。
  3. 两者都在读取相同的配置,但在通过代理与远程服务器建立连接时表现不同。

    我找到了几种获取代理设置的方法,如下所示:

    1. Proxy Vole实用工具jar(proxy-vole_20131209.jar)。
    2. java.net.useSystemProxies设置为true并获取代理信息。
    3. 使用Java代码(deploy.jar)阅读PAC。
    4. 传递常量主机名/ IP和端口。
    5. 上述所有工作都与$ 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服务实用程序完成代理。 注意:Windows安全策略: 网络安全:LAN Manager身份验证级别=仅发送NTLM响应

1 个答案:

答案 0 :(得分:0)

如果有人对此问题有任何解决方案,请尽快通知我。 我会打破代码以获得更多理解:

  1. 通过Proxy vole plugin / jar获取代理

     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; 
    }