リモートパーティがトランスポートストリームを閉じたため、認証に失敗しました


87

OpenSSLサーバーを証明書認証に接続するためのTCPクライアントを開発しています。サーバーチームが共有する.crtファイルと.keyファイルを使用しています。これらの証明書は、OpenSSLコマンドによって生成されます。

私が使用していますSslStream呼び出すことにより、TCPクライアントを認証するために、オブジェクトをSslStream.AuthenticateAsClientサーバに渡すことによって、メソッドをIPSslProtocols.Ssl3X509CertificateCollection

次のエラーが発生します:

リモートパーティがトランスポートストリームを閉じたため、認証に失敗しました


2
これは、プードル後の時代の問題のように見えますSslProtocols.Ssl3。多分あなたは試してみるべきSslProtocols.Tlsです。.Net 4.5以降では、Tls11またはを使用することもできますTls12SslProtocolsEnumerationを参照してください。他の問題があるかもしれません。
jww 2015年


ありがとう。私の問題は、Windows証明書ストアから証明書のサブジェクト名を検索する代わりに、証明書とパスワードの物理パスから証明書を添付することで解決されます。
オデル2015年

これで、すべてのSslProtocols(SSL3、Tls1、およびTls2)から結果を取得できます。返信
ありがとうございます

@Odelu、どのようにして問題を修正しましたか?クライアント側またはサーバー側?

回答:


155

SecurityProtocolをTLS1.1に制限しないことをお勧めします。

推奨される解決策は、

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls

別のオプションは、次のレジストリキーを追加することです。

Key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 
Value: SchUseStrongCrypto 

.NET 4.6はデフォルトで正しいプロトコルを使用し、どちらのソリューションも必要としないことに注意してください。


6
うわー、あなたはちょうど私の問題を整理しました-私はあらゆる種類のことを試みていました-そしてそれからここでフレームワークに関するメモを見ました。フレームワークが間違ったセキュリティプロトコルを使用している可能性があることを期待して、4.6.1(4.5を使用していた)に切り替えただけです-そしてビンゴ、接続が拒否されておらず、データを取得しています!
Veverke 2016年

7
System.Net.ServicePointManager.SecurityProtocol = ...リクエストを作成する前に実行する必要があると言うことが重要です。
tonatio 2018年

2
そのターゲットフレームワークバージョンを4.6.1に更新すると、私の命が救われました:-)
Awais 2018

私のフレームワークは4.6.2に設定されています。代わりにTLSソリューションを使用する必要があるかもしれません
Luminous

4.7.2フレームワークを使用しています。リクエストを送信しているサイトもTLS1.2を使用していますが、10から6リクエストの場合と同様に、このエラーが発生します。何か案は ?
DavitMikuchadze20年

16

古いバージョンの.netを使用する場合は、独自のフラグを作成してキャストします。

    //
    // Summary:
    //     Specifies the security protocols that are supported by the Schannel security
    //     package.
    [Flags]
    private enum MySecurityProtocolType
    {
        //
        // Summary:
        //     Specifies the Secure Socket Layer (SSL) 3.0 security protocol.
        Ssl3 = 48,
        //
        // Summary:
        //     Specifies the Transport Layer Security (TLS) 1.0 security protocol.
        Tls = 192,
        //
        // Summary:
        //     Specifies the Transport Layer Security (TLS) 1.1 security protocol.
        Tls11 = 768,
        //
        // Summary:
        //     Specifies the Transport Layer Security (TLS) 1.2 security protocol.
        Tls12 = 3072
    }
    public Session()
    {
        System.Net.ServicePointManager.SecurityProtocol = (SecurityProtocolType)(MySecurityProtocolType.Tls12 | MySecurityProtocolType.Tls11 | MySecurityProtocolType.Tls);
    }

1
独自のクラスを使用する必要はありません。整数をSecurityProtocolTypeに直接キャストできますServicePointManager.SecurityProtocol = (SecurityProtocolType) 48 | (SecurityProtocolType) 192 | (SecurityProtocolType) 768 | (SecurityProtocolType) 3072;
Yan F.

13

以下のコードを追加すると、問題を解決するのに役立ちました。

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11;

8
using (var client = new HttpClient(handler))
            {
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
                var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, apiEndPoint)).ConfigureAwait(false);
                await response.Content.ReadAsStringAsync().ConfigureAwait(false);
            }

これは私のために働いた


1
重要なビットは次の行です。ServicePointManager.SecurityProtocol= SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; この答えは、その線が典型的なユースケースのどこに収まるかを示しているので素晴らしいです。
ニックペインター

5

ChargifyNET.dllを使用してChargifyAPIと通信しているときに、同じエラーメッセージが表示されました。chargify.ProtocolType = SecurityProtocolType.Tls12;構成に追加すると、問題が解決しました。

完全なコードスニペットは次のとおりです。

public ChargifyConnect GetChargifyConnect()
{
    var chargify = new ChargifyConnect();
    chargify.apiKey = ConfigurationManager.AppSettings["Chargify.apiKey"];
    chargify.Password = ConfigurationManager.AppSettings["Chargify.apiPassword"];
    chargify.URL = ConfigurationManager.AppSettings["Chargify.url"];

    // Without this an error will be thrown.
    chargify.ProtocolType = SecurityProtocolType.Tls12;

    return chargify;
}

2

VB.NETの場合、Webリクエストの前に次のものを配置できます。

Const _Tls12 As SslProtocols = DirectCast(&HC00, SslProtocols)
Const Tls12 As SecurityProtocolType = DirectCast(_Tls12, SecurityProtocolType)
ServicePointManager.SecurityProtocol = Tls12

これにより、.NET3.5でのセキュリティの問題が解決しました。


0

これは、Web要求エンドポイントがTLS1.2要求のみを受け入れる別のサーバーに切り替えられたときに発生しました。Stackoverflowで主に見つかった非常に多くの試みを試みました

  1. レジストリキー、
  2. 追加:
    System.Net.ServicePointManager.SecurityProtocol | = System.Net.SecurityProtocolType.Tls12; Global.ASX OnStartに、
  3. Web.configに追加されました。
  4. .Netフレームワークを4.7.2に更新しましたが、引き続き同じ例外が発生します。

受け取った例外は、私が直面していた実際の問題を正当化するものではなく、サービスオペレーターからの助けもありませんでした。

これを解決するには、新しい暗号スイートTLS_DHE_RSA_WITH_AES_256_GCM_SHA384を追加する必要があります を必要があります。以下に示すように、ここからIISツールを使用しました。

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.