自己署名証明書付きのテストサーバーへのSSL/TLS接続を確立しようとしています。安全でないチャネルを介した通信は問題なく機能しました。
このソリューションに基づいて作成したサンプルコードは次のとおりです: HttpClientによる信頼できないSSL証明書の許可C#証明書エラーを無視しますか?ssl Web APIに接続する.NETクライアント
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
var c = new HttpClient();
var r = c.GetAsync("https://10.3.0.1:8443/rest/v1").Result;
if (r.IsSuccessStatusCode)
{
Log.AddMessage(r.Content.Get<string>());
}
else
{
Log.AddMessage(string.Format("{0} ({1})", (int)r.StatusCode, r.ReasonPhrase));
}
これも試しました:
var handler = new WebRequestHandler();
handler.ServerCertificateValidationCallback = delegate { return true; };
var c = new HttpClient(handler);
...
この
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
しかし、例外が発生するたびに:
InnerException: System.Net.Http.HttpRequestException
_HResult=-2146233088
_message=An error occurred while sending the request.
HResult=-2146233088
IsTransient=false
Message=An error occurred while sending the request.
InnerException: System.Net.WebException
_HResult=-2146233079
_message=The request was aborted: Could not create SSL/TLS secure channel.
HResult=-2146233079
IsTransient=false
Message=The request was aborted: Could not create SSL/TLS secure channel.
Source=System
StackTrace:
at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)
InnerException:
何が間違っていますか?無効な自己署名証明書があるこのサーバーに接続できない理由
ServerCertificateValidationCallbackを使用して適切に実行しています。これはあなたが直面している問題ではありません。直面している問題は、おそらくSSL/TLSプロトコルのバージョンです。
たとえば、サーバーがSSLv3とTLSv10のみを提供し、クライアントがTLSv12を必要とする場合、このエラーメッセージが表示されます。あなたがする必要があるのは、クライアントとサーバーの両方がサポートされる共通プロトコルバージョンを持っていることを確認することです。
(可能な限り安全にするためではなく)できるだけ多くのサーバーに接続できるクライアントが必要な場合、これを使用します(検証コールバックの設定と共に)。
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
今日も同じ問題を解決していますが、必要なことは、.NETのランタイムバージョンを増やすことだけです
4.5.2は機能しませんでした上記の問題については、4.6.1は問題ありませんでした
.NETバージョンを保持する必要がある場合は、設定します
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
まだこれに直面している人のためのフォローアップとして-私はソリューションに記載されているようにServicePointManager.SecurityProfileオプションを追加しました:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
それでも、「リクエストが中止されました:SSL/TLSセキュアチャネルを作成できませんでした」というエラーが引き続き発生しました。 HTTPS SOAP APIインターフェイス(つまり、数年前にインストールされたボイスメール、IP電話システムなど)を使用して、古い音声サーバーに接続しようとしました。これらは数年前に最後に更新されたため、SSL3接続のみをサポートします。
SecurityProtocolsのリストにSSl3を含めると、ここでうまくいくと思いますが、そうではありません。接続を強制できる唯一の方法は、Ssl3プロトコルのみを含め、他のプロトコルは含めないことです。
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
その後、接続は通過します-私にとってはバグのように見えますが、長年にわたって存在していたこれらのサーバーに提供するツールで最近までエラーがスローされませんでした他に代替手段がない限り、TLS接続を強制する動作。
とにかく、まだいくつかの古いサイト/サーバーに対してこれを実行している場合は、試してみる価値があります。
次の行を移動します:ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
この行の前:HttpWebRequest request =(HttpWebRequest)WebRequest.Create(uri);
新しいドメイン名を使用していて、上記のすべてを実行しても同じエラーが引き続き発生する場合は、PCのDNSキャッシュをクリアするかどうかを確認してください。 DNSをクリアする 詳細については。
Windows®8
Windows 8を使用している場合にDNSキャッシュをクリアするには、次の手順を実行します。
キーボードで、Win + Xを押してWinXメニューを開きます。
[コマンドプロンプト]を右クリックし、[管理者として実行]を選択します。
次のコマンドを実行します。
ipconfig/flushdns
コマンドが成功すると、システムは次のメッセージを返します。
Windows IP構成により、DNSリゾルバーキャッシュが正常にフラッシュされました。
Windows®7
Windows 7を使用している場合にDNSキャッシュをクリアするには、次の手順を実行します。
開始をクリックします。
[スタート]メニューの検索テキストボックスに「cmd」と入力します。
[コマンドプロンプト]を右クリックし、[管理者として実行]を選択します。
次のコマンドを実行します。
ipconfig/flushdns
コマンドが成功した場合、システムは次のメッセージを返します。
エラーも発生したため、このスレッドに遭遇しましたSSL/TLSセキュアチャネルを作成できませんでした。私の場合、PowerShellからSiebel構成REST APIにアクセスしようとしましたInvoke-RestMethod
、および上記の提案はいずれも役に立たなかった。
最終的に、私は問題の原因を見つけました:私が連絡していたサーバーはクライアント証明書認証を必要としました。
呼び出しを機能させるには、クライアント証明書(秘密キーを含む)に-Certificate
パラメーターを指定する必要がありました。
$Pwd = 'certificatepassword'
$Pfx = New-Object -TypeName 'System.Security.Cryptography.X509Certificates.X509Certificate2'
$Pfx.Import('clientcert.p12', $Pwd, 'Exportable,PersistKeySet')
Invoke-RestMethod -Uri 'https://your.rest.Host/api/' -Certificate $Pfx -OtherParam ...
うまくいけば、私の経験がこの問題の私の特定の味を持っている他の誰かを助けるかもしれません。