【问题标题】:How to send a self signed certificate to clients over https with powershell如何使用 powershell 通过 https 向客户端发送自签名证书
【发布时间】:2019-09-22 10:23:21
【问题描述】:

我正在通过 https 协议在 PowerShell 中创建一个 REST api,用于测试目的。我的目标是创建一个伪 https API 并使用它来测试我们应用程序的功能(应用程序需要调用我的测试 https api)。我可以使用以下代码创建自签名证书。

$hostIP = Get-NetIPAddress | where{ ($_.InterfaceAlias -in @('Mgmt', 'Ethernet', 'management')) -and ($_.AddressFamily -eq 'IPv4')}
$win_path= 'c:\my_temp\'

$Cert = New-SelfSignedCertificate -certstorelocation cert:\localmachine\my -   dnsname $hostIP.IPAddress -NotAfter (Get-Date).AddYears(2)
$Certname = $hostIP.IPAddress.Replace('.','_')
$pw = ConvertTo-SecureString -String "Pazzword" -Force -AsPlainText
$thumbprint = $Cert.Thumbprint
Export-PfxCertificate -cert cert:\localMachine\my\$thumbprint -FilePath 
$win_path\$Certname.pfx  -Force -Password $pw

我正在编写的 REST api 看起来像这样

$listener = New-Object System.Net.HttpListener
$httpUrl = "http://" + $givenArgs.HostName + ":" + $givenArgs.Port + "/"
Write-Output $httpUrl
$listener.Prefixes.Add($httpUrl) 
$httpsUrl = "https://" + $givenArgs.HostName + ":" + 443 + "/"
Write-Output $httpsUrl
$listener.Prefixes.Add($httpsUrl)
$listener.Start()

我的问题是,如果我手动安装在我的机器中创建的证书,我可以成功地将查询发送到我的 REST api,但只能从我的机器。

我想向客户端发送证书(在不使用任何 CA 的情况下根据初始请求为客户端发送证书副本),以便客户端第一次查询服务器时,它会获得证书副本并可以保存以供进一步交流。

我已尝试在网上查找此内容,但我只能找到导致 1.忽略证书或 2.手动导入证书的解决方案,这不能满足我的需要。

感谢您花时间研究此问题并提供帮助。提前致谢。

【问题讨论】:

    标签: powershell https certificate ssl-certificate client-certificates


    【解决方案1】:

    您不必明确发送证书。每次客户端访问https 站点时,公钥证书总是随请求一起返回。您遇到的问题是,在此之后,客户端必须决定如何处理证书。

    客户端将首先查看证书,并查看它是否受信任。如果它是受信任的证书(即您购买了 Verisign 证书),则接受连接。对于自签名证书,由于它们不受信任,因此客户端只有 2 个选项:

    1. 忽略证书来源,盲目连接
    2. 接受可以信任的来源并导入证书

    你无法绕过这个基本事实。自签名证书就像将炸弹形状的物体交付给客户,上面贴着“不是炸弹-相信我,我是@user3543477”的标签,他们可以忽略该标签,也可以接受我可以信任@user3543477。未经他们明确同意,您不能将包裹推入前门。如果贴纸上写着“Not a Bomb - Trust me, I've been verifyed by Bomb Experts”,由于客户信任 Bomb Experts,客户将毫无疑问地接受包裹。

    自签名证书用于开发目的。我不断对人们说,不要尝试让他们工作,因为你做不到。

    获得证书的正确方法是从 Verisign 之类的公司获得适当的受信任证书,或者,我现在推荐的,专为 API 量身定制的,是从 @ 获得免费证书987654321@。这样您就可以获得适当的受信任证书,而无需处理自签名证书。

    【讨论】:

    • 作为帮助支持大型公司的几个 PKI 安全领域的人,我 98% 同意这一点。自签名证书确实在测试之外占有一席之地,但非常具体。例如,您在不受信任的域 A 和 B 中拥有服务器,并且希望从 A 中的服务器安全地验证到 B 中的服务器。然后我可以看到使用自签名证书的案例,尽管这样做几乎没有危害使用来自受信任根的证书。
    • 但并非所有服务器都暴露在 Internet 上,因此公共 CA 不是一种选择。在这种情况下,我建议组织我们自己的私有 CA,并根据需要为网络中的每个服务颁发证书。
    • @HAL9256:感谢您的回答,很容易理解实际发生的事情。我的目标是创建一个伪 https API 并使用它来测试我们应用程序的功能(应用程序需要调用我的测试 https api)。所以从 CA 购买证书只是为了测试对我们来说是不可行的。
    • 感谢您的详细解释,我们已更改设计并决定忽略证书,因为这是内部测试。
    • 不客气!忽略证书是完全可以接受的,并且经常用于内部测试。
    【解决方案2】:

    使用证书时,必须建立证书路径。 根 CA 证书自签名的。关键是,他们事先是受信任的。

    在您生成自签名证书的本地计算机上,该证书是受信任的。其他机器将没有该证书:让他们信任您的证书

    • 证书必须添加(您的选项编号 2。)通常添加到受信任的根证书存储区,其中公共 CA 的自签名证书已由您的操作系统逻辑添加 或者
    • 即使存在不受信任的根,也必须信任证书路径(您的选项 1。)

    所以基本上你的选择就是你总结的那些。

    【讨论】:

    • 感谢您的回答。我正在创建它以使用 https 上的伪休息 api 测试应用程序的功能。因此,忽略证书或手动安装证书不是可用的选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 2014-01-18
    • 2018-09-21
    • 2013-07-14
    • 2022-01-07
    • 1970-01-01
    相关资源
    最近更新 更多