80

我使用 WCF 创建了一个 WebService。我正在做自我托管,我想启用 HTTPS。根据我的理解,我需要创建一个证书并绑定到我想要使用的端口。

以下是我为处理此问题所做的步骤:

  1. 在我的本地计算机上创建了一个证书作为根证书颁发机构
    • makecert -n "CN=My Root Certificate Authority" -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 添加 sslcert ipport=0.0.0.0:443 certash=2c5ba85bcbca412a74fece02878a44b285c63981 appid={646937c0-1042-4e81-a3b6-47d678d68ba9}

第 4 步的结果是以下错误:

SSL 证书添加失败,错误 1312

指定的登录会话不存在。它可能已经被终止。

有谁知道为什么我可能会收到此错误?

4

25 回答 25

63

我有同样的错误。正如 Micheal 所说,第一次发生时,我不得不将证书移动到 Certificates(Local Computer) --> Personal -->Certificate 文件夹下。当我在另一台机器上导入相同的证书时,我遇到了同样的错误。原因是我使用 certmgr.msc 导入证书。. 因此打开的窗口显示“证书 - 当前用户”。使用此窗口导入的证书会导致 netsh 失败并出现 1312 错误。确保使用 MMC 中的证书管理单元来导入证书。MMC 的证书管理单元显示“证书(本地计算机)”。这让 netsh 执行顺利通过。

于 2013-04-18T18:02:37.517 回答
51
SSL Certificate add failed, Error 1312

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

我曾经遇到过完全相同的问题,并花了几天时间试图找出原因。

长话短说:问题是您在winrm没有 PRIVATE KEY 的服务器上安装了证书。

我已经检查了好几次了。您必须删除您的证书并使用makecert例如重建它,因为它在这里完美描述:http: //blogs.technet.com/b/jhoward/archive/2005/02/02/365323.aspx

您可以轻松检查您的证书是否具有私钥,如下所示:mmc- certificates- local machine- personal。查看证书的图标 - 它必须在图标上有钥匙标志。

于 2014-11-20T13:05:13.617 回答
31

我已经购买了官方 Thawte 证书,以通过我们的 Internet 服务器上的特定端口保护自托管(控制台应用程序)Web 服务。然后我收到了 Thawte 证书并在我们的 Internet 服务器上使用 mmc 安装了它(然后可以在“受信任的根证书颁发机构”下查看证书(图像上带有钥匙图标,表明证书包含私钥)这是强制性的能够将其绑定到端口 btw) 。

下一步是<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)>}

注意:
如果没有将 certstorename 应用于 net netsh 命令,netsh 采用默认值,即什么是 MY(针对证书存储:“<strong>Personal”,其中自签名证书正常存储)。
以证书存储为目标:“受信任的根证书颁发机构”</p>

*1):端口,您要使用的连接
*2):您可以提取证书的指纹,如果您打开证书(在 Windows 系统上,只需在资源管理器中双击证书) - 选择选项卡“详细信息”并单击“指纹”。然后显示“指纹”并可以复制。复制指纹并删除所有空格...
*3):作为 appid,您可以采用 {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} 形式的任何 ID,因为 APPID 仅提供信息。使用命令“netsh http show sslcert”,您可以查询整台机器上绑定的证书,然后会看到信息,即哪个 appid 绑定到哪个证书(顺便说一句,在实践中并没有真正的帮助)在我的情况下,我采用了(来自VS生成)我的Web服务应用程序的GUID

于 2017-01-18T13:20:59.953 回答
21

我一直在处理这个问题,我正在使用自托管的 WCF 服务。我刚刚取得了突破:

我在机器商店的人员文件夹中有一个证书。它过期了,我的经理发出了新的。新的对我来说失败了这个错误。我从谷歌尝试了很多东西,但最后,使用完全不同的解决方案解决了这个问题。

我安装了两个证书——过期的和新的。然后我使用这个命令来获取它们的列表:

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 绑定到端口,证书 1 已过期并且可以工作,而证书 2 失败并出现错误 1312。

让我感到困惑的关键区别是唯一容器名称属性。它应该代表硬盘驱动器上的物理密钥文件%ProgramData%\Microsoft\Crypto\RSA\MachineKeys\

对于证书 1,该文件在那里,但对于证书 2,没有这样的文件。搜索后,我在文件夹的子文件夹中找到了针对证书 2 的%AppData%\Microsoft\Crypto\文件。那是用户特定的键而不是机器级键。令人惊讶的是,证书正在导入到计算机存储中,但它始终保留用户存储的容器密钥。

我删除了 AppData 文件夹下的“55edfcc149408fb990a3bacd6d31126b_3277b2c9-9894-46d0-9b64-30f0d6589239”文件,并在商店中为我的证书 2 运行了修复命令:

certutil -repairstore My 2

这一次,唯一容器名称反映了“%ProgramData%\Microsoft\Crypto\”下正确文件夹中的一个文件,一切都开始工作了。

希望这对某人有帮助。

于 2013-11-04T11:20:13.997 回答
9

我整天都在与错误 1312 作斗争,为我解决的问题是将 mmc 中的证书作为 .p12 文件而不是 .crt 导入。如果您使用 OpenSSL 创建它,那么一旦您创建了 .crt,请执行以下操作:

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

如上所述。当您将其导入 mmc 时,它将是一个名为“个人信息交换”的文件(显然 .pfx 文件也可以使用)。

我是编写服务器和处理 SSL 的新手,我不知道为什么会这样,但我希望它会有所帮助。

于 2014-06-03T22:47:10.597 回答
6

问题出在第 4 步。我使用根证书中的指纹作为 certash 中的值。为了解决这个问题,我不得不回到 MMC 并刷新证书(本地计算机)--> 个人 --> 证书文件夹。然后使用根证书颁发机构“颁发”的证书中的指纹。

于 2012-10-26T18:12:45.810 回答
6

我的问题是 CER 文件没有附加私钥。

我使用这些 OpenSSL 命令附加了 PK:

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 文件。

于 2014-06-11T11:10:25.163 回答
5

我遇到了同样的问题并解决了使用此命令导入证书的问题:

c:> certutil -importPFX certname.pfx

现在使用以下命令显示证书:

c:> certutil -store my

在此命令之前,证书不会出现

于 2015-10-26T16:43:13.223 回答
4

这似乎很明显;但是,我认为它可以节省一些时间。我在我的个人证书文件夹(用于个人计算机帐户)下导入了一个扩展名为 .cer 的文件。过了一会儿,我意识到我需要导入扩展名为 *.pfx 的文件。解决了这个问题,瞧!问题解决了!

于 2017-01-09T17:13:12.460 回答
2

有多种接收此错误的方法(有关其他答案,请参见上文)。

接收此特定错误的另一种方法是在证书不在适当的存储区时尝试将证书绑定到端口。

验证证书是否存储在 localMachine 根存储中(您可以从命令行使用 certutil 或 certmgr.exe 正确转储它)。

更新语法:)

于 2014-01-07T21:25:44.307 回答
1

如果:

  1. 你的机器上没有 IIS(比如说使用自托管的 WCF),并且
  2. 您使用 IIS 管理器在另一台机器上提出了证书请求(因为您不明白私钥来自嵌入在证书请求中的密码 - 以及后来发布的.pb7

然后:

  1. 只需.pb7在用于发出证书请求的 IIS 机器上安装(本地机器/个人/证书 - 使用 mmc);
  2. 从该机器导出证书,包括其私钥(分配密码);和
  3. 在 WCF 服务器上使用 mmc 安装它(本地机器/个人/证书 - 使用 mmc)。

然后,netsh将让您绑定到端口 443。不再出现 1312 错误。

于 2015-04-03T19:09:04.273 回答
1

只是把另一个答案扔进戒指,这就是我遇到的问题:

尽管我将证书导入(Local Computer)\...证书存储区,但我已将其导入该Trusted Root Certification Authorities部分。我需要将其导入该Personal部分,否则会发生此错误。

于 2016-02-24T16:12:44.087 回答
1

如果您使用 .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我创建的包的一部分。

于 2019-07-18T17:44:58.470 回答
1

如果其他人遇到这个问题并且这里的答案没有明确回答,则潜在的核心问题是需要导入私钥。如果您在导入证书时没有将证书标记为可导出,则不会导入私钥并且无法绑定它。如果您将其删除并重新导入并将其标记为可导出,那么它将起作用。

正如其他人所指出的,它还需要是本地机器存储。

于 2017-09-27T21:00:27.663 回答
1

就我而言,我缺少证书 私钥。

于 2018-12-03T17:12:28.423 回答
0

即使我的 .pfx 文件有私钥,我也遇到了完全相同的问题。使用 MMC 控制台添加证书是成功的,但使用 .Net X509Store.Add(X509Certificate2) 方法以编程方式添加每次都失败,错误 1312。证书甚至在图标上有一个键符号。
几天后,最终决定按照此处帖子中的建议使用 makecert.exe 制作新证书。之后一切都很好。密钥出现在 %ProgramData%\Microsoft\Crypto\RSA\MachineKeys 中。由于某种原因,我之前的 pfx 文件不兼容。

根据我的经验,只要您的密钥没有出现在 %ProgramData%\Microsoft\Crypto\RSA\MachineKeys\ 中,与“netsh http add sslcert ....”绑定就会失败。

于 2015-01-29T08:37:10.167 回答
0

这是我对这个线程中所有修复以及它对我的工作方式的总结:

  1. 找到“Windows PowerShell”,右键单击该图标,然后选择“以管理员身份运行”。
  2. 找到“写字板”,右键单击图标,选择“以管理员身份运行”。(这样您就可以在 PowerShell 和写字板之间进行复制和粘贴。)
  3. 在 PowerShell 中运行“netsh HTTP show sslcert”。
  4. 从显示的信息中,复制“证书哈希”、“应用程序 ID”和“证书存储名称”。(稍后您将需要所有这些。)
  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='' (我必须将它们按此顺序排列,带有我的证书商店名称和单引号应用程序 ID。)
  10. 通过再次运行“netsh HTTP show sslcert”检查是否添加了 SSL 证书。
于 2021-02-23T22:51:43.600 回答
0

我刚刚又犯了一个错误。我使用相同的私钥从我们的 CA 更新了我们的 WorkFolders 服务的过期证书。然后我总是得到错误 1312。即使证书管理显示我有一个私钥。
我只能通过重新颁发新证书(没有更新选项)来解决问题。然后它在第一次尝试中起作用。
也许这会帮助那些也尝试过更新选项的人。

于 2017-05-08T10:56:13.510 回答
0

对我来说,问题是通过确保我在命令行中使用的证书哈希与安装在我的服务器上的证书相对应来解决的:

netsh http 添加 sslcert ipport=0.0.0.0:8081 certash= 1061a577f0cc1c428186000dc84f02a7111ca1b2 appid={GUID}

于 2020-06-09T15:14:57.420 回答
0

所以添加(还)修复/情况。

我有使用 BouncyCastle 创建自签名证书的 C# 代码。

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

所以我的代码创建了证书并将它们放在 Cert-Store 中的正确位置。

使用此处的提示,我安装的 On Premise Service Bus 1.1 失败了……这导致我来到这里。

我最终删除了我的 BouncyCastle 代码创建的两个证书(从证书存储)并重新导入它们(使用私钥)......并且一切正常。我将 FIRST 导入到

证书(本地计算机)/个人/证书

然后我将粘贴的(在 mmc 中)复制到我需要的任何其他地方(商店)。

在 MMC 中,我的“之前”和“之后”看起来完全一样,但它解决了这个问题。去搞清楚。

于 2017-04-28T19:37:53.200 回答
0

就我而言,在创建证书时,我为我的证书存储名称选择了一个不同于 My 的名称。默认名称为 MY。因此,如果您的不同,请将您提供的商店名称附加到命令中。

于 2017-01-17T07:28:52.030 回答
0

在我这边,提供的文件是一个 P7B 文件和一堆证书文件。卡住后,我向同事寻求帮助,他给了我一个想法,通过 PFX 将证书与私钥一起导入。

本文为我提供了将 P7B 文件转换为 PFX 的说明总而言之,您只需执行以下操作:

  1. 先用openssl把P7B文件转成PEM
  2. 将 PEM 文件转换为 PFX

您现在可以导入 PFX 文件。最好阅读我上面提到的文章,因为它有重要的信息需要注意。

于 2020-08-28T15:04:39.083 回答
0

certstorename参数应该是来自 .net 框架命名空间的StoreName枚举的字符串值System.Security.Cryptography.X509Certificates

于 2016-06-09T14:45:13.963 回答
0

我已经为此工作了几个小时,基本上通读了上面@DoomerDGR8 所说的内容,但我的修复要简单得多。我跑了

 C:\Windows\system32> certutil -store TRUSTEDPUBLISHER

这列出了我已安装的几个证书,然后我在使用 netsh 安装时遇到问题的证书上运行了修复商店。

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

末尾的数字6代表您的证书索引,在商店中找到,希望对您有所帮助

于 2016-07-11T16:09:09.097 回答
0

我在使用 OpenSSL(BouncyCastle) 创建自签名证书时遇到了同样的错误我在这篇文章的帮助下解决了这个问题: Cannot export generated certificate with private key to byte array in .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;
于 2017-01-31T10:46:43.797 回答