19

JCIFS NTLM ライブラリに代わるものはありますか?

4

7 に答える 7

11

ワッフル - https://github.com/dblock/waffle

フィルター、オーセンティケーターがあり、スプリング セキュリティなどをサポートします。Windows のみですが、ネイティブ DLL は必要ありません。

于 2010-05-21T11:06:59.697 に答える
3

実際、 jcifsは優れており、Windows IIS とキープアライブ Java ソケットを使用してローカルで4 ウェイ ハンドシェイクを簡単にテストできます。

この 2004 Apache疑似コードgenerateType1Msg()は、 と を使用して jcifs でアルゴリズムを構築するのに役立ちます。Apacheでさえ、HttpClient の代替としてgenerateType3Msg()を推進しています。

2004 年の古い Apache コードは機能しますが、認証が不安定になり、HTTP/1.1 401 Unauthorized頻繁に発生します。また、Luigi Dragone のこの非常に古いコードはもう機能しません。一方、Apache の HttpClient はスムーズに動作しますが、ハンドシェイクは舞台裏で行われます (ちなみに、HttpClient はnew NTCredentials()ユーザーの認証を定義する必要があります)。

ドメインなしでポート 81 で、IIS のローカルでハンドシェイクをテストする例を次に示します。最終的にIIS を使用していない場合はhost、 、portuserおよびHTTP ヘッダーを適切に変更する必要があります。passwordWWW-Authenticate

HTTP/1.1 200 OKは認証が正しいことを意味し、そうでない場合は を取得しますHTTP/1.1 401 Unauthorized

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import jcifs.ntlmssp.NtlmFlags;
import jcifs.ntlmssp.Type1Message;
import jcifs.ntlmssp.Type2Message;
import jcifs.ntlmssp.Type3Message;
import jcifs.util.Base64;

import org.apache.http.impl.auth.NTLMEngineException;

public class TestNTLM {

    public static void main(String[] args) throws UnknownHostException, IOException, NTLMEngineException {
        Socket s = new Socket("127.0.0.1", 81);
        s.setKeepAlive(true);
        InputStream is = s.getInputStream();
        OutputStream os = s.getOutputStream();
        BufferedReader r = new BufferedReader(new InputStreamReader(is));
        BufferedWriter w = new BufferedWriter(new OutputStreamWriter(os));

        String host = "127.0.0.1:81";
        String hostDomain = "";
        String user = "My_Windows_Username";
        String password = "My_Windows_Password";

        w.write("GET http://127.0.0.1:81/ HTTP/1.1\n");
        w.write("Host: 127.0.0.1:81\n");
        w.write("Authorization: NTLM " + TestNTLM.generateType1Msg(hostDomain, host) + "\n\n");
        System.out.println("[First Message Sent]");
        w.flush();

        String resp = "", line = "";
        int contentLength = 0;
        while((line = r.readLine()) != null){
            if(line.length() == 0)
                break;
            System.out.println(line);
            if(line.startsWith("Content-Length"))
                contentLength = Integer.parseInt(line.substring(line.indexOf(":") + 1).trim());
            else if(line.startsWith("WWW-Authenticate"))
                resp = line.substring(line.indexOf(":") + 1).trim();
        }
        r.skip(contentLength);

        System.out.println("\n[Second Message Received]");
        System.out.println("Proxy-Authenticate: " + resp);
        resp = resp.substring(resp.indexOf(" ")).trim();

        w.write("GET http://127.0.0.1:81/ HTTP/1.1\n");
        w.write("Host: 127.0.0.1:81\n");
        w.write("Authorization: NTLM " + TestNTLM.generateType3Msg(user, password, hostDomain, host, new String(resp)) + "\n\n");

        w.flush();
        System.out.println("\n[Third Message Sent]");

        while((line = r.readLine()) != null){
            System.out.println(line);
            if(line.length() == 0)
                break;
        }
    }

    private static final int TYPE_1_FLAGS = 
            NtlmFlags.NTLMSSP_NEGOTIATE_56 | 
            NtlmFlags.NTLMSSP_NEGOTIATE_128 | 
            NtlmFlags.NTLMSSP_NEGOTIATE_NTLM2 | 
            NtlmFlags.NTLMSSP_NEGOTIATE_ALWAYS_SIGN | 
            NtlmFlags.NTLMSSP_REQUEST_TARGET;

    public static String generateType1Msg(final String domain, final String workstation)
            throws NTLMEngineException {
        final Type1Message type1Message = new Type1Message(TYPE_1_FLAGS, domain, workstation);
        return Base64.encode(type1Message.toByteArray());
    }

    public static String generateType3Msg(final String username, final String password,
            final String domain, final String workstation, final String challenge)
                    throws NTLMEngineException {
        Type2Message type2Message;
        try {
            type2Message = new Type2Message(Base64.decode(challenge));
        } catch (final IOException exception) {
            throw new NTLMEngineException("Invalid NTLM type 2 message", exception);
        }
        final int type2Flags = type2Message.getFlags();
        final int type3Flags = type2Flags
                & (0xffffffff ^ (NtlmFlags.NTLMSSP_TARGET_TYPE_DOMAIN | NtlmFlags.NTLMSSP_TARGET_TYPE_SERVER));
        final Type3Message type3Message = new Type3Message(type2Message, password, domain,
                username, workstation, type3Flags);
        return Base64.encode(type3Message.toByteArray());
    }
}
于 2015-12-14T21:00:53.333 に答える
3

正直なところ、探してはいけません。SSO が必要な場合は、従来の NTLM の代わりに適切な kerberos / SPNEGO を使用する必要があります。

JVMはすでに自動的に有効になっているため、特別なライブラリは必要ありません。アプリケーションと JVM のセキュリティ ポリシーを適切に構成するだけです。Sun の公式ドキュメントには、必要なすべての詳細が記載されています。「セキュリティ API」セクションを参照してください。

于 2009-07-18T22:11:34.343 に答える
2

NTLM は、Kerberos/SPNEGO を支持して非推奨になっていると思います。SPNEGO HTTP サーブレット フィルタープロジェクトを調べて、ニーズに合うかどうかを確認してください。

于 2009-11-04T16:31:51.973 に答える
1

市販のパッケージ製品を気にしない場合は、以下を参照してください。SPNEGO / Kerberos(サイトおよびS4Uプロトコルを含む)およびNTLMのサポートを提供するJava用のクエストシングルサインオン。

于 2010-06-01T11:27:46.027 に答える
1

jespa www.ioplex.comは、私が遭遇した唯一のものです。使ったことないけど

于 2009-05-27T16:51:25.877 に答える
1

Java Opensource Single Sign On (JOSSO) はhttp://www.josso.org/ にあります。NTLM に関するページがありますが、うまく機能するかどうかはわかりません。

于 2010-01-09T11:01:05.230 に答える