Java URLConnection NTLM代理身份验证- linux

2ul0zpep  于 2023-06-28  发布在  Java
关注(0)|答案(3)|浏览(97)

我正在尝试通过代理使用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上一切都很好,但这是因为:
JDK-Based NTLM Authentication
当Sun发布JDK的1.4.2版本时,他们在Windows上支持本地NTLM身份验证。
但在配置上:
Red Hat Enterprise Linux Server 6.8版
2019 - 06 - 18 01:00:00

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)

发现此bug描述:JDK-8151788明确表示:
在构建中解决:b128
我是不是漏掉了什么很简单的东西?有没有什么方法可以通过HttpURLConnection来解决这个问题,或者我应该找别的方法?任何建议都很感激!

@编辑

我在getPasswordAuthentication()中添加了日志记录,它似乎从来没有在里面。这让我想到了this主题,实际上NullPointerException已经不存在了。现在我得到了:
java.io.IOException:无法通过代理建立隧道。代理返回“HTTP/1.1 407 authenticationrequired”

vawmfj5a

vawmfj5a1#

build b128是一个Java 9 build,不幸的是它似乎没有移植到Java 8上(我在任何Java 8 bug修复列表中找不到任何NTLM bug,例如http://www.oracle.com/technetwork/java/javase/2col/8u161-bugfixes-4021380.html)也许你可以尝试使用旧的openjdk的ntlm实现运行你的应用程序,它运行得很好。我有一个与我,但我不知道如何发送给你这个jar文件。

m2xkgtsf

m2xkgtsf2#

你可以使用cntlm创建一个代理客户端来连接到NTLM,如以下链接所述:https://medium.com/@mallakimahdi/ntlm-authentication-on-linux-b8124ec0a0b5

pzfprimi

pzfprimi3#

我找到了一点解决我的问题的方法。

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() );

我不觉得这个解决方案有什么好处,但在这个时刻对我来说已经足够了。

相关问题