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


72

我使用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}

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

SSL证书添加失败,错误1312

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

有谁知道为什么我会出现这个错误?


1
您必须同时导入根证书和自签名证书。然后工作了,
Martin.Martinsson

6
如果还有其他人遇到此问题,而此处的答案没有明确回答,则潜在的核心问题是需要导入私钥。如果在导入证书时将证书标记为可导出,则不会导入私钥,因此无法绑定它。如果删除并重新导入并将其标记为可导出,则它将起作用。
肯德尔·贝内特

对我来说,解决了这个问题,而不是将证书安装在CurrentUser / My中,而是将其重新安装在Local / My ..中,这是我要做的全部工作。
Frederik

Answers:


56

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


2
同上。那让我呆了半天。非常感谢-M $请特别说明!
penderi

我想赏金添加到这个答案,但它不是选择为正确的..
maxkoryukov

如果您指定证书驻留在哪个存储中(例如,certstorename = WebHosting),它将起作用。docs.microsoft.com/zh-CN/windows/desktop/http/add-sslcert
NKCSS,

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


2
完全可以解决我的情况。关键点是在左上角带有一个小“键”的图标。没有“钥匙”,1312。有了“钥匙”,成功!
Verilocos

这也是我的情况。我已经看到了丢失的钥匙图标,但是我并没有给予太多重视。真可惜
Gayolomao 2015年

5
如果您拥有一个没有私钥的证书(SnapIn证书图标的左上角没有密钥符号),则可以按照以下步骤添加密钥: support.microsoft.com/zh-cn/kb/889651-注意!与其他与此相关的事情一样,如果您从“详细信息”中复制/粘贴密钥,则您可能会在开头的双引号和指纹或序列号的第一位之间出现一个不可打印的字符(控制台窗口中的问号)。证书对话框。删除它!例如:certutil -repairstore my“?ad 59 ... etc ... That'?' 需要去
。– BRebey

有时,图标上的密钥符号不足以验证证书是否具有私钥。对密钥的引用可能已丢失,您可以通过尝试导出包括私钥的证书来进行检查。
GuillermoGutiérrez'18

这是我的关键。无双关语!我一直无法导入.crt文件;导入.pfx文件,然后显示钥匙图标就可以解决问题。
马克·莱夫斯克

25

我已经购买了Thawte官方证书,以通过Internet服务器上的特定端口保护自托管(控制台应用程序)Web服务。然后,我已经收到Thawte证书,并将其与mmc一起安装在我们的Internet服务器上(然后可以在“受信任的根证书颁发机构”下查看该证书(图像上带有钥匙图标,表明该证书包含私钥,这是强制性的)以便将其绑定到端口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指定的登录会话不存在。它可能已经被终止。

然后,我搜索了Internet并尝试了各种建议的解决方法(均未成功)。

对于我的情况,解决方案是将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,即MY(针对证书存储的目标:“ Personal ”,其中通常存储自签名证书)。
针对证书存储:“受信任的根证书颁发机构”

* 1):端口,您要使用连接
* 2):您可以将指纹提取到证书,如果您打开证书(在Windows系统上,只需在资源管理器中双击证书)-选择“详细信息”标签然后点击“缩略图”。然后显示“缩略图”并可以复制。复制指纹并删除所有空格...
* 3):作为appid,您可以采用{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxx-xxxxxxxxx}形式的任何ID,因为APPID仅提供信息。使用命令“ netsh http show sslcert”,您可以查询整台计算机上的绑定证书,并且将看到信息,哪个appid绑定到哪个证书(实际上对操作没有帮助)。 VS生成)GUID到我的Web服务应用程序


4
就我而言(在Windows Server 2016上为IIS 10),我必须设置certstorename = WebHosting,因为我已将证书导入到WebHosting证书中。存储(IIS管理器中证书存储的选项是“个人”或“ WebHosting”,因此我选择了“ WebHosting”)。
SeanN

1
我还必须按照@SeaN设置certstorename = WebHosting
Gags

谢谢。我在连接WCF服务的Firefox中遇到了CORS问题。您的回答解决了我的问题。我遇到了CORS问题,因为我的Web应用程序是https,而WCF是http。
AR

21

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

我在Machine Store的人员文件夹中有一个证书。它过期了,我的经理又发出了一个新的。新的错误对于我来说失败了。我尝试了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绑定到端口,则证书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 \”下适当文件夹中的文件,并且一切开始正常工作。

希望这对某人有帮助。


这帮助我了解了我的问题。我使用OpenSSL生成根CA和SSL证书。当我运行“ certutil -store My”时,SSL证书显示“没有密钥提供者信息”。我对SSL证书执行了“ openssl pkcs12”,它现在显示“ Provider = Microsoft增强加密提供程序v1.0”。
2014年

9

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

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

如前所述。当您将其导入mmc时,它将被称为“个人信息交换”文件(显然.pfx文件也将起作用)。

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


对我有用的第一个答案不是使用自签名证书,而是使用“官方” ssl证书。我只是使用mmc证书管理工具将完整的证书链导出到pfx / p12。
z00l

我使用了在PowerShell中创建的自签名证书,但收到了原始问题中的错误。我只在将.pfx导入到受信任的存储区时才起作用,而不是在导入.cer时。
亚当·马歇尔

6

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


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


4

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

c:> certutil -importPFX certname.pfx

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

c:> certutil -store my

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


3

这看起来似乎很明显。但是,我认为这可以节省一些人的头部抓挠时间。我已经在“个人证书”文件夹(用于“个人计算机”帐户)下导入了扩展名为.cer的文件。一段时间后,我意识到我需要导入扩展名为* .pfx的文件。修正了这个问题!问题解决了!


1
这似乎很明显,但是当您不知道自己需要PFX时...谢谢!
Nicolas Leucci '17

2

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

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

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

更新的语法:)


1

如果:

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

然后:

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

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


1

只是想给另一个答案,这就是我遇到的问题:

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


1

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

正如其他人指出的那样,它也必须是本地计算机商店。



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我创建的软件包的一部分。


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 ....”的绑定将失败。


0

certstorename参数应该是字符串值STORENAME .NET Framework中的命名空间枚举System.Security.Cryptography.X509Certificates


0

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

 C:\Windows\system32> certutil -store TRUSTEDPUBLISHER

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

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

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


0

就我而言,在创建证书时,我为证书存储名称选择了与我不同的名称。默认名称是MY。因此,如果您的不同,请在命令后附加certstorename =您提供的商店名称


0

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

0

因此,要添加(还)修复/情况。

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

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

因此,我的代码创建了证书并将其放置在证书存储区中的正确位置。

使用这里的提示,我的On Premise Service Bus 1.1安装失败了……这导致我进入这里。

最后,我删除了我的BouncyCastle代码创建的两个证书(从证书存储)并重新导入了它们(使用私钥)。我将FIRST导入到

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

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

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


0

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


0

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

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


0

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

文章给我的指令到P7B文件转换成PFX。总而言之,您只需执行以下操作:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.