如何使用 powershell 通过 https 向客户端发送自签名证书

How to send a self signed certificate to clients over https with powershell

我正在通过 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.Ignoring 证书或 2 的解决方案。手动导入证书不能满足我的需要。

感谢您花时间调查此事并提供帮助。提前致谢。

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

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

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

你无法回避这个基本事实。自签名证书就像将炸弹形状的物体交付给客户,上面贴着 "Not a Bomb - Trust me, I'm @user3543477" 标签,他们可以忽略该标签,或者接受我可以信任 @user3543477。未经他们明确同意,您不能将包裹推过前门。如果贴纸说"Not a Bomb - Trust me, I've been verified by Bomb Experts",因为客户信任炸弹专家,客户会毫无疑问地接受包裹。

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

获得证书的正确方法是从 Verisign 之类的公司获得适当的可信证书,或者我现在推荐的,这是专门为 API 量身定制的的,是从 Let's Encrypt 获得免费证书。这样您就可以获得适当的可信证书,并且您不会处理自签名证书。

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

在生成自签名证书的本地计算机上,该证书是可信的。其他机器不会有那个证书:让他们信任你的证书

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

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