Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
A MessageSecurity-minta bemutatja, hogyan lehet egy alkalmazást implementálni, amely az ügyfél X.509v3 tanúsítványalapú hitelesítését használja a WS-Security számára, és igényli a kiszolgáló X.509v3 tanúsítványalapú hitelesítését az MSMQ-n keresztül. Az üzenetbiztonság néha kívánatosabb annak biztosítása érdekében, hogy az MSMQ-tárolóban lévő üzenetek titkosítva maradjanak, és az alkalmazás elvégezhesse az üzenet saját hitelesítését.
Ez a minta a Transacted MSMQ Binding mintán alapul. Az üzenetek titkosítva és aláírva vannak.
A minta beállítása, összeállítása és futtatása
Győződjön meg arról, hogy elvégezte a Windows Communication Foundation-minták One-Time beállítási eljárását.
Ha a szolgáltatást először futtatják, ellenőrzi, hogy az üzenetsor jelen van-e. Ha az üzenetsor nincs jelen, a szolgáltatás létrehoz egyet. Először futtathatja a szolgáltatást az üzenetsor létrehozásához, vagy létrehozhat egyet az MSMQ Queue Manageren keresztül. Az alábbi lépéseket követve hozzon létre egy sort a Windows Server 2008-ban.
Nyissa meg a Kiszolgálókezelőt a Visual Studio 2012-ben.
Nyissa meg a Funkciók lapot.
Kattintson a jobb gombbal a Privát üzenetsorokelemre, és válassza Új, Privát üzenetsorlehetőséget.
Jelölje be a Tranzakciós jelölőnégyzetet.
Adja meg
ServiceModelSamplesTransactedaz új üzenetsor neveként.
A megoldás C# vagy Visual Basic kiadásának létrehozásához kövesse Windows Communication Foundation-mintákcímű témakör utasításait.
A minta futtatása ugyanazon a számítógépen
Győződjön meg arról, hogy az elérési út tartalmazza a Makecert.exe és FindPrivateKey.exetartalmazó mappát.
A Setup.bat futtatása a minta telepítési mappából. Ez telepíti a minta futtatásához szükséges összes tanúsítványt.
Jegyzet
Győződjön meg arról, hogy a mintával való munka befejezése után a Cleanup.bat futtatásával eltávolítja a tanúsítványokat. Más biztonsági minták ugyanazokat a tanúsítványokat használják.
Indítsa el a Service.exe a \service\bin fájlból.
Indítsa el a Client.exe a \client\bin fájlból. Az ügyféltevékenység megjelenik az ügyfélkonzol-alkalmazásban.
Ha az ügyfél és a szolgáltatás nem tud kommunikálni, tekintse meg WCF-minták hibaelhárítási tippjeinek.
A minta futtatása számítógépeken
Másolja a Setup.bat, Cleanup.batés ImportClientCert.bat fájlokat a szolgáltatásszámítógépre.
Hozzon létre egy könyvtárat az ügyfélszámítógépen az ügyfél bináris fájljaihoz.
Másolja az ügyfélprogram fájljait az ügyfélszámítógép ügyfélkönyvtárába. Másolja a Setup.bat, Cleanup.batés ImportServiceCert.bat fájlokat is az ügyfélbe.
Futtassa a
setup.bat servicea kiszolgálón. Asetup.batargumentummal futtatottservicelétrehoz egy szolgáltatástanúsítványt a számítógép teljes tartománynevével, és exportálja a szolgáltatástanúsítványt egy Service.cer nevű fájlba.Szerkessze a szolgáltatás service.exe.config, hogy tükrözze az új tanúsítványnevet (a
findValue< attribútumában), amely megegyezik a számítógép teljes tartománynevével.Másolja a Service.cer fájlt a szolgáltatáskönyvtárból az ügyfélszámítógép ügyfélkönyvtárába.
Kliens oldalon futtassa a
setup.bat client. Asetup.batargumentummal futtatottclientlétrehoz egy client.com nevű ügyféltanúsítványt, és exportálja az ügyféltanúsítványt egy Client.cer nevű fájlba.Az ügyfélszámítógép Client.exe.config fájljában módosítsa a végpont címértékét úgy, hogy az megfeleljen a szolgáltatás új címének. Ehhez cserélje le a localhost nevét a kiszolgáló teljes domain nevére. A szolgáltatás tanúsítványnevét úgy is módosítania kell, hogy megegyezzon a szolgáltatásszámítógép teljes tartománynevével (a
findValuealattidefaultCertificateserviceCertificateelemeclientCredentialsattribútumában).Másolja a Client.cer fájlt az ügyfélkönyvtárból a kiszolgáló szolgáltatáskönyvtárába.
Kliens oldalon futtassa a
ImportServiceCert.bat. Ez importálja a szolgáltatástanúsítványt a Service.cer fájlból a CurrentUser – TrustedPeople tárolóba.A kiszolgálón futtassa a
ImportClientCert.bat, Ez importálja az ügyféltanúsítványt a Client.cer fájlból a LocalMachine – TrustedPeople tárolóba.A szolgáltatási számítógépen indítsa el a Service.exe-t a parancssorból.
Az ügyfélszámítógépen indítsa el Client.exe a parancssorból. Ha az ügyfél és a szolgáltatás nem tud kommunikálni, tekintse meg WCF-minták hibaelhárítási tippjeinek.
A minta utáni tisztítás
A minta végrehajtása után futtassa le a mintamappában lévő Cleanup.bat-t.
Jegyzet
Ez a szkript nem távolítja el az ügyfél szolgáltatástanúsítványait, amikor a mintát számítógépeken futtatja. Ha windowsos kommunikációs alap (WCF) mintákat futtat, amelyek tanúsítványokat használnak a számítógépeken, mindenképpen törölje a CurrentUser – TrustedPeople áruházban telepített szolgáltatástanúsítványokat. Ehhez használja a következő parancsot:
certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>Például:certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.
Követelmények
Ehhez a mintához telepíteni és futtatni kell az MSMQ-t.
Megmutatja
Az ügyfél a szolgáltatás nyilvános kulcsával titkosítja az üzenetet, és saját tanúsítványával aláírja az üzenetet. Az üzenetsorból olvasó szolgáltatás hitelesíti az ügyféltanúsítványt a megbízható személyek tárolójában található tanúsítvánnyal. Ezután visszafejti az üzenetet, és elküldi az üzenetet a szolgáltatásműveletnek.
Mivel a Windows Communication Foundation (WCF) üzenet hasznos adatként van tárolva az MSMQ-üzenet törzsében, a törzs titkosítva marad az MSMQ-tárolóban. Ez védi az üzenetet az üzenet nemkívánatos közzétételétől. Vegye figyelembe, hogy maga az MSMQ nem tudja, hogy a hordozott üzenet titkosítva van-e.
A minta bemutatja, hogyan használható az üzenetszintű kölcsönös hitelesítés az MSMQ-val. A tanúsítványok sávon kívül vannak cserélve. Ez mindig így van az üzenetsoros alkalmazás esetében, mert a szolgáltatásnak és az ügyfélnek nem kell egyszerre futnia.
Leírás
A minta ügyfél- és szolgáltatáskódja megegyezik a Transacted MSMQ Kötés mintával egyetlen különbséggel. A műveleti szerződés védelmi szinttel van ellátva, ami arra utal, hogy az üzenetet alá kell írni és titkosítani kell.
// Define a service contract.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface IOrderProcessor
{
[OperationContract(IsOneWay = true, ProtectionLevel=ProtectionLevel.EncryptAndSign)]
void SubmitPurchaseOrder(PurchaseOrder po);
}
Annak érdekében, hogy az üzenet a szolgáltatás és az ügyfél azonosításához szükséges jogkivonattal legyen biztonságban, a App.config hitelesítő adatokat tartalmaz.
Az ügyfélkonfiguráció megadja a szolgáltatástanúsítványt a szolgáltatás hitelesítéséhez. A LocalMachine-tárolót használja megbízható tárolóként, hogy a szolgáltatás érvényességére támaszkodjon. Emellett megadja az ügyfél szolgáltatáshitelesítési üzenetéhez csatolt ügyféltanúsítványt is.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<client>
<!-- Define NetMsmqEndpoint -->
<endpoint address="net.msmq://localhost/private/ServiceModelSamplesMessageSecurity"
binding="netMsmqBinding"
bindingConfiguration="messageSecurityBinding"
contract="Microsoft.ServiceModel.Samples.IOrderProcessor"
behaviorConfiguration="ClientCertificateBehavior" />
</client>
<bindings>
<netMsmqBinding>
<binding name="messageSecurityBinding">
<security mode="Message">
<message clientCredentialType="Certificate"/>
</security>
</binding>
</netMsmqBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name="ClientCertificateBehavior">
<!--
The clientCredentials behavior allows one to define a certificate to present to a service.
A certificate is used by a client to authenticate itself to the service and provide message integrity.
This configuration references the "client.com" certificate installed during the setup instructions.
-->
<clientCredentials>
<clientCertificate findValue="client.com" storeLocation="CurrentUser" storeName="My" x509FindType="FindBySubjectName" />
<serviceCertificate>
<defaultCertificate findValue="localhost" storeLocation="CurrentUser" storeName="TrustedPeople" x509FindType="FindBySubjectName"/>
<!--
Setting the certificateValidationMode to PeerOrChainTrust means that if the certificate
is in the user's Trusted People store, then it is trusted without performing a
validation of the certificate's issuer chain. This setting is used here for convenience so that the
sample can be run without having to have certificates issued by a certification authority (CA).
This setting is less secure than the default, ChainTrust. The security implications of this
setting should be carefully considered before using PeerOrChainTrust in production code.
-->
<authentication certificateValidationMode="PeerOrChainTrust" />
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
Vegye figyelembe, hogy a biztonsági mód üzenetre van állítva, a ClientCredentialType pedig Tanúsítvány értékre van állítva.
A szolgáltatáskonfiguráció olyan szolgáltatás-viselkedést tartalmaz, amely megadja a szolgáltatás hitelesítő adatait, amelyeket az ügyfél a szolgáltatás hitelesítésekor használ. A kiszolgálótanúsítvány tulajdonosának neve a findValue< attribútumában van megadva.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<!-- Use appSetting to configure MSMQ queue name. -->
<add key="queueName" value=".\private$\ServiceModelSamplesMessageSecurity" />
</appSettings>
<system.serviceModel>
<services>
<service
name="Microsoft.ServiceModel.Samples.OrderProcessorService"
behaviorConfiguration="PurchaseOrderServiceBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/ServiceModelSamples/service"/>
</baseAddresses>
</host>
<!-- Define NetMsmqEndpoint -->
<endpoint address="net.msmq://localhost/private/ServiceModelSamplesMessageSecurity"
binding="netMsmqBinding"
bindingConfiguration="messageSecurityBinding"
contract="Microsoft.ServiceModel.Samples.IOrderProcessor" />
<!-- The mex endpoint is exposed at http://localhost:8000/ServiceModelSamples/service/mex. -->
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
<bindings>
<netMsmqBinding>
<binding name="messageSecurityBinding">
<security mode="Message">
<message clientCredentialType="Certificate" />
</security>
</binding>
</netMsmqBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="PurchaseOrderServiceBehavior">
<serviceMetadata httpGetEnabled="True"/>
<!--
The serviceCredentials behavior allows one to define a service certificate.
A service certificate is used by the service to authenticate itself to its clients and to provide message protection.
This configuration references the "localhost" certificate installed during the setup instructions.
-->
<serviceCredentials>
<serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
<clientCertificate>
<certificate findValue="client.com" storeLocation="LocalMachine" storeName="TrustedPeople" x509FindType="FindBySubjectName"/>
<!--
Setting the certificateValidationMode to PeerOrChainTrust means that if the certificate
is in the user's Trusted People store, then it is trusted without performing a
validation of the certificate's issuer chain. This setting is used here for convenience so that the
sample can be run without having to have certificates issued by a certification authority (CA).
This setting is less secure than the default, ChainTrust. The security implications of this
setting should be carefully considered before using PeerOrChainTrust in production code.
-->
<authentication certificateValidationMode="PeerOrChainTrust" />
</clientCertificate>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
A minta bemutatja, hogyan szabályozható a hitelesítés konfigurációval, és hogyan szerezheti be a hívó identitását a biztonsági környezetből, ahogyan az a következő mintakódban látható:
// Service class which implements the service contract.
// Added code to write output to the console window.
public class OrderProcessorService : IOrderProcessor
{
private string GetCallerIdentity()
{
// The client certificate is not mapped to a Windows identity by default.
// ServiceSecurityContext.PrimaryIdentity is populated based on the information
// in the certificate that the client used to authenticate itself to the service.
return ServiceSecurityContext.Current.PrimaryIdentity.Name;
}
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
public void SubmitPurchaseOrder(PurchaseOrder po)
{
Console.WriteLine("Client's Identity {0} ", GetCallerIdentity());
Orders.Add(po);
Console.WriteLine("Processing {0} ", po);
}
//…
}
Futtatáskor a szolgáltatáskód megjeleníti az ügyfélazonosítást. A szolgáltatáskód mintakimenete a következő:
The service is ready.
Press <ENTER> to terminate service.
Client's Identity CN=client.com; ECA6629A3C695D01832D77EEE836E04891DE9D3C
Processing Purchase Order: 6536e097-da96-4773-9da3-77bab4345b5d
Customer: somecustomer.com
OrderDetails
Order LineItem: 54 of Blue Widget @unit price: $29.99
Order LineItem: 890 of Red Widget @unit price: $45.89
Total cost of this order: $42461.56
Order status: Pending
Megjegyzések
Az ügyféltanúsítvány létrehozása.
A kötegfájl következő sora hozza létre az ügyféltanúsítványt. A megadott ügyfélnevet használják a létrehozott tanúsítvány tárgy mezőjében szereplő névként. A tanúsítvány a
Myáruházban, aCurrentUseráruház helyén található.echo ************ echo making client cert echo ************ makecert.exe -sr CurrentUser -ss MY -a sha1 -n CN=%CLIENT_NAME% -sky exchange -peAz ügyféltanúsítvány telepítése a kiszolgáló megbízható tanúsítványtárolójába.
A kötegfájl következő sora átmásolja az ügyféltanúsítványt a kiszolgáló TrustedPeople tárolójába, hogy a kiszolgáló meghozhassa a megfelelő megbízhatósági vagy nem megbízhatósági döntéseket. Ahhoz, hogy egy Windows Communication Foundation (WCF) szolgáltatás megbízhatónak minősítse a TrustedPeople áruházban telepített tanúsítványokat, az ügyféltanúsítvány-érvényesítési módot
PeerOrChainTrustvagyPeerTrustértékre kell állítani. Tekintse meg az előző szolgáltatáskonfigurációs mintát, amelyből megtudhatja, hogyan végezhető el ez egy konfigurációs fájl használatával.echo ************ echo copying client cert to server's LocalMachine store echo ************ certmgr.exe -add -r CurrentUser -s My -c -n %CLIENT_NAME% -r LocalMachine -s TrustedPeopleA kiszolgálótanúsítvány létrehozása.
A Setup.bat kötegfájl alábbi sorai hozzák létre a használni kívánt kiszolgálótanúsítványt:
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 -peA %SERVER_NAME% változó megadja a kiszolgáló nevét. A tanúsítvány tárolása a LocalMachine áruházban történik. Ha a beállítási kötegfájl egy szolgáltatás argumentummal (például
setup.bat service) fut, a %SERVER_NAME% tartalmazza a számítógép teljes tartománynevét. Ellenkező esetben alapértelmezés szerint a localhost lesz.Kiszolgálótanúsítvány telepítése az ügyfél megbízható tanúsítványtárolójába.
Az alábbi sor a kiszolgálótanúsítványt az ügyfél megbízható személyek tárolójába másolja. Erre a lépésre azért van szükség, mert a Makecert.exe által létrehozott tanúsítványokat az ügyfélrendszer nem implicit módon megbízhatónak minősíti. Ha már rendelkezik olyan tanúsítvánnyal, amely egy ügyfél megbízható főtanúsítványában gyökerezik – például egy Microsoft által kiadott tanúsítványban –, nem szükséges az ügyféltanúsítvány-tároló kiszolgálótanúsítvánnyal való feltöltésének ez a lépése.
certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeopleJegyzet
Ha a Microsoft Windows nem amerikai angol kiadását használja, akkor szerkesztenie kell a Setup.bat fájlt, és le kell cserélnie az "NT AUTHORITY\NETWORK SERVICE" fióknevet a területének megfelelő névre.