Создание SSL-сертификата APEX / подстановочного знака с помощью функции «Позволяет шифровать и сертификаты» - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь использовать Certes для генерации SSL-сертификата , мне удалось собрать воедино код из различных примеров и, похоже, добиться определенного прогресса. Мой код выглядит следующим образом:

public static async Task GenerateSSL(
    string companyName,
    string organizationalUnit,
    string locality,
    string state,
    string countryCode,
    string email,
    IList<string> domains, 
    string pem, 
    string password)
{
    var accountKey = KeyFactory.FromPem(pem);

    var acme = new AcmeContext(WellKnownServers.LetsEncryptV2, accountKey);

    var order = await acme.NewOrder(domains.ToList());
    var authorizations = await order.Authorizations();

    //get all of the authorizations
    foreach (var auths in authorizations)
    {
        var dnsChallenge = await auths.Dns();
        var dnsTxt = acme.AccountKey.DnsTxt(dnsChallenge.Token);

        //Set DNS settings
        Console.WriteLine(dnsTxt);

        await dnsChallenge.Validate();

        var resource = await auths.Resource();
        while (resource.Status != AuthorizationStatus.Valid)
        {
            await Task.Delay(1000);

            if (resource.Status == AuthorizationStatus.Invalid)
            {
                break;
            }
        }
    }

    //create the private key
    var privateKey = KeyFactory.NewKey(KeyAlgorithm.ES256);


    var csr = new CertificationRequestBuilder();

    string commonNames = string.Join(",", domains.Select(o => $"CN={o}"));
    string subject = $"C={countryCode}, ST={state}, L={locality}, O={companyName}, OU={organizationalUnit}, {commonNames}, emailAddress={email}\"";
    csr.AddName(subject);

    foreach (var domain in domains)
        csr.SubjectAlternativeNames.Add(domain);            

    //get the cert(s)
    await order.Finalize(csr.Generate());

    var cert = await order.Download();
    var certPem = cert.ToPem();
    var pfxBuilder = cert.ToPfx(privateKey);
    var pfx = pfxBuilder.Build(domains.First(), password);

    System.IO.File.WriteAllBytes($@"C:\temp\cert\output.pfx", pfx);

}

Однако, хотя этот код, кажется, работает успешно, когда я использую его для генерации одного сертификата для поддоменов или доменов Apex, он, похоже, дает сбой при создании сертификата с подстановочные знаки.

В частности, когда я могу успешно сгенерировать свой сертификат и загрузить его на свой сервер (вместе с привязками настройки), когда я пытаюсь получить доступ к сайту, я получаю ошибку:

Этот сайт не может быть достигнут. Соединение было сброшено.

Еще раз отмечу, что сертификаты без подстановочных знаков, похоже, работают правильно для меня.

Поэтому мне интересно, может кто-нибудь предоставить какие-либо сведения о том, как исправить этот код, чтобы я мог правильно генерировать сертификаты с подстановочными знаками, которые также поддерживают домен Apex? Я предполагаю, что что-то напутал с тем, как я настраиваю CN и SubjectAlternativeNames.

...