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

时间:2012-10-25 20:42:37

标签: ssl https

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

以下是我为处理此问题所采取的措施:

  1. 在我的本地计算机上创建一个证书,作为根证书颁发机构
    • makecert -n“CN =我的根证书颁发机构”-r -sv RootCATest.pvk RootCATest.cer
  2. 打开MMC.exe并将保存的.cer文件导入“受信任的根证书\ 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}
  5. 步骤4的结果是以下错误:

      

    SSL证书添加失败,错误1312

         

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

    有没有人知道为什么我会收到这个错误?

25 个答案:

答案 0 :(得分:48)

我有同样的错误。第一次发生时,正如Micheal所说,我必须将证书移到证书(本地计算机) - >个人 - >证书文件夹下。当我在另一台机器上导入相同的证书时,我遇到了同样的错误。原因是我使用certmgr.msc导入证书。 。因此打开的窗口显示“证书 - 当前用户”。使用此窗口导入的证书会导致netsh因1312错误而失败。确保在MMC中使用证书管理单元来导入证书。 MMC的证书管理单元显示“证书(本地计算机)”。这让netsh执行成功。

答案 1 :(得分:38)

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。查看证书的图标 - 它必须在图标上有关键符号。

答案 2 :(得分:21)

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

我在Machine store的人员文件夹中有证书。它已过期,我的经理发布了一个新的。这个错误让我失败了。我尝试了很多来自谷歌的东西,但最终使用完全不同的解决方案解决了这个问题。

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

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

这一次,Unique容器名称反映了'%ProgramData%\ Microsoft \ Crypto \'下正确文件夹中的文件,一切都开始有效了。

希望这对某人有帮助。

答案 3 :(得分:17)

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

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

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指定的登录会话不存在。它可能已经被终止。

然后我搜索了互联网并尝试了各种建议的解决方法(没有成功)。

我的案例的解决方案是将netstorename = 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 (证书商店的目标是什么:“个人”,其中自签名证书正常存储。) Root 以证书存储为目标:“受信任的根证书颁发机构”

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

答案 4 :(得分:9)

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

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

As described。当您在mmc中导入它时,它将被称为&#34;个人信息交换&#34;文件(显然.pfx文件也可以)。

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

答案 5 :(得分:5)

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

答案 6 :(得分:4)

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

答案 7 :(得分:2)

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

c:> certutil -importPFX certname.pfx

现在使用此命令显示证书:

c:> certutil -store my

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

答案 8 :(得分:2)

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

答案 9 :(得分:2)

有多种方法可以收到此错误(请参阅上面的其他答案)。

另一种接收此特定错误的方法是,当证书不在相应的商店中时,尝试将证书绑定到端口。

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

更新语法:)

答案 10 :(得分:1)

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

虽然我将证书导入(Local Computer)\...证书库,但我已将其导入Trusted Root Certification Authorities部分。我需要将其导入Personal部分,否则会发生此错误。

答案 11 :(得分:1)

如果:

  1. 您的计算机上没有IIS(与自托管WCF一起使用)和
  2. 您使用IIS管理器在另一台计算机上发出了您的证书请求(因为您不了解私钥来自嵌入在证书请求中的密码 - 以及后来发布的.pb7
  3. 然后:

    1. 只需在用于发出证书请求的IIS计算机上安装.pb7(本地计算机/个人/证书 - 使用mmc);
    2. 从该计算机导出证书,包括其私钥(指定密码);和
    3. 在WCF服务器上使用mmc安装它(本地机器/个人/证书 - 使用mmc)。
    4. 然后,netsh将允许您绑定到端口443.不再有1312个错误。

答案 12 :(得分:1)

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

它也需要像其他人指出的那样成为本地机器商店。

答案 13 :(得分:0)

这是我对该线程中所有修复以及它如何为我工作的总结:

  1. 找到“Windows PowerShell”,右键单击该图标,然后选择“以管理员身份运行”。
  2. 找到“写字板”,右键单击该图标,然后选择“以管理员身份运行”。 (这样您就可以在 PowerShell 和写字板之间复制和粘贴。)
  3. 在 PowerShell 中运行“netsh HTTP show sslcert”。
  4. 从显示的信息中,复制“Certificate Hash”、“Application Id”和“Certificate Store Name”。 (稍后您将需要所有这些。)
  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 证书。

答案 14 :(得分:0)

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

article给了我指导,将P7B文件转换为PFX。总结一下,您只需要执行以下操作即可:

  1. 使用openssl首先将P7B文件转换为PEM
  2. 将PEM文件转换为PFX

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

答案 15 :(得分:0)

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

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

答案 16 :(得分:0)

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

答案 17 :(得分:0)

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

答案 18 :(得分:0)

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

答案 19 :(得分:0)

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

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

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

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

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

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

  

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

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

我的&#34;之前&#34; &#34;&#34;&#34;&#34;在MMC中我的眼睛看起来完全一样,但它解决了这个问题。去图。

答案 20 :(得分:0)

使用OpenSSL(BouncyCastle)创建自签名证书时出现了同样的错误我在这篇文章的帮助下解决了这个问题: Cannot export generated certificate with private key to byte array in .net 4.0/4.5

我不得不补充道:

$html = '<div id="dialogHolder"></div>
         <script>
              if($("#mf_dialogs").length == 0) {
                  document.getElementById("dialogHolder").innerHTML="<div id=\"mf_dialogs\"></div>";
              }
         </script>';

答案 21 :(得分:0)

在我的情况下,在创建证书时,我为我的证书商店名称选择了与My不同的名称。默认名称为MY。因此,如果您的不同,请在命令中附加certstorename = 您提供的商店名称

答案 22 :(得分:0)

我正在研究这个问题好几个小时,并且基本上阅读了@ DoomerDGR8上面所说的内容,但我的解决方案要简单得多。我跑了

 C:\Windows\system32> certutil -store TRUSTEDPUBLISHER

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

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

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

答案 23 :(得分:0)

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

答案 24 :(得分:0)

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

根据我的经验,只要您的密钥没有出现在%ProgramData%\ Microsoft \ Crypto \ RSA \ MachineKeys \中,绑定&#39; netsh http就添加sslcert ....&#39;会失败。