同时使用SSL加密和NTLM身份验证的HttpClient失败

Pau*_*ulP 5 java ssl ntlm httpclient sharepoint-2010

我正在尝试在使用SSL加密(https)和NTLM身份验证的Sharepoint 2010服务器上进行简单的REST调用。当服务器设置为不需要SSL(仅出于测试目的,服务器将在生产中要求SSL)时,我的NTLM身份验证和后续的REST调用可以使用HttpClient正常运行。但是,启用SSL后,身份验证将不再起作用。

这是SSL处理的代码(设置为接受所有证书):

    SSLContext sslContext = SSLContext.getInstance("TLS");

    // set up a TrustManager that trusts everything
    sslContext.init(null, new TrustManager[] { new X509TrustManager() {
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }

        public void checkClientTrusted(X509Certificate[] certs,
                String authType) { }

        public void checkServerTrusted(X509Certificate[] certs,
                String authType) { }
    } }, new SecureRandom());

    SSLSocketFactory sf = new SSLSocketFactory(sslContext, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

    Scheme httpsScheme = new Scheme("https", 443, sf);
    SchemeRegistry schemeRegistry = new SchemeRegistry();
    schemeRegistry.register(httpsScheme);

    ClientConnectionManager cm = new SingleClientConnManager(schemeRegistry);
Run Code Online (Sandbox Code Playgroud)

接下来是执行NTML和HTTP GET调用的代码:

    HttpParams params = new BasicHttpParams();

    DefaultHttpClient httpclient = new DefaultHttpClient(cm, params);

            // Set up the NTLM credentials
    NTCredentials creds = new NTCredentials(USERNAME, PASSWORD, MACHINE, DOMAIN);
    httpclient.getCredentialsProvider().setCredentials(AuthScope.ANY, creds);

            // Setup the HTTP GET and execute it
    HttpHost target = new HttpHost(HOSTNAME, 443, "https");

    HttpContext localContext = new BasicHttpContext();
    HttpGet httpget = new HttpGet("/site/_vti_bin/ListData.svc/TestList");
    HttpResponse response1 = httpclient.execute(target, httpget, localContext);
Run Code Online (Sandbox Code Playgroud)

我总是得到的答复是:

 HTTP/1.1 400 Bad Request
 The server encountered an error processing the request. See server logs for more details.
Run Code Online (Sandbox Code Playgroud)

请注意,我已经使用FireFox Poster和CURL以编程方式完成此处要尝试的操作,并且效果很好。因此,服务器似乎已正确设置。

谢谢你的时间!

Pau*_*ulP 4

为可能遇到此问题的其他人记录此内容。

问题在于 IIS 服务器设置为允许匿名登录。显然,存在一个错误,如果设置了此项,则与该安装下的共享点实例的任何 REST 或 SOAP 连接都将不会成功。看起来好像字符串“anonymous”被添加到 REST/SOAP URL 中,这当然使其指向不存在的服务。在我们关闭 IIS 实例上允许匿名登录后,调用开始工作。