如何使用cacert文件在Powershell(Invoke-WebRequest)中执行cUrl等效项?

时间:2016-04-19 15:27:55

标签: windows powershell curl

基本上我想将命令curl翻译为与当前在linux服务器中相同的参数,但在Powershell中,为了上传文件:

curl -v -T $file -u user:password http://myurl --cacert /opt/keystores/ca_cert.pem

我找到了一个执行此任务的等效命令:PowerShell 3.0+的“Invoke-WebRequest”,但问题是我不知道如何使用CA Cert文件(.pem)调用它并且我没有在互联网上找不到任何样本。

谢谢!

2 个答案:

答案 0 :(得分:4)

当您在.NET中建立TLS连接时,对等证书将针对RemoteCertificateValidationCallback function进行验证,并由相关AppDomain的ServicePointManager管理。

如何在PowerShell中覆盖默认验证的大多数示例都会告诉您:

[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}

不要这样做! - 它会完全绕过验证。

可以做的事情,是实现正确的回调函数并手动调用链验证。在执行此操作之前,您可以将不在计算机或用户证书存储中的证书添加到可以验证的链列表中:

$callback = {
    param(
        $sender,
        [System.Security.Cryptography.X509Certificates.X509Certificate]$certificate,
        [System.Security.Cryptography.X509Certificates.X509Chain]$chain,
        [System.Net.Security.SslPolicyErrors]$sslPolicyErrors
    )

    # No need to retype this long type name
    $CertificateType = [System.Security.Cryptography.X509Certificates.X509Certificate2]

    # Read the CA cert from file
    $CACert = $CertificateType::CreateFromCertFile("C:\path\to\ca.crt") -as $CertificateType

    # Add the CA cert from the file to the ExtraStore on the Chain object
    $null = $chain.ChainPolicy.ExtraStore.Add($CACert)

    # return the result of chain validation
    return $chain.Build($certificate)
}

# Assign your delegate to the ServicePointManager callback
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = $callback

# Do your Invoke-WebRequest or WebClient call here

我不知道如何从PEM文件中读取多个证书到证书集合中,因此您必须逐个添加每个证书,抱歉

答案 1 :(得分:2)

您正在寻找Invoke-RestMethod

它有一个Get-PfxCertificate参数,该参数从文件中获取PFX证书。您可以通过选中link

将pem转换为PFX文件

所以你的代码看起来像这样:

$cert = Get-PfxCertificate -FilePath c:\path\to\cert.pfx

$userPassB64 = [System.Convert]::ToBase64String([System.Text.ASCIIEncoding]::ASCII.GetBytes("username:password")

Invoke-WebRequest -Uri http://myurl -Method Post -Header @{Authentication "Basic " + $userPassB64} -InFile 'c:\path\to\uploadfile.txt'

更新

正如Mathias所指出的,命令中的证书选项是针对客户端证书的。 --cacert选项的目的是在证书不在curl使用的默认证书包中时提供对等验证。有关此选项解决的问题的相关问题,请参阅here

我建议按原样尝试该命令,看看SSL协商是否成功,这取决于计算机上安装的CA. 如果SSL协商失败,则可以尝试从目标站点下载证书文件并将其安装在本地证书存储中。执行此操作的步骤列出here