Java URLConnection NTLM代理身份验证-linux

Java URLConnection NTLM代理身份验证-linux,java,linux,proxy,ntlm,Java,Linux,Proxy,Ntlm,我正在尝试使用NTLM身份验证通过代理连接到url proxy = new Proxy( Proxy.Type.HTTP, new InetSocketAddress( host, 80 ) ); Authenticator.setDefault(new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() {

我正在尝试使用NTLM身份验证通过代理连接到url

    proxy = new Proxy( Proxy.Type.HTTP, new InetSocketAddress( host, 80 ) );
    Authenticator.setDefault(new Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            logger.info("Getting password authentication...");
            return new PasswordAuthentication(
                    "DOMAIN\\user",
                    "password".toCharArray() ) ;
        }
    });
    connection = (HttpURLConnection) url.openConnection( proxy );
    String credentials = username + ":" + password;
    String basicAuth = "Basic " + Base64.encode( credentials.getBytes() );
    connection.setRequestProperty( "Authorization", basicAuth );
    connection.setRequestMethod( "GET" );

    //username/password above != user/pass below
    String proxyAuth = Base64.encode( ("user:pass").getBytes() );
    proxyAuth = "Basic " + proxyAuth;
    connection.setRequestProperty( "Proxy-Connection", "Keep-Alive" );
    connection.setRequestProperty( "Proxy-Authorization", proxyAuth );

    connection.connect();
在Windows上,一切都可以正常工作,但这是因为:

当Sun发布JDK的1.4.2版本时,他们悄悄地加入了进来 在Windows上支持本机NTLM身份验证

但在配置方面:

Red Hat Enterprise Linux Server 6.8版

java-1.8.0-openjdk-1.8.0.161-3.b14.el6_9.x86_64

java-1.8.0_162 oracle

我收到这个错误:

java.lang.NullPointerException
    at com.sun.security.ntlm.Client.type3(Client.java:161)
    at sun.net.www.protocol.http.ntlm.NTLMAuthentication.buildType3Msg(NTLMAuthentication.java:250)
    at sun.net.www.protocol.http.ntlm.NTLMAuthentication.setHeaders(NTLMAuthentication.java:225)
    at sun.net.www.protocol.http.HttpURLConnection.doTunneling(HttpURLConnection.java:2114)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:183)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:162)
发现了描述的此错误:其中明确说明:

已在内部解决:b128

我是不是错过了一些很简单的东西?有什么方法可以通过HttpURLConnection解决这个问题,或者我应该找些别的方法吗? 任何建议都将不胜感激

@编辑

我在
getPasswordAuthentication()
中添加了日志记录,它似乎从未在内部出现过。 这让我想到了这个主题,实际上NullPointerException已经不存在了。 现在我得到:

java.io.IOException:无法通过代理进行隧道。代理返回“HTTP/1.1 407 authenticationrequired”


构建b128是一个Java9构建,不幸的是它似乎没有移植到Java8上(我在Java8 bug修复列表中找不到任何NTLM bug,例如)
也许你可以试着用一个运行良好的老openjdk的ntlm实现来运行你的应用程序。我随身携带了一个jar文件,但我不确定如何向您发送此jar文件。

我发现解决问题的方法很少

StringBuilder commandBuilder = new StringBuilder();
    commandBuilder.append( "curl -s " )
            .append( "--proxy $PXHOST:$PXPORT " )
            .append( "--proxy-user $PXUSER:$PXPASS " )
            .append( "--user $SNUSER:$SNPASS " )
            .append( "--url \"" ).append( requestURL ).append( "\" " )
            .append( "--request GET " )
            .append( "--header \"Accept:application/json\" " )
            .append( "--header \"Content-Type:application/json\"" );
ProcessBuilder processBuilder = new ProcessBuilder( "/bin/bash", 
            "-c", commandBuilder.toString() );

我觉得这个解决方案不太好,但现在对我来说已经足够了。

您是否检查过ntlm身份验证在没有java的本地机器上工作?您的意思是凭据是否正确?是的,我在其他应用程序中使用此代理。您可以提供tcpdump捕获吗?在这里您可以找到openjdk的实现:。解压缩并使用此存档中的jar文件运行。很抱歉,我无权提供tcpdump,也无法下载您的zip(公司防火墙),但非常感谢您抽出时间;)太可怕了。您是否尝试过使用“我的”ntlm jar文件?以及上面的“字符串生成器”解决方案在哪里?您是否使用ntlm?我在这里再次添加了这个示例。我不会提供支持,如果您需要信息,请先查看。