問題タブ [sspi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
postgresql - PostgreSQL ODBC 接続 SSPI 認証の失敗
私は最近、いくつかの機能を改善するために、会社のために維持している既存のアプリケーションにいくつかの変更を加えました。しかし、問題が発生しました。すべての Google 検索で役立つ情報を見つけることができません。プラットフォームは次のとおりです。
PostgreSQL (v. 9.1.1) サーバーへの ODBC 経由の ADODB 接続を使用して、Windows 7 (64 ビット) で実行されている VB6 アプリケーション。
問題は、何らかの理由で、私が使用している SSPI 認証方法が PostgreSQL データベースのシーケンスから値を取得できないように見えることです。他の (VB.NET) アプリケーションは、SSPI 認証を使用して (Npgsql を使用して) 問題なく同じデータベース サーバーに接続します。
VB6 アプリケーションで ODBC 接続に使用される基本的な接続文字列は次のとおりです。
データベースへの接続を試みた後に PostgreSQL サーバーのログを確認すると、次のエラーが見つかりました。
PGAdmin III を介して別のマシン (資格情報でログイン) からこのユーザーとしてデータベースに接続しようとしましたが、問題なく接続できました。この 2 台目のマシン (これも Windows 7 64 ビット) で同じアプリケーションを実際に試してみましたが、接続にエラーは発生していないようです。
もちろん、WinXP VM で VB6 IDE を介してコードを実行すると (自分の資格情報で)、すべてが期待どおりに動作するように見えます。ユーザーの Active Directory アカウントがアクティブでロック解除されていること、および PostgreSQL データベースに正しいユーザーが正しいグループ ロール メンバーシップなどで作成されていることを確認しました。したがって、PostgreSQL 用にインストールされた ODBC ドライバーに何か問題があるに違いないというのが私の考えです。64 ビットの PostgreSQL ODBC ドライバーをインストールしましたが、(もちろん) 役に立ちませんでした。32 ビット ドライバーをアンインストールして再インストールしましたが (32 ビット アプリケーションで実行されているため)、変更はありません。
データベースへの接続を試みるために使用しているVB6コードは次のとおりです。
PostgreSQL データベースでシーケンスを確認しましたが、シーケンスがインクリメントされていません。表示されるエラー メッセージは、SQLStr
変数がまだ設定されていないことを示しています。これは、Open
メソッドが呼び出されているときに発生していることを示しています。
当面の間、「応急処置」の回避策を考え出しました。SSPI の代わりに MD5 ログイン (pg_hba.conf で指定) を使用する PostgreSQL サーバー上に、アクセスが制限された新しいユーザーを作成しました。これを接続文字列 ( ) にハードコーディングしましたPGSQL_CONNECTION_STR
。これまでのところ、これは正しく機能しているように見えます。この問題は、この環境で PostgreSQL 用の ODBC コネクタで SSPI を使用することに特に関連しているとさらに確信しています。
この時点で、誰かが PostgreSQL ODBC ドライバーを使用して SSPI 経由で PostgreSQL データベースへの接続を認証する際の特定の問題を知っているのではないかと考えています。資格情報がアクセスが制限されたユーザーのものであっても、資格情報をアプリケーションにハードコーディングする必要はありません。知っていることはすべて調べてみましたが、おそらく上記で言及できなかったので、説明が必要な場合はお知らせください。よろしくお願いします。
編集:私がまだ試していない唯一のことは、64 ビット ODBC ドライバーをインストールし、代わりにそれを使用するように接続文字列を変更することです。私がこれを試していない理由は、まだ 64 ビット OS にアップグレードしていないユーザーがいるためです。おそらく、ユーザーが VB6 を介して 32 ビット OS と 64 ビット OS のどちらを使用しているかを判断する方法を見つけることができれば、これが実行可能な代替手段になる可能性があります (64 ビット ODBC ドライバーが実際に正しく動作すると仮定します)。
編集 - デバッグ ログの詳細 (編集済み):
[mylog_3380.log]
[psqlodbc_3380.log]
編集 - サーバー ログ: これは、テスト時のログ エントリです。以前に投稿したものとほとんど同じですが、接続タイムアウトなどを考慮して数分進めました。ストアド プロシージャを呼び出している VB6 アプリケーションの別の関数からのものですが、SSPI 認証で同じエラー/問題が発生しています。
追加のデバッグを有効にすることはできますが、そこからデータを取得するのに少し時間がかかる場合があります。同じODBCコネクタがインストールされた32ビットのWinXPテスト環境でこれらの同じ機能が正しく動作することを除いて、問題がPostgreSQLのバージョンに関連している可能性は確かにあります(以前に示唆したように)。
編集 - log_min_messages = debug1:
log_min_messages = debug5
kerberos - SSPI を使用して、Kerberos トークンを GSSAPI 対応の HTTP プロキシ サーバーに送信するにはどうすればよいですか?
Web サイトにアクセスするための単純なクライアント ソケット アプリケーションがあります。クライアントがインターネットにアクセスするには、HTTP プロキシ サーバーを経由する必要があります (Microsoft Forefront Threat Management Gateway を使用しています)。プロキシ サーバーは認証を必要とし、GSSAPI 経由で Kerberos を受け入れるように構成されています。
私のクライアントでは、Microsoft の SSPI を使用しています。
まず、成功して返されるAcquireCredentialsHandleを呼び出しますSEC_E_OK
次に、InitializeSecurityContextを呼び出します。これも成功して戻りますSEC_E_OK
ここまでは順調ですね。しかし今、承認のためにトークンをプロキシサーバーに送信する必要があります。これが問題を引き起こしている部分です。
Internet Explorer を使用してプロキシ サーバーに接続すると、Wireshark を介してパケット交換を監視できます。IE は Kerberos とチケットをネゴシエートし、Proxy-Authorization ヘッダーを介して送信するように見えます。ヘッダーの内容は base64 でエンコードされているようです。
から返されたトークンを単に取得し、InitializeSecurityContext
それを base64 エンコードして、結果を のようなヘッダーを介してプロキシ サーバーに送信するとProxy-Authorization: Negotiate <base64Data>
、認証は失敗します。
近づいたような気がしますが、まだ何かが欠けています。あるサイトでは、送信前にトークンで EncryptMessage を使用することについて説明していました。相互認証の使用について別の議論がありました (IE が相互認証を使用しているとは思いません。なぜなら、クライアントは認証を 1 回しか送信していないようで、サーバーからのフィードバック データがないためです ( InitializeSecurityContext
2 回目に呼び出す)。別のサイトでは、トークンをさまざまなSEC_BUFFER
タイプ(パディング、データなど)と暗号化方法に関するドキュメントがあまり見つからないため、これが必要なことだと思います。
洞察や提案をいただければ幸いです。
UPDATE 7/19/2014: 明確にするために、SSPI を使用して「base64Data」フィールドを計算する方法を尋ねています (上記参照)。SECBUFFER_TOKEN のバッファに含まれるコンテンツの base64 エンコーディングを計算することは私の最初の推測でしたが、サーバーは結果を受け入れないため、明らかに無効です。
さらなる調査によると、トークンを「ラップ」する必要があり (別名、SSPI を介して「EncryptMessage」)、GSSAPI と互換性のある方法で暗号化するには、3 つのバッファーを使用する必要があります (順序: SECBUFFER_TOKEN、SECBUFFER_DATA、および SECBUFFER_PADDING)。これは昨日ですが、成功しませんでした。
asp.net - APNS プッシュ通知エラー - SSPI の呼び出しに失敗しました。内部例外を参照してください
この質問が以前に尋ねられたことは知っていますが、どれも役に立たないようです。
asp.net アプリケーションからプッシュ通知を送信しようとしていますが、次のエラーが表示されます。
コードは次のとおりです。
証明書に問題がありますか、それともなぜこの問題が発生する可能性がありますか?
p12ファイルを使用することになっていますか? もしそうなら、.pem ファイルがある場合、どうすれば p12 ファイルを取得できますか?
これを Windows で開発していますが、Windows のどこかに証明書を登録する必要がありますか?
よろしく、マリウス。
windows - SSPI は常に NTLM を取得します
windows2008-r2 ドメインに接続された windows7 があります。
SSPI "Negociate" (C++) を試すたびに、NTLM にフォールバックします。
理由がわかりません... DC の DNS は問題ありません。
何かすることはありませんか??
klist を実行すると、問題なく表示されます。すべて問題ないようです (推測)
アップデート
わかりました今、私は(少なくとも)理解し始めたところです。
以前は SPN "" を指定してInitializeSecurityContext
いましたが、その場合は直接 NTLM にフォールバックします。
今、私は常にクライアントでこれを試しました:
エラー0x8009030cが返されます
その他の奇妙なこと: 「管理者」で szSPN を設定すると、kerberos で動作するようになりました!!! しかし、JOE で szSPN を設定すると、失敗します... (DC で新しいユーザー JOE を作成したと仮定します)。
わわわわわわわ…!?
c# - sspi の呼び出しに失敗しました。内部例外を参照してください。受信したメッセージは予期しないものであるか、Windows 7 でフォーマットが不適切でした]
次のエラーが表示されます。「sspi の呼び出しに失敗しました。内部例外を参照してください。受信したメッセージは予期しないものでしたか、Windows 7 で正しくフォーマットされていませんでした」。考えられるすべての方法を試しましたが、うまくいきませんでした。これをチェックしてください
ここにコードがあります
c# - 1 つのドメイン コントローラーがダウンしていると、WCF Kerberos SSPI が失敗する
私の WCF サービスは Kerberos による Windows 認証を使用しています。NTLM を無効にします。サービスは1 つのドメイン ユーザー アカウントで実行され、クライアントは別のドメイン ユーザー アカウントで実行されます。どちらもUPNを使用して構成されています。クライアントとサービスの両方が同じドメインにあります。また、ドメインには2 つのドメイン コントローラがあります。
両方のドメイン コントローラーがオンラインの場合、クライアントとサービス間の通信は問題なくスムーズに実行されます。ドメイン コントローラーの 1 つがダウンしている場合、次のエラーが発生しました。
SSPI の呼び出しに失敗しました。内部例外を参照してください。---> System.Security.Authentication.AuthenticationException: SSPI の呼び出しに失敗しました。内部例外を参照してください。---> System.ComponentModel.Win32Exception: システムは、セキュリティを侵害する可能性のある試みを検出しました。あなたを認証したサーバーに接続できることを確認してください
このエラーを解消するにはどうすればよいかアドバイスをお願いします。ありがとう。
multithreading - Win32 の偽装はスレッドごとですか?
ImpersonateSecurityContext
呼び出し元のスレッドまたはプロセス全体で、クライアントを偽装してサーバー上で呼び出しています。ドキュメントは、 「関数は偽装トークンを作成し、スレッドまたはプロセスが偽装コンテキストで実行できるようにする」と述べているため、この問題について少しあいまいです。
なりすましは呼び出し元のスレッドのみを対象としており、それ以外は奇妙だと思いますが、確認したいと思います。
c# - SSL 接続を使用する RabbitMQ クライアントが SSPI 例外をスローする
SSL を有効にして RabbitMQ クライアントを使用するとCreateConnection();
、例外がスローされます。
内部例外は SSPI にあり、その内部にはトークン無効例外があります。
RabbitMQ サーバーは Java でテストされ、期待どおりに動作するため、問題は .Net セキュリティ ライブラリにあるはずです。
これを回避する方法を知っている人はいますか?
C# コード:
例外:
ジャバコード:
database - 機能不全のクローン
データベース サーバーが複製されました。オペレーティング システムは"Microsoft Windows XP Professional Version 2002 Service Pack 3"
です。クエリ環境は"Microsoft SQL Server 2008 Management Studio 10.0.4000.0"
.
クローニング後、以下の挙動が確認されました。マシンの外部から同じドメイン内に接続しようとすると、次のエラー メッセージが表示される場合があります"Cannot generate SSPI context. (.Net SqlClient Data Provider)"
。
マシン内から、"Microsoft SQL Server 2008 Management Studio"
クエリ環境を使用してデータベース サーバーに接続できます。
ただし、SQLCmd
コマンド ライン ツールを実行しようとすると、次のエラーが表示されます。
はServicePrincipalNames
次のように設定されます。
"C:\PROGRA~1\SUPPOR~1\ADSIEDIT.MSC"
Microsoft Windows XP Professional コンパクト ディスクからサポート ツールを実行すると、"ADSI Edit \ Domain [<Site>.<Company>.com] \ DC=<Company>,DC=com"
パスの下に"CN=Computers"
リーフが表示されます。その"Properties"
ダイアログ ボックスの"Security"
タブ内の"Group or user names:"
リストの下に、"SELF"
エントリがあります。ボタンを押す"Advanced"
と、"Advanced Security Settings for Computers"
ダイアログ ボックスが生成されます。"Permissions"
タブのリストの下には"Permission entries:"
、 Name のエントリもあり"SELF"
ます。ボタンを押す"Edit..."
と、"Permission Entry for Computers"
ダイアログボックスが表示されます。その"Properties"
タブの"Permissions:"
リストには、"Read ServicePrincipalName"
権限と権限のエントリはありません"Write ServicePrincipalName"
。
これが、次のコマンドが失敗する理由である可能性があります。
ServicePrincipalName
複製されたデータベース サーバーでをリセットするためのアクセス許可が設定されていたとしてもSQLCmd
、同じドメイン内で、マシンの外部と外部の両方からの接続を解決できますか?