Aracılığıyla paylaş


İleti Güvenliği Anonim

İleti Güvenliği Anonim örneği, istemci kimlik doğrulaması olmadan ileti düzeyi güvenlik kullanan ancak sunucunun X.509 sertifikasını kullanarak sunucu kimlik doğrulaması gerektiren bir Windows Communication Foundation (WCF) uygulamasının nasıl uygulandığını gösterir. İstemci ve sunucu arasındaki tüm uygulama iletileri imzalı ve şifrelidir. Bu örnek , WSHttpBinding örneğini temel alır. Bu örnek, Internet Information Services (IIS) tarafından barındırılan bir istemci konsol programı (.exe) ve hizmet kitaplığından (.dll) oluşur. Hizmet, istek-yanıt iletişim desenini tanımlayan bir sözleşme uygular.

Uyarı

Bu örnek için kurulum yordamı ve derleme yönergeleri bu konunun sonunda yer alır.

Bu örnek, istemcinin kimliği doğrulanmamışsa döndüren True hesap makinesi arabirimine yeni bir işlem ekler.

public class CalculatorService : ICalculator
{
    public bool IsCallerAnonymous()
    {
        // ServiceSecurityContext.IsAnonymous returns true if the caller is not authenticated.
        return ServiceSecurityContext.Current.IsAnonymous;
    }
    ...
}

Hizmet, bir yapılandırma dosyası (Web.config) kullanılarak tanımlanan hizmetle iletişim kurmak için tek bir uç nokta sunar. Uç nokta bir adres, bir bağlama ve bir sözleşmeden oluşur. Bağlama bir wsHttpBinding bağlama ile yapılandırılır. Bağlama için wsHttpBinding varsayılan güvenlik modu şeklindedir Message. clientCredentialType özniteliği olarak Noneayarlanır.

<system.serviceModel>

  <protocolMapping>
    <add scheme="http" binding="wsHttpBinding" />
  </protocolMapping>

  <bindings>
    <wsHttpBinding>
     <!-- This configuration defines the security mode as Message and -->
     <!-- the clientCredentialType as None. This mode provides -->
     <!-- server authentication only using the service certificate. -->

     <binding>
       <security mode="Message">
         <message clientCredentialType="None" />
       </security>
     </binding>
    </wsHttpBinding>
  </bindings>
  ...
</system.serviceModel>

Hizmet kimlik doğrulaması için kullanılacak kimlik bilgileri davranışta<> belirtilir. Sunucu sertifikası, aşağıdaki örnek kodda gösterildiği gibi özniteliği için SubjectName belirtilen değerle aynı findValue değeri içermelidir.

<behaviors>
  <serviceBehaviors>
    <behavior>
      <!--
    The serviceCredentials behavior allows you to define a service certificate.
    A service certificate is used by a client to authenticate the service and provide message protection.
    This configuration references the "localhost" certificate installed during the setup instructions.
    -->
      <serviceCredentials>
        <serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
      </serviceCredentials>
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="False" />
    </behavior>
  </serviceBehaviors>
</behaviors>

İstemci uç noktası yapılandırması, hizmet uç noktası için mutlak bir adres, bağlama ve sözleşmeden oluşur. Bağlama için istemci güvenlik modu wsHttpBinding olarak ayarlıdır. clientCredentialType özniteliği olarak Noneayarlanır.

<system.serviceModel>
  <client>
    <endpoint name=""
             address="http://localhost/servicemodelsamples/service.svc"
             binding="wsHttpBinding"
             behaviorConfiguration="ClientCredentialsBehavior"
             bindingConfiguration="Binding1"
             contract="Microsoft.ServiceModel.Samples.ICalculator" />
  </client>

  <bindings>
    <wsHttpBinding>
      <!--This configuration defines the security mode as -->
      <!--Message and the clientCredentialType as None. -->
      <binding name="Binding1">
        <security mode = "Message">
          <message clientCredentialType="None"/>
        </security>
      </binding>
    </wsHttpBinding>
  </bindings>
  ...
</system.serviceModel>

Örnek, hizmetin sertifikasını doğrulamak için CertificateValidationMode öğesini PeerOrChainTrust olarak ayarlar. Bu işlem, istemcinin App.config dosyasında, behaviors bölümünde yapılır. Bu, sertifika kullanıcının Güvenilen Kişiler deposundaysa sertifikanın veren zincirini doğrulamadan güvenilir olduğu anlamına gelir. Bu ayar burada kolaylık sağlamak için kullanılır, böylece örnek bir sertifika yetkilisi (CA) tarafından verilen sertifikalara gerek kalmadan çalıştırılabilir. Bu ayar, varsayılan ChainTrust değerinden daha az güvenlidir. Üretim kodunda kullanmadan PeerOrChainTrust önce bu ayarın güvenlik üzerindeki etkileri dikkatle değerlendirilmelidir.

İstemci uygulaması, yönteme IsCallerAnonymous çağrısı ekler ve diğer yönlerden WSHttpBinding örneğinden farklı değildir.

// Create a client with a client endpoint configuration.
CalculatorClient client = new CalculatorClient();

// Call the GetCallerIdentity operation.
Console.WriteLine("IsCallerAnonymous returned: {0}", client.IsCallerAnonymous());

// Call the Add service operation.
double value1 = 100.00D;
double value2 = 15.99D;
double result = client.Add(value1, value2);
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);

...

//Closing the client gracefully closes the connection and cleans up resources.
client.Close();

Console.WriteLine();
Console.WriteLine("Press <ENTER> to terminate client.");
Console.ReadLine();

Örneği çalıştırdığınızda, işlem istekleri ve yanıtları istemci konsolu penceresinde görüntülenir. İstemciyi kapatmak için istemci penceresinde ENTER tuşuna basın.

IsCallerAnonymous returned: True
Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714
Press <ENTER> to terminate client.

İleti Güvenliği Anonim örneğine dahil Setup.bat toplu iş dosyası, sertifika tabanlı güvenlik gerektiren barındırılan bir uygulamayı çalıştırmak için sunucuyu ilgili bir sertifikayla yapılandırmanıza olanak tanır. Toplu iş dosyası iki modda çalıştırılabilir. Toplu iş dosyasını tek bilgisayar modunda çalıştırmak için komut satırına yazın setup.bat . Hizmet modunda çalıştırmak için yazın setup.bat service. Örneği bilgisayarlar arasında çalıştırırken bu modu kullanın. Ayrıntılar için bu konunun sonundaki kurulum yordamına bakın.

Aşağıda, toplu iş dosyalarının farklı bölümlerine kısa bir genel bakış sağlanır:

  • Sunucu sertifikası oluşturuluyor.

    Setup.bat toplu iş dosyasındaki aşağıdaki satırlar kullanılacak sunucu sertifikasını oluşturur.

    echo ************
    echo Server cert setup starting
    echo %SERVER_NAME%
    echo ************
    echo making server cert
    echo ************
    makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=%SERVER_NAME% -sky exchange -pe
    

    %SERVER_NAME% değişkeni sunucu adını belirtir. Sertifika LocalMachine deposunda depolanır. Kurulum betik dosyası bir hizmet bağımsız değişkeniyle (örneğin setup.bat service) çalıştırıldığında, %SERVER_NAME% bilgisayarın tam etki alanı adını içerir. Aksi takdirde varsayılan olarak localhost olur.

  • Sunucu sertifikasını istemcinin güvenilen sertifika deposuna yükleme.

    Aşağıdaki satır, sunucu sertifikasını istemcinin güvenilen kişiler deposuna kopyalar. Makecert.exe tarafından oluşturulan sertifikalara istemci sistemi tarafından örtük olarak güvenilmediğinden bu adım gereklidir. İstemci güvenilen kök sertifikasında (örneğin, Microsoft tarafından verilen bir sertifika) köke sahip bir sertifikanız zaten varsa, istemci sertifika depoyu sunucu sertifikasıyla doldurma adımı gerekli değildir.

    certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
    
  • Sertifikanın özel anahtarına izinlerin verilmesi.

    Setup.bat toplu iş dosyasındaki aşağıdaki satırlar LocalMachine deposunda depolanan sunucu sertifikasının ASP.NET çalışan işlemi hesabı tarafından erişilebilir olmasını sağlar.

    echo ************
    echo setting privileges on server certificates
    echo ************
    for /F "delims=" %%i in ('"%MSSDK%\bin\FindPrivateKey.exe" My LocalMachine -n CN^=%SERVER_NAME% -a') do set PRIVATE_KEY_FILE=%%i set WP_ACCOUNT=NT AUTHORITY\NETWORK SERVICE
    (ver | findstr "5.1") && set WP_ACCOUNT=%COMPUTERNAME%\ASPNET
    echo Y|cacls.exe "%PRIVATE_KEY_FILE%" /E /G "%WP_ACCOUNT%":R
    iisreset
    

Uyarı

Bir ABD dışı İngilizce sürümünü kullanıyorsanız, Windows'un Setup.bat dosyasını düzenlemeli ve NT AUTHORITY\NETWORK SERVICE hesap adını bölgesel eşdeğerinizle değiştirmelisiniz.

Örneği ayarlamak, derlemek ve çalıştırmak için

  1. Windows Communication Foundation Örnekleri içinOne-Time Kurulum Yordamını yaptığınızdan emin olun.

  2. Çözümün C# veya Visual Basic .NET sürümünü oluşturmak için Windows Communication Foundation Örneklerioluşturma başlığındaki yönergeleri izleyin.

Örneği aynı bilgisayarda çalıştırmak için

  1. Yolun, Makecert.exe ve FindPrivateKey.exe bulunduğu klasörü içerdiğinden emin olun.

  2. Visual Studio için Geliştirici Komut İstemi'ndeki örnek yükleme klasöründen Setup.bat yönetici ayrıcalıklarıyla çalıştırın. Bu, örneği çalıştırmak için gereken tüm sertifikaları yükler.

    Uyarı

    Kurulum toplu iş dosyası, Visual Studio için Geliştirici Komut İsteminden çalıştırılacak şekilde tasarlanmıştır. Yol ortamı değişkeninin SDK'nın yüklü olduğu dizine işaret etmelerini gerektirir. Bu ortam değişkeni, Visual Studio için Geliştirici Komut İstemi içinde otomatik olarak ayarlanır.

  3. http://localhost/servicemodelsamples/service.svcadresini girerek tarayıcı kullanarak hizmete erişimi doğrulayın.

  4. \client\bin konumundan Client.exe başlatın. İstemci etkinliği, istemci konsol uygulamasında görüntülenir.

  5. İstemci ve hizmet iletişim kuramıyorsa bkz. WCF Örnekleri için Sorun Giderme İpuçları.

Örneği bilgisayarlar arasında çalıştırmak için

  1. Hizmet bilgisayarında bir dizin oluşturun. Internet Information Services (IIS) yönetim aracını kullanarak bu dizin için servicemodelsamples adlı bir sanal uygulama oluşturun.

  2. \inetpub\wwwroot\servicemodelsamples hizmet programı dosyalarını hizmet bilgisayarındaki sanal dizine kopyalayın. \bin alt dizinindeki dosyaları kopyaladığınızdan emin olun. Ayrıca Setup.bat ve Cleanup.bat dosyalarını hizmet bilgisayarına kopyalayın.

  3. İstemci ikili dosyaları için istemci bilgisayarda bir dizin oluşturun.

  4. İstemci programı dosyalarını istemci bilgisayardaki istemci dizinine kopyalayın. Ayrıca, Setup.bat, Cleanup.batve ImportServiceCert.bat dosyalarını istemciye kopyalayın.

  5. Sunucuda, yönetici ayrıcalıklarıyla açılan Visual Studio için Geliştirici Komut İstemi'nde komutunu çalıştırın setup.bat service . setup.bat bağımsız değişkeniyle service çalıştırmak, bilgisayarın tam etki alanı adına sahip bir hizmet sertifikası oluşturur ve hizmet sertifikasını Service.cer adlı bir dosyaya aktarır.

  6. Web.config dosyasını, bilgisayarın tam etki alanı adıyla aynı olan yeni sertifika adını (findValueserviceCertificate<>) yansıtacak şekilde düzenleyin.

  7. Service.cer dosyasını hizmet dizininden istemci bilgisayardaki istemci dizinine kopyalayın.

  8. İstemci bilgisayardaki Client.exe.config dosyasında, uç noktanın adres değerini hizmetinizin yeni adresiyle eşleşecek şekilde değiştirin.

  9. İstemcide, yönetici ayrıcalıklarıyla açılan Visual Studio için Geliştirici Komut İstemi'nde ImportServiceCert.bat çalıştırın. Bu, hizmet sertifikasını Service.cer dosyasından CurrentUser - TrustedPeople deposuna aktarır.

  10. İstemci bilgisayarda bir komut isteminden Client.exe başlatın. İstemci ve hizmet iletişim kuramıyorsa bkz. WCF Örnekleri için Sorun Giderme İpuçları.

Örnekten sonra temizlik yapmak için

  • Örneği çalıştırmayı bitirdikten sonra örnekler klasöründe Cleanup.bat çalıştırın.

Uyarı

Bu betik, bu örneği bilgisayarlar arasında çalıştırırken istemcideki hizmet sertifikalarını kaldırmaz. Bilgisayarlar arasında sertifika kullanan Windows Communication Foundation (WCF) örnekleri çalıştırdıysanız CurrentUser - TrustedPeople deposuna yüklenmiş hizmet sertifikalarını temizlediğinizden emin olun. Bunu yapmak için aşağıdaki komutu kullanın: Örneğin: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.