使用"netsh http add sslcert"出现“参数不正确”的错误

71

按照如何使用SSL证书配置端口中的说明,我在命令行中输入了以下命令(当然):

netsh http add sslcert ipport:10.141.146.227:7001 certhash=5d48e604007b867ae8a69260a4ad318d2c05d8ff appid={EDE3C891-306C-40fe-BAD4-895B236A1CC8}

输出:

The parameter is incorrect.

从证书的 计算机本地(Certificates (Local Computer))个人(Personal)证书(Certificates folder)文件夹中获取了我的certhash指纹。

生成了appid GUID。

还有什么其他错误需要我解决才能使其正常工作?


3
在PowerShell中正确调用外部程序的有用信息在这里...http://edgylogic.com/blog/powershell-and-external-commands-done-right/ - andyb
2
我意识到这一切都是因为我的顺序问题!你必须在certhash之前放置appid。就是这么愚蠢。 - Alexandru
9
对我来说,从Windows证书管理器中复制和粘贴的cert hash前面有一些奇怪的字符-确保它只是字母数字且没有奇怪的前导字符。 - Jacek Gorgoń
1
@JacekGorgoń 是的,我也是。可能是零宽空格 - Uwe Keim
在我的情况下,我收到了“参数不正确”的错误,因为我将certhashappid值包含在单引号中(')。删除单引号后,一切顺利进行。 - Uwe Keim
显示剩余2条评论
21个回答

106
PowerShell 中,只需输入以下命令。首先进入 netsh HTTP 模式,然后添加 sslcert。这对我很有效。
netsh

netsh会话中:
http

add sslcert ipport=0.0.0.0:13286 appid='{a5455c78-6489-4e13-b395-47fbdee0e7e6}' certhash=<thumprint without space>

13
如果完全使用 PowerShell 命令行或 ps1 脚本,请记得引用花括号;否则 PowerShell 将会混淆。 - codingoutloud
3
我意识到问题出在我的代码顺序上!你必须在certhash之前放置appid,就是这么傻。 - Alexandru
2
@Alexandru - 我不仅需要这样做,还要删除引号。是的...很蠢。:P - Lars Kemmann
1
@LarsKemmann - 引号用于PowerShell,命令行不需要引号-请参见下面的codingoutloud答案。 - CJM
3
@Alexandru,您不必在certhash之前放置appid - 这可能会无意中为您解决其他问题。 - CJM
显示剩余3条评论

50
另一个可能导致此问题的原因是从证书管理器页面复制隐藏字符。如果您从证书的详细信息窗口中复制指纹,请检查开头是否有隐藏字符(使用箭头键!)。这就是我遇到“参数不正确”错误消息的原因。

2
你太棒了。当有特殊字符时,会出现奇怪的小问题。我一开始注意到了,但没在意。只是删除了那个特殊字符,然后就成功了。谢谢! - dst3p
它是什么隐藏字符?十六进制转储通常会显示一个UTF-8字节序列(因此也显示了Unicode 代码点)。在大多数现代文本编辑器中,甚至可以使用零宽度字符,使用正则表达式检测一个或多个Unicode代码点(并进行搜索/替换(删除))。例如,\x{00A0}|\x{200B}|\x{200C}|\x{2013}|\x{2014}|\x{201C}|\x{201D}|\x{2212}|\x{00E4}|\x{FFFD}|\x{2217}|\x{200C}|\x{202B}|\x{202A}用于搜索最常见的字符。 - Peter Mortensen
"200B" 是 零宽空格 - Peter Mortensen
另一个答案列出了“0x3F 0x38”,但不清楚那是否是实际的字节序列。 - Peter Mortensen

41

PowerShell命令行和.ps1脚本中的PowerShell脚本都会认为花括号{...}是PowerShell指令。因此,请给它们加上引号。否则,正如您所见,PowerShell会混淆。

因此,与其尝试这样做(您会发现会失败):

netsh http add sslcert ipport:10.141.146.227:7001 certhash=5d48e604007b867ae8a69260a4ad318d2c05d8ff appid= {EDE3C891-306C-40fe-BAD4-895B236A1CC8}

执行以下操作(注意单引号):

netsh http add sslcert ipport:10.141.146.227:7001 certhash=5d48e604007b867ae8a69260a4ad318d2c05d8ff appid= '{EDE3C891-306C-40fe-BAD4-895B236A1CC8}'

关于PowerShell语法中的花括号,这里有一些信息:

PowerShell和花括号以及其他括号的隐藏艺术


1
在 cmd 中,如果您没有在 guid 上包括花括号或者在 PowerShell 中没有将其引用,您会得到相同的错误。 - user1228
绝对是在PowerShell中使用单引号! - reckface

18

看了netsh命令的语法,我看到了这个例子:

add sslcert ipport=1.1.1.1:443 certhash=0102030405060708090A0B0C0D0E0F1011121314 appid={00112233-4455-6677-8899-AABBCCDDEEFF}

看起来,你的问题是你正在做以下事情:

ipport:10.141.146.227:7001
      ^

相对于

ipport=10.141.146.227:7001
      ^

14

我遇到过这个问题多次,每次的原因都不同。以下是导致该问题的原因和对我起作用的确切命令。

以下是一些原因:

  1. 从Windows对话框中复制和粘贴证书Thumbprint会向哈希添加一个隐藏字符。在文本编辑器中看不到它,但需要删除该字符才能使其正常工作。

  2. 要使用localhost,应在"Personal"→ "Certificates"中提供SSL thumbprint。

  3. 应该是'ipport =',而不是'ipport:'

  4. SSL证书应具有私钥。如果使用证书管理控制台,请确保证书视图上具有小钥匙图标。

  5. GUID应以完整格式定义:{a10b0420-a21f-45de-a1f8-818b5001145a},并且在PowerShell中应该用单引号括起来:'{a10b0420-a21f-45de-a1f8-818b5001145a}'。因此,PowerShell格式与命令行不同。

  6. SSL证书应具有完整的字符,包括所有填充的“0”且不含任何空格。您可以复制Thumbprint(注意删除特殊的隐藏字符)并删除空格,或者使用“netsh http show sslcert”获取该值,如果证书已经为另一个地址注册。

对我起作用的确切命令如下:

以下是在PowerShell中对我有效的确切命令:

netsh http add sslcert ipport=0.0.0.0:20001 certhash=5304c034548b27c72b5e9c14f0c7bdd13e52d760 appid='{a10b0420-a21f-45de-a1f8-818b5001145a}'

这里是命令行语句:

netsh
http add sslcert ipport=0.0.0.0:20001 certhash=5304c034548b27c72b5e9c14f0c7bdd13e52d760 appid={a10b0420-a21f-45de-a1f8-818b5001145a}

更多指令可帮助您避免相关问题:

使用以下命令查看当前注册的证书。您可以从中找到并重用证书哈希或您的应用程序ID:

netsh http show sslcert

如果证书已经使用类似的IP和端口注册,您需要将其删除。我发现这会影响到localhost127.0.0.10.0.0.0,所以您的测试环境只需要注册0.0.0.0即可。使用以下命令删除潜在的损坏证书:

netsh http delete sslcert ipport=0.0.0.0:20001

关于“thumbprint”:您是指“指纹”吗? - Peter Mortensen
1
@PeterMortensen 证书指纹也被称为指纹。因此,它是相同的。 - mohghaderi

12

从证书的 Certificate\Details\Thumbprint 中复制证书指纹会在指纹值之前添加字节 '3f38',当转换为 ANSI 编码时,这些字节会显示为 '?'. 这个隐藏的值导致了我的问题。

我把这个值粘贴到 Notepad++ 中,选择 EncodingConvert to ANSI,然后手动删除添加的 '?' 字符。这样我就得到了一个 干净 的指纹值以供使用。


3F38既是Unicode [code point],也是UTF-16字节序列(UTF-8 0xE3 0xBC 0xB8)的表示,用于"[CJK UNIFIED IDEOGRAPH-3F38]"(㼸),但考虑到上下文,这可能并不是它的真实含义。0x3F本身就是问号("?")。这是巧合吗? - Peter Mortensen

11
  1. 将该命令复制到記事本中。
  2. 保存为ANSI格式。
  3. 关闭并重新打开文件。
  4. 删除虚假的 ? 字符。
  5. 从記事本中复制到命令提示符并运行该命令。

5

当我刚开始使用HTTP.sysIIS)时,我也遇到了这个错误。之后我运行了以下命令:

netsh http add iplisten ipaddress=0.0.0.0

然后 netsh http add sslcert 命令开始正常工作。


这是我的问题。 - x0n
似乎这也对我有帮助,尽管我最近尝试了很多不同的更改,所以不确定... - Alexander

5
在我的情况下,问题在于我按照微软的指示操作。我复制了SSL窗口中的指纹。这样做会复制哈希开头的不可打印字符。
请尝试将指纹粘贴到記事本中,然后按 Home 键并按两次 Delete(直到删除指纹的第一个字符),再重新添加该字符。如果您将指纹复制并粘贴到cmd中,则可以看到该字符:

Thumbprint with "?"


3

注意。如果您使用DNS名称作为绑定,请使用hostnameport代替ipport

netsh http delete sslcert hostnameport=domainame.com:443

我需要删除ADFS代理绑定,以便进行Office 365单点登录


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接