c# - सी#और TLSv1.2 का उपयोग करके एलडीएप से कनेक्ट करें



.net active-directory (1)

TLS 1.2 सक्षम करने के लिए कुछ रजिस्ट्री कुंजियां जोड़ें; निम्न PowerShell स्क्रिप्ट उन्हें जोड़ता है:

New-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -Force | Out-Null
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -name 'Enabled' -value '1' -PropertyType 'DWord' -Force | Out-Null
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -name 'DisabledByDefault' -value 0 -PropertyType 'DWord' -Force | Out-Null

मुझे यह जानकारी यहां मिली: https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/operations/manage-ssl-protocols-in-ad-fs

मैं TLSv1.2, और .NET Framework 4.5.2 या 4.6.2 पर एलडीएपी का प्रयोग ActiveDirectory से करना चाहता हूं (लेकिन दोनों के साथ परेशानी होती है)। समस्या यह है कि यह TLSv1.0 का उपयोग करने का प्रयास कर रहा है, भले ही मैं "ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12" का उपयोग कर रहा हूं।

क्या "System.DirectoryServices.Protocols" एक पैकेज है जिसे मैं TLSv1.2 पर LDAP क्वेरी के लिए उपयोग कर सकता हूं? यदि हां, तो TLS संस्करण को सक्षम करने का उचित तरीका क्या है?

आखिरकार, मैं इसे एक वेब एपीआई 2 नियंत्रक से करना चाहता हूं, लेकिन एक साधारण परीक्षण के रूप में जो समस्या को पुन: उत्पन्न करता है, मेरे पास निम्न कंसोल एप्लीकेशन है:

using System;
using System.Diagnostics;
using System.DirectoryServices.Protocols;
using System.Net;

namespace Ldap
{
  class Program
  {
    private const string ldapHost = "169.254.212.120";
    private const int ldapPort = 30389; // normally just 389
    private const int ldapSslPort = 30636; // normally just 636
    private const bool sslEnabled = true;
    private const string userBaseDistinguishedName = "dc=example,dc=org";
    private const string bindUserCommonName = "admin";
    private const string bindUserDistinguishedName = "cn=admin,dc=example,dc=org";
    private const string bindUserPassword = "admin";

    static void Main(string[] args)
    {
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

        using (LdapConnection connection = CreateConnection())
        {
            try
            {
                connection.Bind();
            }
            catch (Exception e)
            {
                Debug.WriteLine(e.Message);
            }
        }
    }

    private static LdapConnection CreateConnection()
    {
        var directoryIdentifier = new LdapDirectoryIdentifier(ldapHost,
            sslEnabled ? ldapSslPort : ldapPort, true, false);

        var credential = new NetworkCredential(bindUserDistinguishedName, bindUserPassword);

        var conn = new LdapConnection(directoryIdentifier, credential, AuthType.Basic);

        conn.SessionOptions.SecureSocketLayer = sslEnabled;
        conn.SessionOptions.ProtocolVersion = 3; // Use LDAPv3 (otherwise it appears to default to LDAPv2)

        return conn;
    }
  }
}

सर्वर के लिए, मैं एक ओपन लिडप डॉकर कंटेनर (पोर्ट्स 3038 9 और 30636 के साथ, मानक बंदरगाहों की तुलना में) के साथ इसका परीक्षण कर रहा हूं, हालांकि अंत में इस कोड को कनेक्ट करने के लिए और सक्रिय डायरेक्टरी को क्वेरी के लिए उपयोग किया जाएगा।

परीक्षण एलडीएपी सर्वर को खड़ा करने के लिए, मैं (डॉकर 17.06 सीई) का प्रयोग कर रहा हूं:

docker run --name test_ldap -p 0.0.0.0:30636:636 -p 0.0.0.0:30389:389 --env LDAP_TLS_CIPHER_SUITE="SECURE256:+SECURE128:-VERS-TLS-ALL:+VERS-TLS1.2:-RSA:-DHE-DSS:-CAMELLIA-128-CBC:-CAMELLIA-256-CBC" --env LDAP_TLS_VERIFY_CLIENT="allow" --hostname example.org --detach osixia/openldap:1.1.7

वायरहार्क चलाने के साथ: वायरहार्क में देखा जाने वाला यातायात "क्लाइंट हैलो" पैकेट के भीतर "संस्करण" है "TLS 1.0 (0x0301)"।

खुला एलडीएपी सर्वर शो में लॉग:

59810624 conn=1002 fd=16 ACCEPT from IP=172.17.0.1:44606 (IP=0.0.0.0:636)
TLS: can't accept: An unknown public key algorithm was encountered..
59810624 conn=1002 fd=16 closed (TLS negotiation failure)




tls1.2