2012-02-12 19 views
8

Puede alguien me proporcione un ejemplo de cómo crear un certificado firmado, que sería aceptada por el siguiente código:Cómo utilizar makecert para crear un certificado X509 aceptado por la 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(); 

tengo utilizado

makecert -pe myCertificate 

y

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

y

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

y he tratado de generar el certificado con BouncyCastle, pero cada vez que estoy poniendo siguiente excepción:

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. 

y la excepción interna es nula.

Es probable que haya un truco, pero no lo estoy obteniendo.

¿Cómo puedo generar un certificado adecuado para mi servicio WCF?

+2

Tome un vistazo a esta forma de vincular. http://msdn.microsoft.com/en-us/library/ff648498.aspx –

+0

Este enlace fue de lo más útil para configurar el mío. Recorre todos los pasos. http://www.codeproject.com/Articles/96028/WCF-Service-with-custom-username-password-authenti – vikingben

Respuesta

1

El siguiente código funciona para mí de marco 4.0: Es importante primer
para instalar el certificado manualmente como certificado de confianza en su LocalMachine
Con el fin de hacer esto se puede instalar simplemente de Internet Explorer por abriendo la ubicación del servidor.

y segundo para responder al error del servidor, debido al certificado uno mismo signo

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; 
     // } 
    } 

    } 
} 
Cuestiones relacionadas