2011-07-30 6 views
0

Je travaille sur un projet C# où la transmission TCP entre le serveur et le client est faite en utilisant SSL. J'ai créé un fichier de certificat avec le programme makecert, mais cela ne fonctionne que sur l'ordinateur où il a été généré (bien que j'ai installé le fichier .cer). Je suis presque sûr, que le problème réside dans les paramètres que je mets en commande, mais j'ai vérifié de nombreuses combinaisons et aucune (despit suivantes) a travailléGénération de certificat SSL

makecert -r -pe -n "CN=This is my certificate" -ss my -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 ca.cer 

.cer est utilisé uniquement pour le chiffrement transmition. Je n'utilise pas l'ICP. En outre, l'utilisation de SSL est "une exigence morte" - il doit être utilisé, juste pour être utilisé. Tout problème de sécurité ne doit pas être pris en compte.

Si quelqu'un devrait me répondre, comment créer un certificat, qui pourra être utilisé par la méthode X509Certificate.CreateFromCertFile Je serais ravi.

+1

Avez-vous besoin SSH ou SSL? Ce sont deux protocoles différents. –

+0

Actuellement j'utilise la classe System.Net.Security.SslStream et sa méthode AuthenticateAsServer (X509Certificate) –

+0

Lorsque vous dites 'J'ai installé le fichier .cer' - où? Vous devez l'installer dans le magasin CA, sinon l'autre machine ne lui fera pas confiance. –

Répondre

2

Si vous contrôlez toutes les machines qui utiliseront ces certificats, vous pouvez créer une autorité de certification approuvée par toutes les machines, puis émettre des certificats basés sur ces certificats.

Voici mes fichiers batch. Le premier crée le certificat CA:

:// Create a self-signed certificate (-r), 
:// with an exportable private key (-pe), 
:// using SHA1 (-r), for signing (-sky signature). 
:// The private key is written to a file (-sv). 
makecert -r -pe -n "CN=My Root Authority" -ss CA^
    -sr CurrentUser -a sha1 -sky signature -cy authority^
    -sv CA.pvk CA.cer 

Importer le fichier .CER dans le magasin de certificats de CA sur les machines qui doivent se connecter au serveur (ils doivent faire confiance au CA):

:// Import that certificate into the 
:// "Trusted Root Certification Authorities" store. 
certutil -user -addstore Root CA.cer 

Cette on crée un certificat de serveur:

:// Create a server certificate, with an exportable private key (-pe), 
:// using SHA1 (-r) for key exchange (-sky exchange). 
:// It can be used as an SSL server certificate (-eku 1.3.6.1.5.5.7.3.1). 
:// The issuing certificate is in a file (-ic), as is the key (-iv). 
:// Use a particular crypto provider (-sp, -sy). 
makecert -pe -n "CN=server.example.com" -a sha1^
    -sky exchange -eku 1.3.6.1.5.5.7.3.1 
    -ic CA.cer -iv CA.pvk^
    -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12^
    -sv server.pvk server.cer 
pvk2pfx -pvk server.pvk -spc server.cer -pfx server.pfx 

Installez le fichier .pfx, puis obtenir le code C# serveur pour l'utiliser. Ceci est laissé comme un exercice pour le lecteur.

0

Vous devez obtenir un certificat valide. Celui généré par la commande makecert est seulement pour tester et ne fonctionnera pas sur d'autres systèmes.

+0

mais comment dois-je y parvenir :) Le programme est juste pour un usage académique, donc je ne voudrais pas collaborer avec CA. Comment pourrais-je générer un certificat valide, qui pourrait être utilisé sur deux machines différentes? –

+0

Ce sera le cas si vous l'installez correctement. Il ne devrait être utilisé que pour des tests ou à des fins internes. –

+0

que voulez-vous dire "correctement"? –

3

Merci Roger J'ai trouvé votre blog et a réussi à le faire fonctionner et de mettre un wrapper autour de sorte qu'il est facile à utiliser et j'ai aussi réussi à mettre le convivial Nom sur les certificats

using System; 
using System.Collections.Generic; 
using System.Security.Cryptography.X509Certificates; 
using System.Diagnostics; 

public class SSLCertificateCreator 
{ 
    public static string RunDosCommand(string Cmd, string Arguments) 
    {//Executes a Dos command in the current directory and then returns the result 
     string TestMessageText = ""; 
     string filePath = Environment.CurrentDirectory; 
     ProcessStartInfo pi = new ProcessStartInfo() 
     { 
      FileName = filePath + "\\" + Cmd, 
      Arguments = Arguments + " ", 
      RedirectStandardOutput = true, 
      UseShellExecute = false, 
      CreateNoWindow = false 
     }; 
     try 
     { 
      using (Process p = Process.Start(pi)) 
      { 
       p.WaitForExit(); 
       TestMessageText = p.StandardOutput.ReadToEnd(); 
       return TestMessageText; 
      } 
     } 
     catch (Exception Ex) 
     { 
      return "ERROR :" +Ex.Message; 
     } 
    } 

    public static bool MakeCACertificate(string RootCertificateName, string FriendlyName) 
    {//Make a CA certificate but only if we don't already have one and then sets the friendly name 
     if (FindCertificate("Root", RootCertificateName, OpenFlags.ReadOnly) != null) return false; //We already have this root certificate 
     string Arguments="-pe -n \"CN=" + RootCertificateName + "\" -ss Root -sr CurrentUser -a sha1 -sky signature -r \"" + RootCertificateName + ".cer\" -m 12"; 
     string Result=RunDosCommand("makecert", Arguments); 
     X509Certificate2 Cert = FindCertificate("Root", RootCertificateName, OpenFlags.ReadWrite); 
     if (Cert == null || !Result.ToLower().StartsWith("succeeded")) return false; 
     Cert.FriendlyName = FriendlyName; 
     return true; 
    } 


    public static bool MakeSignedCertificate(string RootCertificateName, string CertificateName, string FriendlyName) 
    {//Makes a signed certificate but only if we have the root certificate and then sets the friendly name 
     if (FindCertificate("Root", RootCertificateName, OpenFlags.ReadOnly) == null) return false; //We must have a valid root-certificate first 
     if (FindCertificate("my",CertificateName, OpenFlags.ReadOnly)!=null) return false;//Nope we alrady have this signed certificate 
     string Arguments = "-pe -n \"CN=" + CertificateName + "\" -ss my -sr CurrentUser -a sha1 -sky exchange -eku 1.3.6.1.5.5.7.3.1 -in \"" + RootCertificateName + "\" -is Root -ir CurrentUser -sp \"Microsoft RSA SChannel Cryptographic Provider\" -sy 12 \"" + CertificateName + ".cer\" -m 12"; 
     string Result = RunDosCommand("makecert", Arguments); 
     X509Certificate2 Cert = FindCertificate("my", CertificateName, OpenFlags.ReadWrite); 
     if (Cert==null || !Result.ToLower().StartsWith("succeeded")) return false; 
     Cert.FriendlyName = FriendlyName; 
     return true; 
    } 

    private static X509Certificate2 FindCertificate(string Store, string Name, OpenFlags Mode) 
    {//Look to see if we can find the certificate store 
     X509Store store = new X509Store(Store,StoreLocation.CurrentUser); 
     store.Open(Mode); 
     foreach (X509Certificate2 Cert in store.Certificates) 
     { 
      if (Cert.Subject.ToLower() =="cn="+ Name.ToLower()) 
       return Cert;//Yep found it 
     } 
     return null; 
    } 
} 

échantillon useage

SSLCertificateCreator.MakeCACertificate ("DavesRoot", "Nice Name"); SSLCertificateCreator.MakeSignedCertificate ("DavesRoot", "Daves Signed Certificate5", "Nice Name");

makecert.exe doit être dans le répertoire bin/Release ou Debug pour que le code fonctionne et ce code n'a jamais été testé sur Windows 8

+0

Si vous générez des certificats en C#, alors vous devriez regarder Château Bouncy. J'ai une série d'articles de blog sur le sujet: http://blog.differentpla.net/tag/bouncy-castle –