2012-03-15 4 views
3

SSL暗号化(https)とNTLM認証を使用するSharepoint 2010サーバーで簡単なREST呼び出しを実行しようとしています。サーバーがSSLを必要としないように設定されている場合(テストの場合のみ、サーバーにはSSLが必要です)、NTLM認証とその後のREST呼び出しはHttpClientを使用して正常に動作します。ただし、SSLを有効にすると、認証が機能しなくなります。SSL暗号化とNTLM認証の両方を使用するHttpClientが失敗する

ここで(すべての本命を受け入れるセット)取扱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); 

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

応答を、私はいつもIS取り戻す:私は彼女をやろうとしている同じことを行うためにFireFoxのポスターやCURLを使用しました

HTTP/1.1 400 Bad Request 
The server encountered an error processing the request. See server logs for more details. 

注意をeプログラムで、それは正常に動作します。したがって、サーバーが正しくセットアップされているように見えます。

ありがとうございました!

+1

サーバーログには何が表示されるように指示されていますか? – EJP

答えて

4

この問題が発生している可能性のある他の人には、これを文書化してください。

問題は、IISサーバーが匿名ログインを許可するように設定されていることでした。どうやら、これが設定されていると、そのインストールの下で共有インスタンスへのRESTまたはSOAP接続が成功しないバグがあります。まるで "anonymous"という文字列がREST/SOAP URLに追加されているかのように見えました。もちろん、それは存在しないサービスを指していました。 IISインスタンスでの匿名ログインを無効にした後、呼び出しが機能しました。

0

私の推測では、SSL接続が永続的でないためにNTLM認証が失敗することがあります。 NTLMスキームは、複数のメッセージ交換を必要とし、永続的な接続でのみ機能することができます。

HTTPセッションのワイヤ/コンテキストログ(ここまたはhttpclient-usersリスト)を投稿すると、SSL接続が滞っていない理由を知ることができます。

+0

このシナリオは、 'WWW-Authenticate'ヘッダーを持つ403になる前に最後の応答として400を与えるべきではありません。 –

+0

@Edward Thomson:IISサーバーには、あらゆる種類の奇妙なことがあります。セッションのワイヤログがあるまでは、推測しかできません。 – oleg

関連する問題