Генерация SSL-сертификата - PullRequest
0 голосов
/ 30 июля 2011

Я работаю над проектом C #, в котором передача tcp между сервером и клиентом осуществляется с использованием SSL. Я создал файл сертификата с помощью программы makecert, но он работает только на том компьютере, на котором он был создан (хотя я установил файл .cer). Я почти уверен, что проблема заключается в параметрах, которые я ввел в команду, но я проверил много комбинаций, и ни одна (не считая следующих) не сработала

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

.cer файл используется только для шифрования передачи. Я не использую PKI. Кроме того, использование SSL является «мертвым требованием» - его нужно использовать только для использования. Любые проблемы безопасности не должны рассматриваться.

Если кто-нибудь ответит мне, как создать сертификат, который сможет использовать X509Certificate.CreateFromCertFile , я был бы рад.

Ответы [ 3 ]

3 голосов
/ 29 января 2014

Спасибо, Роджер, я нашел твой блог, сумел заставить его работать и обернул его, чтобы его было легко использовать, и мне также удалось установить дружественное имя в сертификатах

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

Образец использования

SSLCertificateCreator.MakeCACertificate ("DavesRoot", "Nice Name"); SSLCertificateCreator.MakeSignedCertificate («DavesRoot», «Сертификат с подписью Daves5», «Nice Name»);

makecert.exe должен находиться в каталоге Bin / Release или Debug, чтобы код работал, и этот код только когда-либо тестировался на Windows-8

2 голосов
/ 30 июля 2011

Если вы контролируете все машины, которые будут использовать эти сертификаты, вы можете создать ЦС, которому доверяют все машины, а затем выдать сертификаты на его основе.

Вот мои пакетные файлы.Первый создает сертификат 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

Импортируйте файл .CER в хранилище сертификатов CA на тех машинах, которые должны подключаться к серверу (они должны доверять CA):

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

Этот создает сертификат сервера:

:// 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

Установите файл .pfx, а затем получите код сервера C # для его использования.Это оставлено в качестве упражнения для читателя.

0 голосов
/ 30 июля 2011

Вам необходимо получить действующий сертификат. Тот, что сгенерирован командой makecert, предназначен только для тестирования и не будет работать в других системах.

...