2012-02-12 14 views
8

Czy ktoś może podać mi przykład o tym, jak stworzyć własny podpisany certyfikat, który zostanie zaakceptowany przez następujący kod:Jak korzystać MakeCert aby utworzyć certyfikat X509 zaakceptowany przez WCF

 ServiceHost svh = new ServiceHost(typeof(MyClass)); 

     var tcpbinding = new NetTcpBinding(SecurityMode.TransportWithMessageCredential, true); 
     //security 
     tcpbinding.Security.Message.ClientCredentialType = MessageCredentialType.UserName; 
     svh.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = new BWUserNamePasswordValidator(); 
     svh.Credentials.UserNameAuthentication.UserNamePasswordValidationMode =UserNamePasswordValidationMode.Custom; 
     svh.Credentials.ServiceCertificate.Certificate = BookmarkWizSettings.TcpBindingCertificate; 
     .... 
     svh.Open(); 

mam stosuje

makecert -pe myCertificate 

i

makecert -sv SignRoot.pvk -cy authority -r signroot.cer -a sha1 -n "CN=Dev Certification Authority" -ss my -sr localmachine 

i

makecert -r -pe -n "CN=Client" -ss MyApp -sky Exchange 

i Próbowałem wygenerować certyfikat z BouncyCastle, ale za każdym razem dostaję następujący wyjątek:

It is likely that certificate 'CN=Dev Certification Authority' may not have a 
private key that is capable of key exchange or the process may not have access 
rights for the private key. Please see inner exception for detail. 

i wewnętrzna Wyjątkiem jest null.

Jest to prawdopodobnie sztuczka, ale nie rozumiem.

Jak wygenerować odpowiedni certyfikat dla mojej usługi WCF?

+2

Spójrz na to jak połączyć. http://msdn.microsoft.com/en-us/library/ff648498.aspx –

+0

Ten link był dla mnie najbardziej pomocny podczas konfiguracji. Przechodzi wszystkie etapy. http://www.codeproject.com/Articles/96028/WCF-Service-with-custom-username-password-authenti – vikingben

Odpowiedz

1

Poniższy kod działa dla mnie Framework 4.0: Ważne Pierwszym jest
zainstalować certyfikat ręcznie jako zaufanego certyfikatu w LocalMachine
Aby to zrobić można go zainstalować tylko z Internet Explorer otwarcie lokalizacji serwera.

i drugi zareagować na błąd serwera, ponieważ świadectwa własnym znakiem

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Security.Cryptography.X509Certificates; 
using System.Net; 
using System.Net.Security; 
namespace WCFSelfSignCert 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     //You have to install your certificate as trusted certificate in your LocalMachine 

     //create your service client/ procy 
     using (MyProxy.ServiceClient client = new MyProxy.ServiceClient()) 
     { 

      //server certification respond with an error, because doesnt recognize the autority 
      ServicePointManager.ServerCertificateValidationCallback += OnServerValError; 


      //Assign to self sign certificate 
      client.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.LocalMachine, 
      StoreName.Root, 
      X509FindType.FindBySubjectName, 
      "MY custom subject name"); //SubjectName(CN) from certificate 

      //make a test call to ensure that service responds 
      var res = client.echo("test"); 

      Console.WriteLine(res); 
      Console.ReadKey(); 
     } 

    } 

    public static bool OnServerValError(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
    { 
     //mute the error, or provide some custom validation code 
     return true; 

     //or more restrictive 

     // if (sslPolicyErrors == SslPolicyErrors.RemoteCertificateNameMismatch) 
     //{ 


     // return true; 
     // } 
     // else 
     //{ 

     // return false; 
     // } 
    } 

    } 
}