在绑定端口时,SSL 证书添加失败

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

以下是我处理这个问题的步骤:

  1. 在我的本地机器上创建一个证书作为根证书权威
    • Makecert-n“ CN = 我的根证书权威”-r-sv RootCATest.pvk RootCATest.cer
  2. 打开 MMC.exe 并将保存的. cer 文件导入到“ Trusted 根证书凭证文件夹”中
    • 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

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

有人知道为什么我会得到这个错误吗?

134873 次浏览

问题出在第4步。我用了根证书上的拇指指纹来计算 certhash 的值。为了解决这个问题,我必须返回到 MMC 并刷新证书(本地计算机)—— > 个人—— > 证书文件夹。然后使用由根证书授权机构“颁发”的证书中的拇指指纹。

我也犯了同样的错误。第一次出现这种情况时,正如 Micheal 所说,我必须将证书移动到“证书(本地计算机)”—— > “个人”—— > “证书”文件夹下。当我在另一台机器上导入相同的证书时,也出现了同样的错误。原因是我使用 certmgr.msc 导入证书。.因此打开的窗口显示“证书-当前用户”。使用此窗口导入的证书导致 netsh 失败,并出现1312错误。确保在 MMC 中使用证书管理单元导入证书。来自 MMC 的证书管理单元显示“证书(本地计算机)”。这使得 netsh 的执行可以顺利进行。

我一直在处理这个问题,我正在使用一个自主的周转基金服务,我刚刚取得了突破:

我在机器商店的个人文件夹里有一张证书。过期了,我的经理又发了一张新的。因为这个错误,新的程序失败了。我尝试了很多来自谷歌的东西,但最终,解决了这个问题使用一个完全不同的解决方案。

我安装了两个证书-过期的和更新的。然后,我使用这个命令获得它们的列表:

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,不存在这样的文件。搜索之后,我在 %AppData%\Microsoft\Crypto\文件夹的子文件夹中找到了针对证书2的文件。那是用户密钥,不是机器级密钥。令人惊讶的是,证书正在进口到计算机商店,但它始终保持用户的商店的容器密钥。

我删除了 AppData 文件夹下的“55edfcc149408fb990a3bacd6d31126b _ 3277b2c9-9894-46d0-9b64-30f0d6589239”文件,并在存储中运行证书2的修复命令:

certutil -repairstore My 2

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

希望这对某些人有帮助。

有多种方式接收此错误(请参阅上面的其他答案)。

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

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

更新语法:)

我一整天都在纠正1312错误,修正它的方法是将 mmc 中的证书导入为。P12文件代替。对不起。如果您使用 OpenSSL 创建它,那么一旦您创建了。做:

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

如上所述。当你在 mmc 中导入它的时候,它会是一个叫做“个人信息交换”的文件(显然是一个。Pfx 文件也可以)。

我刚开始编写服务器和处理 SSL,我不知道为什么这个工作,但我希望它有所帮助。

我的情况下,问题是 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 文件。

SSL Certificate add failed, Error 1312


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

我以前也有过同样的问题,花了几天时间试图找出原因。

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

我已经检查过好几次了。您必须删除证书并通过使用 makecert重新构建它,正如这里所完美描述的那样: http://blogs.technet.com/b/jhoward/archive/2005/02/02/365323.aspx

您可以很容易地检查您的证书是否有私钥,如下所示: mmc-certificates-local machine-personal。查看证书的图标-它必须在图标上有密钥签名。

我也有同样的问题。Pfx 文件有私钥。使用 MMC 控制台添加证书是成功的,但使用。网络 X509Store。Add (X509Cericate2)方法每次都失败,错误为1312。证书甚至在图标上有一个密钥签名。
几天后,最终决定使用 makecert.exe 制作新的证书。之后一切都很好。出现在% ProgramData% Microsoft Crypto RSA MachineKeys 中。由于某种原因,我早期的 pfx 文件不兼容。< br > < br > 根据我的经验,只要您的密钥没有出现在% ProgramData% Microsoft Crypto RSA MachineKeys 中,用“ netsh http add sslcert... .”绑定就会失败。

如果:

  1. 您的机器上没有 IIS (比方说,使用自托管的 WCF) ,并且
  2. 您使用 IIS Manager 在另一台计算机上发出了证书请求(因为您不知道私钥来自嵌入在证书请求中的密码——以及后来发出的 .pb7)

然后:

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

然后,netsh将允许您绑定到端口443。不再有1312错误。

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

c:> certutil -importPFX certname.pfx

现在,证书使用以下命令出现:

c:> certutil -store my

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

这是我的问题所在:

虽然我将证书导入到了 (Local Computer)\...证书存储中,但是我已经将它导入到了 Trusted Root Certification Authorities部分。我需要将它导入到 Personal部分,否则就会发生这个错误。

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

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

 C:\Windows\system32> certutil -store TRUSTEDPUBLISHER

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

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

最后的数字 6表示您的证书的索引,在商店中找到,希望这有所帮助

这似乎是显而易见的,但是,我认为它可以节省一些时间的挠头。我导入了一个文件。在我的个人证书文件夹下(个人电脑帐户)。过了一会儿,我意识到我需要用 * 导入文件。改为 pfx 扩展名。修好了!问题解决了!

在我的例子中,在创建证书时,我选择了与“我的证书商店名称”不同的名称。默认名称是 MY。因此,如果您的不同,将 certstorename = 您提供的商店名称附加到命令。

我买了一个 官方的陶特证书,以确保自托管(控制台应用)的网络服务通过我们的互联网服务器上的特定端口。 然后,我收到了 Thawte 证书,并将其与 mmc 一起安装在我们的互联网服务器上(该证书随后可以在“受信任的根证书颁发机构”下查看(带有图像上的密钥图标,表明该证书包含一个私钥,必须将其绑定到端口 b.t.w.)。

下一步是为 https 启用 <port>:

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

(什么是没有问题)

下一步是为 https 启用 port () :

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 应用于 netsh 命令,netsh 将获取 默认情况下,什么是我的(目标是证书存储区: 通常存储 自签的证书的“ 私事”)。
Root 目标证书存储区: “ Trusted Root 證书颁发机构”

* 1) : 端口,你想使用连接
* 2) : 如果你打开证书(在 windows 系统上,只需在资源管理器中双击该证书) ,你可以提取该证书的拇指指纹-选择“详细信息”选项卡,然后点击“拇指指纹”。“拇指指纹”,然后显示,并可以复制。复制拇指指纹,删除所有空格..。
* 3) : 作为应用程序,你可以使用{ xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx }形式的任何 ID,因为 APPID 只提供信息。 使用“ netsh http show sslcert”命令,您可以查询整个计算机上绑定的证书,并且将看到信息,哪个 appid 绑定到哪个证书(在实践 b.t.w 中没有真正的帮助) 在我的例子中,我将(从 VS 生成的) GUID 带到我的 Web 服务应用程序

我在使用 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;

因此,添加(尚未)修复/情况。

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

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

因此,我的代码创建了证书,并将它们放置在证书商店的正确位置。

根据这里的提示,我的 On Premise Service Bus 1.1的安装失败了... ... 于是我来到了这里。

我最终删除了我的 BouncyCastle 代码创建的两个证书(从 cert 商店)并重新导入它们(使用私钥) ... ... 这一切都奏效了。 我把 FIRST 进口到

证书(本地电脑)/个人/证书

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

我的“之前”和“之后”看起来完全一样,从我的眼睛在 MMC,但它解决了问题。想想看。

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

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

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

在我的情况下,我缺少证书 私人钥匙。

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

对我来说,通过确保我在命令行中使用的证书散列与安装在服务器上的证书对应,问题得到了解决:

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 文件。最好阅读我上面提到的文章,因为它有重要的信息需要注意。

下面是我对这个线程中所有修复的总结,以及它是如何对我起作用的:

  1. 找到“ Windows PowerShell”,右键单击图标,然后选择“以管理员身份运行”。
  2. 找到“ Wordpad”,右键单击图标,然后选择“ run as management”。(这样你就可以在 PowerShell 和 Wordpad 之间复制粘贴了。)
  3. 在 PowerShell 中运行“ netsh HTTP show sslcert”。
  4. 从显示的信息中,复制“证书散列”、“应用程序 ID”和“证书存储区名称”。(你马上就需要这些了。)
  5. (如果需要)定位您的 * . cer 或 * . crt 文件并将其导出为 * . pfx 文件。
  6. 在 Powershell,导航到 * . pfx 文件的文件夹。
  7. 现在运行“ certutil-import PFX. pfx”。
  8. 然后运行“ certutil-store my”来显示已安装的证书。
  9. 现在使用步骤 # 4中的信息运行这个“ netsh http add sslcert ipport = 0.0.0.0:8000 certstorename = certhash = appid =”(我必须按照这个顺序放置它们,包括我的 cert store name,以及 app id 周围的单引号)
  10. 通过再次运行“ netsh HTTP show sslcert”检查是否添加了 SSL 证书。

我终于解决了。问题在于证书文件。我在其他苹果电脑上测试过,失败了。这是我的解决办法。

  1. 删除 .cer文件
  2. 重新创建证书文件。
  3. 如果失败,也重新创建 CSR 文件。

谢谢你。

看起来这是一个通用错误。我的修复与其他所有错误不同。

使用 Azure Devops 进行部署,步骤 IIS Web App Manage将 cert hash 隐藏/隐藏在 IIS Bindings中(查看 cert hash 的唯一方法是编辑特定的块) ,因此您必须更新 hash,使其与您部署到的服务器匹配。瞧,搞定了。

当我试图从 Azure Devops 管道部署到运行 IIS 的 Windows Server 框时,出现了这个错误。管道应该将站点部署到 IIS,然后创建 https 绑定,其中计算机证书存储区中的现有证书由其指纹引用。在管道中,拇指指纹应该是从变量组中提取的——但是正确的变量组没有链接到管道(而且变量名是错误的)——所以它什么也没有得到。

基本上,错误的拇指指纹被用来识别证书,我怀疑它没有给出一个标准的“找不到 SSL 证书”消息,因为我试图找到一个空的证书。