Megosztás a következőn keresztül:


TLS/SSL – ajánlott eljárások

A TLS (Transport Layer Security) egy titkosítási protokoll, amely két számítógép közötti internetes kommunikáció biztonságossá tételére szolgál. A TLS protokoll az osztályon keresztül érhető el a SslStream .NET-ben.

Ez a cikk ajánlott eljárásokat mutat be az ügyfél és a kiszolgáló közötti biztonságos kommunikáció beállításához, és feltételezi a .NET használatát. A .NET-keretrendszer ajánlott eljárásaiért tekintse meg a Transport Layer Security (TLS) ajánlott eljárásait a .NET-keretrendszer.

TLS-verzió kiválasztása

Bár meg lehet adni a tulajdonságon keresztül EnabledSslProtocols használni kívánt TLS protokoll verzióját, javasoljuk, hogy érték használatával None halasztsa el az operációs rendszer beállításait (ez az alapértelmezett).

A döntés operációs rendszerre való elhalasztása automatikusan a TLS legújabb elérhető verzióját használja, és lehetővé teszi az alkalmazás számára, hogy az operációs rendszer frissítése után módosítsa a módosításokat. Az operációs rendszer megakadályozhatja a már nem biztonságosnak ítélt TLS-verziók használatát is.

Titkosítási csomagok kiválasztása

SslStream lehetővé teszi a felhasználók számára, hogy megadják, mely titkosítási csomagokat tárgyalhatja meg a TLS-kézfogás az CipherSuitesPolicy osztályon keresztül. A TLS-verziókhoz hasonlóan javasoljuk, hogy hagyja, hogy az operációs rendszer döntse el, melyik a legjobb titkosítási csomag, amellyel tárgyalni szeretne, ezért javasoljuk, hogy kerülje a használatát CipherSuitesPolicy.

Feljegyzés

CipherSuitesPolicy Windows rendszeren nem támogatott, és a példányosítási NotSupportedException kísérletek miatt a rendszer eldobja a példányt.

Kiszolgálótanúsítvány megadása

Kiszolgálóként SslStream történő hitelesítéshez szükség van egy példányra X509Certificate2 . Javasoljuk, hogy mindig olyan példányt X509Certificate2 használjon, amely tartalmazza a titkos kulcsot is.

A kiszolgálótanúsítványok többféleképpen is átadhatók:SslStream

Az ajánlott módszer a SslServerAuthenticationOptions.ServerCertificateContext tulajdonság használata. Ha a tanúsítványt a másik két módszer egyikével szerzi be, a példányt SslStreamCertificateContext belsőleg hozza létre a SslStream végrehajtás. A létrehozás SslStreamCertificateContext magában foglalja egy X509Chain processzorigényes művelet létrehozását. Hatékonyabb egyszer létrehozni SslStreamCertificateContext és több SslStream példányban újra felhasználni.

A példányok újbóli használata SslStreamCertificateContext további funkciókat is lehetővé tesz, például a TLS-munkamenetek újraindulását Linux-kiszolgálókon.

Egyéni X509Certificate érvényesítés

Vannak olyan esetek, amikor az alapértelmezett tanúsítványérvényesítési eljárás nem megfelelő, és egyéni érvényesítési logikára van szükség. Az érvényesítési logika részei testre szabhatók a beállítás vagy a SslClientAuthenticationOptions.CertificateChainPolicySslServerAuthenticationOptions.CertificateChainPolicy. Másik lehetőségként teljesen egyéni logikát is megadhat a <System.Net.Security.SslClientAuthenticationOptions.RemoteCertificateValidationCallback> tulajdonságon keresztül. További információ: Egyéni tanúsítványmegbízhatóság.

Egyéni tanúsítványmegbízhatóság

Ha olyan tanúsítványsal találkozik, amelyet a gép által megbízhatónak (beleértve az önaláírt tanúsítványokat) egyik hitelesítésszolgáltató sem adott ki, az alapértelmezett tanúsítványérvényesítési eljárás sikertelen lesz. A probléma megoldásának egyik lehetséges módja, ha hozzáadja a szükséges kiállítói tanúsítványokat a gép megbízható tárolójába. Ez azonban hatással lehet más alkalmazásokra a rendszeren, és nem mindig lehetséges.

A másik megoldás az egyéni megbízható főtanúsítványok megadása egy X509ChainPolicy. Ha egyéni megbízhatósági listát szeretne megadni, amelyet a rendszer megbízhatósági listája helyett fog használni az ellenőrzés során, vegye figyelembe az alábbi példát:

SslClientAuthenticationOptions clientOptions = new();

clientOptions.CertificateChainPolicy = new X509ChainPolicy()
{
    TrustMode = X509ChainTrustMode.CustomRootTrust,
    CustomTrustStore =
    {
        customIssuerCert
    }
};

Az előző szabályzattal konfigurált ügyfelek csak a megbízható customIssuerCerttanúsítványokat fogadják el.

Adott érvényesítési hibák figyelmen kívül hagyása

Vegyünk egy IoT-eszközt állandó óra nélkül. A bekapcsolást követően az eszköz órajele sok évvel ezelőtt kezdődött, ezért minden tanúsítványt "még nem érvényesnek" tekintenek. Vegye figyelembe az alábbi kódot, amely egy érvényesítési visszahívási implementációt jelenít meg, figyelmen kívül hagyva az érvényességi időszak megsértését.

static bool CustomCertificateValidationCallback(
    object sender,
    X509Certificate? certificate,
    X509Chain? chain,
    SslPolicyErrors sslPolicyErrors)
{
    // Anything that would have been accepted by default is OK
    if (sslPolicyErrors == SslPolicyErrors.None)
    {
        return true;
    }
    
    // If there is something wrong other than a chain processing error, don't trust it.
    if (sslPolicyErrors != SslPolicyErrors.RemoteCertificateChainErrors)
    {
        return false;
    }
    
    Debug.Assert(chain is not null);

    // If the reason for RemoteCertificateChainError is that the chain built empty, don't trust it.
    if (chain.ChainStatus.Length == 0)
    {
        return false;
    }

    foreach (X509ChainStatus status in chain.ChainStatus)
    {
        // If an error other than `NotTimeValid` (or `NoError`) is present, don't trust it.
        if ((status.Status & ~X509ChainStatusFlags.NotTimeValid) != X509ChainStatusFlags.NoError)
        {
            return false;
        }
    }

    return true;
}

Tanúsítvány rögzítése

Egy másik olyan helyzet, amikor egyéni tanúsítvány-ellenőrzésre van szükség, amikor az ügyfelek egy adott tanúsítványt vagy egy kis ismert tanúsítványkészletből származó tanúsítványt várnak el a kiszolgálóktól. Ezt a gyakorlatot tanúsítvány-rögzítésnek nevezzük. Az alábbi kódrészlet egy érvényesítési visszahívást jelenít meg, amely ellenőrzi, hogy a kiszolgáló egy adott ismert nyilvános kulccsal rendelkező tanúsítványt mutat-e be.

static bool CustomCertificateValidationCallback(
    object sender,
    X509Certificate? certificate,
    X509Chain? chain,
    SslPolicyErrors sslPolicyErrors)
{
    // If there is something wrong other than a chain processing error, don't trust it.
    if ((sslPolicyErrors & ~SslPolicyErrors.RemoteCertificateChainErrors) != 0)
    {
        return false;
    }
    
    Debug.Assert(certificate is not null);

    const string ExpectedPublicKey =
        "3082010A0282010100C204ECF88CEE04C2B3D850D57058CC9318EB5C" +
        "A86849B022B5F9959EB12B2C763E6CC04B604C4CEAB2B4C00F80B6B0" +
        "F972C98602F95C415D132B7F71C44BBCE9942E5037A6671C618CF641" +
        "42C546D31687279F74EB0A9D11522621736C844C7955E4D16BE8063D" +
        "481552ADB328DBAAFF6EFF60954A776B39F124D131B6DD4DC0C4FC53" +
        "B96D42ADB57CFEAEF515D23348E72271C7C2147A6C28EA374ADFEA6C" +
        "B572B47E5AA216DC69B15744DB0A12ABDEC30F47745C4122E19AF91B" +
        "93E6AD2206292EB1BA491C0C279EA3FB8BF7407200AC9208D98C5784" +
        "538105CBE6FE6B5498402785C710BB7370EF6918410745557CF9643F" +
        "3D2CC3A97CEB931A4C86D1CA850203010001";

    return certificate.GetPublicKeyString().Equals(ExpectedPublicKey);
}

Az ügyféltanúsítványok érvényesítésének szempontjai

A kiszolgálóalkalmazásoknak óvatosnak kell lenniük az ügyféltanúsítványok megkövetelésekor és érvényesítésekor. A tanúsítványok tartalmazhatják az AIA (Authority Information Access) bővítményt, amely meghatározza a kiállító tanúsítvány letöltésének helyét. A kiszolgáló ezért megpróbálhatja letölteni a kiállító tanúsítványt a külső kiszolgálóról az X509Chain ügyféltanúsítvány létrehozásakor. Hasonlóképpen előfordulhat, hogy a kiszolgálóknak külső kiszolgálókhoz kell fordulniuk, hogy az ügyféltanúsítványt ne vonják vissza.

Ha a külső kiszolgálók lassan válaszolnak, a külső kiszolgálóknak a szolgáltatásmegtagadási támadásoknak tehetik ki az alkalmazást a külső kiszolgálók létrehozásakor és ellenőrzésekor X509Chain . Ezért a kiszolgálóalkalmazások konfigurálják az épület viselkedését X509Chain a CertificateChainPolicy.