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-keretrendszerrel kapcsolatos ajánlott eljárásokért tekintse meg a Transport Layer Security (TLS) ajánlott eljárásait a .NET-keretrendszerrel.

TLS-verzió kiválasztása

Bár meg lehet adni a EnabledSslProtocols tulajdonság használatával a használni kívánt TLS protokoll verzióját, javasolt az operációs rendszer beállításaira hagyatkozni a None érték segítségével (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.

Megjegyzé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 való SslStream hitelesítéshez szükség van egy X509Certificate2 példányra. 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 szerzik be, a SslStreamCertificateContext példányt belsőleg a SslStream megvalósítás hozza létre. A SslStreamCertificateContext létrehozása egy X509Chain processzorigényes műveletet jelent. 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 azzal, hogy megadjuk a SslClientAuthenticationOptions.CertificateChainPolicy vagy SslServerAuthenticationOptions.CertificateChainPolicy elemeket. 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ány megbí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ó root tanúsítványok megadása 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.

Amikor X509Chain építése és ellenőrzése során szükség van külső szerverek elérésére, az alkalmazás szolgáltatásmegtagadási támadásoknak lehet kitéve, ha a külső szerverek lassan válaszolnak. Ezért a kiszolgálóalkalmazásoknak a X509Chain használatával kell konfigurálniuk a CertificateChainPolicy build folyamatát.