Не удалось добавить сертификат SSL при привязке к порту

Я создал веб-сервис с использованием WCF. Я делаю сам хостинг и хочу включить HTTPS. Из моего понимания, чтобы это произошло, мне нужно создать сертификат и привязать к порту, который я хочу использовать.

Вот шаги, которые я сделал, чтобы справиться с этим:

  1. Создал сертификат на моем локальном компьютере, чтобы действовать в качестве корневого центра сертификации
    • makecert -n "CN= Мой корневой центр сертификации" -r -sv RootCATest.pvk RootCATest.cer
  2. Открыл MMC.exe и импортировал сохраненный файл.cer в папку "Trusted Root Certificate\Certificates\".
    • makecert -sk MyKeyName -iv RootCATest.pvk -n "CN=MyMachineName" -ic RootCATest.cer -sr localmachine -ss my -sky exchange -pe MyMachineName.cer
  3. Создан временный сервисный сертификат из подписанного корневого центра сертификации.

    • makecert -sk MyKeyName -iv RootCATest.pvk -n "CN=MyMachineName" -ic RootCATest.cer -sr localmachine -ss my -sky exchange -pe MyMachineName.cer
  4. Попытка привязать сертификат к номеру порта (443 в этом случае)

    • netsh http add sslcert ipport = 0.0.0.0: 443 certhash = 2c5ba85bcbca412a74fece02878a44b285c63981 appid = {646937c0-1042-4e81-a3b6-47d678d68ba9}

Результатом шага 4 является следующая ошибка:

Ошибка добавления сертификата SSL, ошибка 1312

Указанный сеанс входа не существует. Возможно, это уже было прекращено.

Кто-нибудь знает, почему я могу получить эту ошибку?

29 ответов

У меня была такая же ошибка. В первый раз, когда это произошло, как сказал Майкл, мне пришлось переместить сертификат в папку "Сертификаты (локальный компьютер) -> Личные -> Папка сертификата". У меня была такая же ошибка, когда я импортировал тот же сертификат на другой машине. Причина была в том, что я использовал certmgr.msc для импорта сертификата., Таким образом, открытое окно показывает "Сертификаты - текущий пользователь". Сертификаты, импортированные с использованием этого окна, приводят к сбою netsh с ошибкой 1312. Обязательно используйте оснастку сертификата в MMC для импорта сертификатов. Оснастка сертификата из MMC показывает "Сертификаты (локальный компьютер)". Это позволяет netsh казнить.

SSL Certificate add failed, Error 1312

A specified logon session does not exist. It may already have been terminated.

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

Короче говоря, проблема в том, что вы установили сертификат на winrm сервер, который не имеет ЧАСТНЫЙ КЛЮЧ.

Я проверял это несколько раз. Вы должны удалить свой сертификат и восстановить его с помощью makecert например, как это прекрасно описано здесь: http://blogs.technet.com/b/jhoward/archive/2005/02/02/365323.aspx

Вы можете легко проверить, есть ли у вашего сертификата закрытый ключ, так: mmc - certificates - local machine - personal, Посмотрите на значок сертификата - он ДОЛЖЕН иметь значок ключа на значке.

Я купил официальный сертификат Thawte для защиты веб-службы (консольного приложения) через определенный порт на нашем интернет-сервере. Затем я получил сертификат Thawte и установил его с помощью mmc на нашем интернет-сервере (тогда этот сертификат можно было просмотреть в разделе "Доверенные корневые центры сертификации" (со значком ключа на изображении, что показывает, что сертификат содержит закрытый ключ, что является обязательным) . чтобы иметь возможность привязать его к порту, кстати) .

Следующим шагом было включение <port> для https:

netsh http add urlacl url=https://+:<port>/ user=everyone

(с чем не было проблем)

Следующим шагом было включение порта () для https:

netsh http add sslcert ipport=0.0.0.0:<port> certhash=<thumbprint to certificate> appid={<guid to application>}

Это не удалось с сообщением об ошибке:
Ошибка добавления сертификата SSL, ошибка: 1312 Указанный сеанс входа не существует. Это может быть уже было прекращено.

Затем я искал в Интернете и пробовал различные предлагаемые обходные пути (без успеха) .

Решением для моего случая было добавить certstorename=Root в команду netsh:

netsh http add sslcert ipport=0.0.0.0:<port *1)> certstorename=Root certhash=<thumbprint to certificate *2)> appid={<guid to application *3)>}

Заметки:
Если к команде net netsh не применено имя certstorename, по умолчанию netsh принимает значение MY (что предназначено для хранилища сертификатов: " Персональное ", где самозаверяющие сертификаты хранятся нормально) .
Корень предназначен для хранилища сертификатов: "Доверенные корневые центры сертификации"

*1): порт, который вы хотите использовать для подключения
*2): Вы можете извлечь отпечаток из сертификата, если вы открываете сертификат (в системе Windows просто дважды щелкните сертификат в проводнике) - выберите вкладку "Подробно" и нажмите "Отпечаток пальца". "Отпечаток" затем отображается и может быть скопирован. Скопируйте отпечаток и удалите все пробелы...
* 3): В качестве appid вы можете взять любой идентификатор в форме {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}, поскольку APPID является только информативным. С помощью команды "netsh http show sslcert" вы можете запросить связанные сертификаты на всей машине, и вы увидите информативное, какой appid связан с каким сертификатом (не очень полезно на практике, кстати) В моем случае я взял (из VS генерируется) GUID для моего приложения веб-службы

Я имел дело с этой проблемой, и я использую самодостаточный сервис WCF. Я только что сделал прорыв:

У меня был сертификат в папке персонала для магазина машин. Это истекло, и мой менеджер выпустил новый. Новый сбой для меня с этой ошибкой. Я пробовал много вещей из Google, но в конце концов решил проблему, используя совершенно другое решение.

Я установил оба сертификата - истекший и новый. Затем я использовал эту команду, чтобы получить их список:

certutil -store My

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

================ Certificate 1 ================
Serial Number: 6d
Issuer: E=operations@voicetrust.com, CN=VoiceTrust Server CA, OU=VoiceTrust Oper
ations, O=VoiceTrust
 NotBefore: 03-Jan-2013 3:33 PM
 NotAfter: 03-Mar-2013 3:33 PM
Subject: E=hgulzar@voicetrust.com, CN=hornet.voicetrust.com, OU=Software Develop
ment, O=VoiceTrust eServices MENA FZ LLC, L=Dubai, C=AE
Non-root Certificate
Cert Hash(sha1): 98 5f a0 d3 11 6a 4b 64 3b db 0a a4 11 66 fc 08 28 74 7e 53
  Key Container = {E5BC0912-7808-4B89-B457-31946DE5990E}
  Unique container name: dfedfcc149408fb990a3bacd6d31126b_3277b2c9-9894-46d0-9b6
4-30f0d6589239
  Provider = Microsoft Enhanced Cryptographic Provider v1.0
Private key is NOT exportable
Encryption test passed

================ Certificate 2 ================
Serial Number: 6d
Issuer: E=operations@voicetrust.com, CN=VoiceTrust Server CA, OU=VoiceTrust Oper
ations, O=VoiceTrust
 NotBefore: 03-Nov-2013 3:33 PM
 NotAfter: 03-Dec-2013 3:33 PM
Subject: E=hgulzar@voicetrust.com, CN=hornet.voicetrust.com, OU=Software Develop
ment, O=VoiceTrust eServices MENA FZ LLC, L=Dubai, C=AE
Non-root Certificate
Cert Hash(sha1): 30 5f a0 d3 11 6a 4b 64 3b db 0a a4 11 66 fc 08 28 74 7e 53
  Key Container = {E5BC0912-7808-4B89-B457-31946DE5960E}
  *Unique container name:* 55edfcc149408fb990a3bacd6d31126b_3277b2c9-9894-46d0-9b6
4-30f0d6589239
  Provider = Microsoft Enhanced Cryptographic Provider v1.0
Private key is NOT exportable
Encryption test passed

Теперь все кажется в порядке, но сертификат 1 истек и работает, если я пытаюсь привязать его к порту, в то время как сертификат 2 завершается с ошибкой 1312.

Главное отличие, которое меня озадачило, это свойство уникального имени контейнера. Он должен представлять файл физического ключа на жестком диске в %ProgramData%\Microsoft\Crypto\RSA\MachineKeys\

Для сертификата 1 файл был там, но для сертификата 2 такого файла не было. После поиска я нашел файл с сертификатом 2 в подпапке %AppData%\Microsoft\Crypto\ папка. Это пользовательские ключи, а не ключи уровня машины. Удивительно, что сертификат импортируется в компьютерный магазин, но в нем всегда хранится ключ контейнера пользовательского магазина.

Я удалил файл '55edfcc149408fb990a3bacd6d31126b_3277b2c9-9894-46d0-9b64-30f0d6589239' в папке AppData и запустил команду восстановления для моего сертификата 2 в хранилище:

certutil -repairstore My 2

На этот раз уникальное имя контейнера отражало файл в соответствующей папке в папке "%ProgramData%\Microsoft\Crypto\", и ​​все начало работать.

Надеюсь, это кому-нибудь пригодится.

Я боролся с ошибкой 1312 в течение всего дня, и мне удалось исправить это, импортировав сертификат в mmc в виде файла.p12 вместо.crt. Если вы создаете его с помощью OpenSSL, то после создания.crt выполните:

pkcs12 -export -in server.crt -inkey server.key -name “Your Name” -out server.p12

Как описано. Когда вы собираетесь импортировать его в mmc, это будет файл с именем "Обмен личной информацией" (и, очевидно, файл.pfx также будет работать).

Я новичок в написании серверов и работе с SSL, и я понятия не имею, почему это работает, но я надеюсь, что это поможет.

В моем случае проблема была в том, что к файлу CER не был прикреплен закрытый ключ.

Я подключил ПК с помощью этих команд OpenSSL:

openssl x509 -in server.der -inform DER -out server.pem -outform PEM
openssl pkcs12 -export -in server.pem -inkey serverkey.pem -out server.p12

Работает для файлов CER/DER.

Проблема была в шаге 4. Я использовал Thumbprint из корневого сертификата для значения в certhash. Чтобы решить эту проблему, мне пришлось вернуться в MMC и обновить папку "Сертификаты (локальный компьютер) -> Личные -> Сертификат". Затем используйте отпечаток большого пальца из сертификата, выданного корневым центром сертификации.

У меня была та же проблема, и я решил импортировать сертификат с помощью этой команды:

c:> certutil -importPFX certname.pfx

Теперь сертификат появляется с помощью этой команды:

c:> certutil -store my

перед этой командой сертификат не появляется

Это может показаться очевидным; однако, я думаю, что это может сэкономить кому-то время от царапин на голове. Я импортировал файл с расширением.cer в папку "Личные сертификаты" (для учетной записи персонального компьютера). Через некоторое время я понял, что мне нужно импортировать файл с расширением *.pfx. Исправлено это и вуаля! Задача решена!

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

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

Есть несколько способов получения этой ошибки (другие ответы см. Выше).

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

Убедитесь, что сертификат хранится в корневом хранилище localMachine (вы можете использовать certutil или certmgr.exe из командной строки, чтобы выгрузить его правильно).

обновленная грамматика:)

ЕСЛИ вы импортировали сертификат с помощью.NET, необходимо использовать определенные флаги импорта:

/// <summary>
/// Imports X.509 certificate from file to certificate store.
/// </summary>
/// <param name="fileName">Certificate file.</param>
/// <param name="password">Password.</param>
/// <param name="storeName">Store name.</param>
/// <param name="storeLocation">Store location.</param>
public static void ImportCertificate(string fileName, string password, StoreName storeName, StoreLocation storeLocation) {
    var keyStorageFlags =
        X509KeyStorageFlags.PersistKeySet
        | (storeLocation == StoreLocation.LocalMachine ? X509KeyStorageFlags.MachineKeySet : X509KeyStorageFlags.UserKeySet);
    var cert = new X509Certificate2(fileName, password, keyStorageFlags);
    var store = new X509Store(storeName, storeLocation);
    store.Open(OpenFlags.MaxAllowed);
    store.Add(cert);
    store.Close();
}

В ImportCertificate метод является частью Woof.Security пакет, созданный мной.

Я получал эту ошибку при попытке выполнить развертывание из конвейера Azure Devops на сервер Windows Server, на котором работает IIS. Конвейер должен развернуть сайт в IIS, а затем создать привязку https, в которой на существующий сертификат в хранилище сертификатов компьютера ссылается его отпечаток. В конвейере отпечаток должен был быть получен из группы переменных, однако правильная группа переменных не была связана с конвейером (и имя переменной было неверным) — так что ничего не получилось.

По сути, для идентификации сертификата использовался неправильный отпечаток, я подозреваю, что он не выдавал стандартное сообщение «не могу найти сертификат SSL», потому что я пытался найти сертификат с нулевым значением.

Просто чтобы бросить еще один ответ на ринг, у меня возникла проблема:

Хотя я импортировал свой сертификат в (Local Computer)\... хранилище сертификатов, я импортировал его в Trusted Root Certification Authorities раздел. Мне нужно было импортировать его в Personal раздел, в противном случае эта ошибка произошла.

В моем случае при создании сертификата я выбрал имя, отличное от My, для своего имени в Cert Store. Имя по умолчанию - МОЕ. Так что, если у вас другое, добавьте в команду имя certstorename= Ваше имя магазина.

Это мой обзор всех исправлений в этой теме и того, как это сработало для меня:

  1. Найдите «Windows PowerShell», щелкните значок правой кнопкой мыши и выберите «Запуск от имени администратора».
  2. Найдите «Wordpad», щелкните значок правой кнопкой мыши и выберите «Запуск от имени администратора». (это значит, что вы можете копировать и вставлять между PowerShell и Wordpad.)
  3. В PowerShell запустите «netsh HTTP show sslcert».
  4. Из отображаемой информации скопируйте «Хэш сертификата», «Идентификатор приложения» и «Имя хранилища сертификатов». (Все это вам понадобится через мгновение.)
  5. (При необходимости) найдите свой файл * .cer или * .crt и экспортируйте его как файл *.pfx.
  6. В Powershell перейдите в папку с вашим файлом *.pfx.
  7. Теперь запустите certutil -importPFX .pfx.
  8. Затем запустите certutil -store my, чтобы показать установленные сертификаты.
  9. Теперь, используя информацию из шага №4, запустите этот "netsh http add sslcert ipport = 0.0.0.0: 8000 certstorename = certhash = appid =" (мне пришлось поместить их в этом порядке, с моим именем хранилища сертификатов и одинарными кавычками вокруг идентификатор приложения.)
  10. Убедитесь, что сертификат SSL был добавлен, снова запустив "netsh HTTP show sslcert".

Если:

  1. у вас не было IIS на вашей машине (скажем, работа с автономным WCF), и
  2. вы сделали запрос сертификата на другом компьютере с помощью диспетчера IIS (потому что вы не понимали, что закрытый ключ поступает от шифров, встроенных в запрос сертификата, а затем от .pb7)

затем:

  1. просто иди установи .pb7 на компьютере IIS, который вы использовали для запроса сертификата (локальный компьютер / личный / сертификаты - с использованием mmc);
  2. экспортировать сертификат с этого компьютера, включая его закрытый ключ (назначить пароль); а также
  3. установите его с помощью mmc на сервере WCF (локальный компьютер / личные / сертификаты - используя mmc).

Затем, netsh позволит вам привязать к порту 443. Не более 1312 ошибок.

В моем случае у меня отсутствует закрытый ключ сертификата .

У меня была точно такая же проблема, хотя мой файл.pfx имел закрытый ключ. Добавление сертификата с консоли MMC прошло успешно, но при программном добавлении с использованием метода.Net X509Store.Add(X509Certificate2) каждый раз возникала ошибка с ошибкой 1312. Сертификат даже имел значок ключа на значке.
Через несколько дней, наконец, решили сделать новый сертификат, используя ma kecert.exe, как предложено в сообщениях здесь. После этого все было хорошо. Ключ появился в%ProgramData%\Microsoft\Crypto\RSA\MachineKeys. По какой-то причине мой предыдущий файл pfx был несовместим.

По моему опыту, до тех пор, пока ваш ключ не появится в%ProgramData%\Microsoft\Crypto\RSA\MachineKeys\, привязка с помощью 'netsh http add sslcert ....' не будет выполнена.

После безуспешных попыток нескольких решений у меня на рабочем столе оказался файл .pfx, я щелкнул правой кнопкой мыши и выбрал «Установить PFX». Я прошел через этот процесс и... это сработало. Я понятия не имею, почему, но, возможно, это кому-то поможет.

Наконец я решил это. Проблема в файле сертификата. Я протестировал его на другом Mac и потерпел неудачу. Вот мое решение.

  1. Удалять.cerфайл
  2. Пересоздайте файл сертификата.
  3. В случае неудачи также заново создайте файл CSR.

Спасибо.

Похоже, это общая ошибка. Мой фикс не похож на все остальные.

Используя Azure Devops для развертывания, шагхэш сертификата спрятан/спрятан в(единственный способ увидеть хэш сертификата — отредактировать этот конкретный фрагмент), поэтому вам нужно обновить хеш, чтобы он совпадал с сервером, на котором вы развертываете. И вуаля, все готово.

certstorename аргумент должен быть строковым значением перечисления StoreName из пространства имен.net framework System.Security.Cryptography.X509Certificates,

У меня была такая же ошибка при создании самозаверяющего сертификата с OpenSSL(BouncyCastle). Я решил эту проблему с помощью этого поста: Невозможно экспортировать сгенерированный сертификат с закрытым ключом в байтовый массив в.net 4.0/4.5

Я должен был добавить:

        RsaPrivateKeyStructure rsa = RsaPrivateKeyStructure.GetInstance(seq); //new RsaPrivateKeyStructure(seq);
        RsaPrivateCrtKeyParameters rsaparams = new RsaPrivateCrtKeyParameters(
            rsa.Modulus, rsa.PublicExponent, rsa.PrivateExponent, rsa.Prime1, rsa.Prime2, rsa.Exponent1, rsa.Exponent2, rsa.Coefficient);

        var rsaPriv = DotNetUtilities.ToRSA(rsaparams);

        var cspParams = new CspParameters
        {
            KeyContainerName = Guid.NewGuid().ToString(),
            KeyNumber = (int)KeyNumber.Exchange,
            Flags = CspProviderFlags.UseMachineKeyStore
        };

        var rsaPrivate = new RSACryptoServiceProvider(cspParams);**

        // Import private key from BouncyCastle's rsa
        rsaPrivate.ImportParameters(rsaPriv.ExportParameters(true));

        // Set private key on our X509Certificate2
        x509.PrivateKey = rsaPrivate;

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

netsh http add sslcert ipport=0.0.0.0:8081 certhash=1061a577f0cc1c428186000dc84f02a7111ca1b2 appid={GUID}

На моей стороне предоставленные файлы представляли собой файл P7B вместе с кучей файлов сертификатов. После того, как я застрял, я попросил помощи моего коллеги, и он подал мне идею импортировать сертификаты вместе с закрытым ключом через PFX.

Эта статья дала мне инструкцию по преобразованию файла P7B в PFX. Подводя итог, вам просто нужно сделать следующее:

  1. Используйте openssl, чтобы сначала преобразовать файл P7B в PEM
  2. Конвертируйте файл PEM в PFX

Теперь вы можете импортировать файл PFX. Лучше прочитать статью, о которой я говорил выше, потому что в ней есть важная информация, которую следует отметить.

Я работал над этим часами и в основном читал то, что сказал @DoomerDGR8 выше, но мое исправление было намного проще. Я побежал

 C:\Windows\system32> certutil -store TRUSTEDPUBLISHER

В этом списке перечислены несколько сертификатов, которые я установил, затем я запустил хранилище исправлений для сертификата, который у меня возникла проблема при установке с netsh.

C:\Windows\system32> certutil -repairstore TRUSTEDPUBLISHER 6

Число 6 в конце представляет индекс вашего сертификата, найденного в магазине, надеюсь, это поможет

У меня просто была еще одна ошибка. Я продлил срок действия сертификата с истекшим сроком действия для нашей службы WorkFolders из нашего центра сертификации, используя тот же закрытый ключ. Тогда я всегда получал ошибку 1312. Даже если управление сертификатами показывает, что у меня есть закрытый ключ.
Я мог решить эту проблему только путем повторной выдачи нового сертификата (без опции продления). Тогда это сработало с первой попытки.
Возможно, это поможет кому-то, кто также попробовал продлить вариант.

Так что добавить (пока) исправить / ситуацию.

У меня был код C#, который использовал BouncyCastle для создания самозаверяющих сертификатов.

<packages>
  <package id="BouncyCastle" version="1.8.1" targetFramework="net45" />

Поэтому мой код создал сертификаты и поместил их в правильные места в Cert-Store.

Используя подсказки, моя установка On Premise Service Bus 1.1 провалилась... и это привело меня сюда.

Я закончил тем, что удалил оба сертификата, которые создал мой код BouncyCastle (из хранилища сертификатов), и снова импортировал их (с закрытыми ключами).... и все заработало. Я импортировал в первую очередь

Сертификаты (локальный компьютер) / Личные / Сертификаты

затем я скопировал вставленные (в mmc) в любые другие места (магазины) которые мне были нужны.

Мои "до" и "после" выглядели точно так же с моих глаз в MMC, НО это исправило проблему. Пойди разберись.

Другие вопросы по тегам