2

主な編集: 2015-05-27:とりとめのない投稿を残すのではなく、現在立ち往生している場所についてある程度の成功が更新された後....これに関するいくつかのポインターで実際に行うことができます-少し行き詰まりました....

「統合認証」用に構成された IIS Web サービスに対して認証する必要がある Linux アプリ サーバー (WebSphere) でいくつかのコードを実行していますが、Authorization: Negotiate トークンの作成に問題があります。また、このトークンを、後で作成する JAX-WS SOAP 要求の HTTP ヘッダーに入れる必要があることも言う必要があります。以前は WS-Security Username トークン プロファイルを使用していたので、SOAP 要求自体が機能していることはわかっていますが、問題なく機能していました。

私の問題は、initSecContext にあると思います。最初の呼び出しでコンテキストが「何らかの」方法で構成され、返されたトークン データがいくつかあるように見えますが、.isEstablished は false です。私が抱えている問題は、initSecContext 呼び出しをループに入れることです。これを行うと、IIS が接続を閉じるだけのようです。誰かが私にいくつかのポインタを与えることができます - 私は他のポスターや Oracle サンプルで使用されているアプローチを取っているようです (ただし、IBM/WebSphere サンプルは initSecContext 呼び出しを 1 回しか行わず、 .isEstablished をチェックしません。 Oracle のドキュメント)。

とにかく、私が得るエラーは以下のとおりです (Ready: プロパティは、initSecContext がループする必要があることを明確に示しているようです - 少なくとも私には);

[5/27/15 6:51:11:605 UTC] 0000004f SystemOut     O INFO: com.mycorp.kerberosKerberosTokenGenerator/getKerberosToken/run: After initSecContext:
--- GSSContext ---
        Owner:          domainuser@MYDOMAIN.COM
        Peer:           HTTP/iishost.mycorp.com
        State:          initialized
        Lifetime:       indefinite
        Ready:          no
        Flags:
                Confidentiality         off
                Delegation              on
                Integrity               off
                MutualAuthn             on
                ReplayDetection         off
                SequenceDetection       off
                DelegatedCred:          unknown
--- End of GSSContext ---

[5/27/15 6:51:11:605 UTC] 0000004f SystemOut     O INFO: com.mycorp.kerberosKerberosTokenGenerator/getKerberosToken/run: Context is not established, trying again
[5/27/15 6:51:11:606 UTC] 0000004f SystemOut     O ERROR: com.mycorp.kerberosKerberosTokenGenerator/getKerberosToken/run: IOException during context establishment: Connection reset

私のコードは以下です。

            LoginContext lc = getLoginContext(contextName);
            final Subject subject = lc.getSubject();

            String b64Token = (String) Subject.doAs(subject, new PrivilegedExceptionAction() {
                @Override
                public Object run() throws PrivilegedActionException, GSSException {
                    // Create socket to server
                    Socket socket;
                    DataInputStream inStream = null;
                    DataOutputStream outStream = null;
                    try {
                        socket = new Socket("iishost.mycorp.com", 443);
                        inStream = new DataInputStream(socket.getInputStream());
                        outStream = new DataOutputStream(socket.getOutputStream());
                    } catch (IOException ex) {
                        System.out.println("Exception setting up server sockets: " + ex.getMessage());
                    }
                    GSSName gssName = manager.createName(userName, GSSName.NT_USER_NAME, KRB5_MECH_OID);
                    GSSCredential gssCred = manager.createCredential(gssName.canonicalize(KRB5_MECH_OID),
                            GSSCredential.DEFAULT_LIFETIME,
                            KRB5_MECH_OID,
                            GSSCredential.INITIATE_ONLY);

                    gssCred.add(gssName, GSSCredential.INDEFINITE_LIFETIME,
                            GSSCredential.INDEFINITE_LIFETIME,
                            SPNEGO_MECH_OID,
                            GSSCredential.INITIATE_ONLY);
                    GSSName gssServerName = manager.createName(servicePrincipal, KERBEROS_V5_PRINCIPAL_NAME);
                    GSSContext clientContext = manager.createContext(gssServerName.canonicalize(SPNEGO_MECH_OID),
                            SPNEGO_MECH_OID,
                            gssCred,
                            GSSContext.DEFAULT_LIFETIME);
                    clientContext.requestCredDeleg(true);
                    clientContext.requestMutualAuth(true);
                    byte[] token = new byte[0];

                    while (!clientContext.isEstablished()) {
                        try {
                            token = clientContext.initSecContext(token, 0, token.length);
// IF I LOOK AT token HERE THERE IS CERTAINLY TOKEN DATA THERE - .isEstablished IS STILL FALSE                          
                            outStream.writeInt(token.length);
                            outStream.write(token);
                            outStream.flush();

                            // Check if we're done
                            if (!clientContext.isEstablished()) {
                                token = new byte[inStream.readInt()];
                                inStream.readFully(token);
                            }
                        } catch (IOException ex) {

// THIS EXCEPTION IS THROWN ON SECOND ITERATION - LOOKS LIKE IIS CLOSES THE CONNECTION                      
                            System.out.println("IOException during context establishment: " + ex.getMessage());
                        }
                    }
                    String b64Token = Base64.encode(token);
                    clientContext.dispose();        // I'm assuming this won't invalidate the token in some way as I need to use it later
                    return b64Token;                
                }
            });

このドキュメントは、initSecContext でループする必要がないことを教えてくれますが、.isEstablished は false を返します: http://www-01.ibm.com/support/knowledgecenter/SS7K4U_8.5.5/com.ibm.websphere.zseries。 doc/ae/tsec_SPNEGO_token.html?cp=SS7K4U_8.5.5%2F1-3-0-20-4-0&lang=en

オラクルのドキュメントは私がすべきだと言っています:https://docs.oracle.com/javase/7/docs/api/org/ietf/jgss/GSSContext.html

私の唯一の躊躇は、Oracle ドキュメントから、アプリケーションの会話を開始しているように見えることですが、私がやろうとしていることは、トークンのみを取得することであり、後で JAX-WS を使用して自分の実際の Web サービス呼び出し (http ヘッダーの spnego/kerberos トークンを含む) - これが問題の原因ですか?

4

1 に答える 1