
クライアント証明書を使用してサーバー Web サービスを呼び出す必要があります。 .crt ファイルが 1 つ提供されています。 プロジェクトを WindowsServer2008 IIS7 でホストしています。
証明書要求を完了してサーバー証明書に証明書を追加できないため、右クリックのプロパティから .crt をインストールします。次のエラーが発生しました:
CertEnroll::CX509Enrollment::p_InstallResponse: ANSI bad tag value met.
グーグルで検索しましたが、.crtクライアント証明書のインストール方法は見つかりませんでした。説明通りにインストールしてみましたが、ここステップ4
そしてこうして電話したとき
string certPath = Server.MapPath("../certificate/iot01.servername.crt");
X509Certificate2 cert = new X509Certificate2(certPath);
ws.ClientCertificates.Add(cert);
res = ws.methodName(params);
次のエラーが発生しました: System.IO.IOException: 予期しないパケット形式が原因でハンドシェイクが失敗しました。 System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest) で System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest) で System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest) で System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest) で System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest) で System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult) で System.Net.TlsStream.CallProcessAuthentication(Object state) でSystem.Threading.ExecutionContext.RunInternal(ExecutionContext 実行コンテキスト、ContextCallback コールバック、オブジェクト状態、ブール値 preserveSyncCtx)、System.Threading.ExecutionContext.Run(ExecutionContext 実行コンテキスト、ContextCallback コールバック、オブジェクト状態、ブール値 preserveSyncCtx)、System.Threading.ExecutionContext.Run(ExecutionContext 実行コンテキスト、ContextCallback コールバック、オブジェクト状態)、System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult 結果)、System.Net.TlsStream.Write(Byte[] バッファー、Int32 オフセット、Int32 サイズ)、System.Net.PooledStream.Write(Byte[] バッファー、Int32 オフセット、Int32 サイズ)、System.Net.ConnectStream.WriteHeaders(Boolean 非同期)、System.Web.Services.Protocols.WebClientProtocol.GetWebResponse(WebRequest 要求)、 System.Web.Services.Protocols.HttpWebClientProtocol.GetWebResponse(WebRequest 要求)、System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] パラメーター)、.....
これは証明書のインストールと呼び出しに関連していますか。どこが間違っているのか教えていただけますか。
答え1
それはあなたの使命、つまりあなたが従うべきステップと関係があると思います。
問題の核心に迫る強引な方法として、次の操作を行います。
完全に異なる新しいプロジェクトを使用して、"ここ" として参照されているリンクの手順を使用して、サーバー認証に関する部分をテストするためのコードを作成します。これにより、デバッグ機能を妨げる可能性のある他の問題と混ざることがなくなります。
しかし、簡単に確認すると、
初挑戦 代わりに EXPLICIT TLS 接続を使用して、SSL ではなく TLS が必要かどうかを確認してください。
TLSを開始する接続オブジェクト内のメソッドをチェックする http://www.limilabs.com/blog/the-handshake-failed-due-to-an-unexpected-packet-format
client.Connect("mail.example.com");
client.StartTLS();
ログには 4 つの実行 (プロセス 5068、3984、1628、および 7124) があるようです。最後の 3 つは動作していますか? 何か変更しましたか?
少なくとも5068では、はSTLSコマンドを送信した後、応答を読み取ろうとしているが、ないサーバーの最初の「i'm alive」行を読み取ります。たとえば、Wikipedia を参照してください。
S: C: S: +OK POP3サーバー準備完了 <[メールアドレス]>
だからその行を読んでください、前にSTLS コマンドを送信します。5068 では、SslStream が SSL 応答ではなく +OK B[egin SSL...] 応答を取得していることがわかります。
後ほど: 何が起こっているのかがわかりました。他の 3 回の実行では、stream.Read 操作が両方の応答行を読み取っています。したがって、動作するかどうかは運次第です。
たとえば、前のサンプルでは両方の行を印刷していませんでしたが、両方を印刷すると次のように表示されます。
D:\Temp>SslStartTest.exe -client2 localhost 110 応答: +OK <[メールアドレス]>、POP3 サーバーの準備ができました。応答: +OK SSL/TLS ネゴシエーションを開始します... HandleLocalCertificateSelectionCallback HandleRemoteCertificateValidationCallback SslPolicyErrors: RemoteCertificateNameMismatch、RemoteCertificateChainErrors TLS セッションが接続されました。:-) 暗号: TripleDes 強度 168 ハッシュ: Sha1 強度 160 キー交換: RsaSign 強度 1024 プロトコル: Tls 認証済み: True サーバーとして? False 署名済み: True 暗号化済み: True 証明書失効リストがチェック済み: False ローカル証明書が null です。リモート証明書は CN=alanjmcf.example.com に発行され、03/04/2009 1 0:47:40 から 29/03/2029 10:47:40 まで有効です。読み取り可能: True、書き込み可能: True タイムアウト可能: True ^C