Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PowerShell中进行Http post调用时,将JSON正文中的字段设置为文件中的内容_Powershell_Https_Certificate_Http Post_Csr - Fatal编程技术网

在PowerShell中进行Http post调用时,将JSON正文中的字段设置为文件中的内容

在PowerShell中进行Http post调用时,将JSON正文中的字段设置为文件中的内容,powershell,https,certificate,http-post,csr,Powershell,Https,Certificate,Http Post,Csr,我正在尝试安装由digicert CA颁发的证书。首先,我使用Powershell脚本生成CSR(证书签名请求)。我将生成的CSR放在一个txt文件中,并删除所有换行符、空格和回车符。我正在使用以下脚本来执行此操作: $CSR > C:\Scripts\CSR.txt $path = "C:\Scripts\CSR.txt" (Get-Content $path -Raw).Replace("`r`n","") | Set-Content $path -Force (Get-Content

我正在尝试安装由digicert CA颁发的证书。首先,我使用Powershell脚本生成CSR(证书签名请求)。我将生成的CSR放在一个txt文件中,并删除所有换行符、空格和回车符。我正在使用以下脚本来执行此操作:

$CSR > C:\Scripts\CSR.txt
$path = "C:\Scripts\CSR.txt"
(Get-Content $path -Raw).Replace("`r`n","") | Set-Content $path -Force
(Get-Content $path -Raw).Replace(" ","") | Set-Content $path -Force
(Get-Content $path -Raw).Replace("`r`n","") | Set-Content $path -Force -NoNewline
之后,我想对digiCert进行http post调用以获取证书Id。为此,我使用以下脚本:

[Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls"
$body = @"
{
 "profile_name": "XXX",
 "common_name": "XX",
 "additional_dns_names": [
   "XX",
   "XX"
 ],
 "csr":$CSRWithNoCRLF,

 "signature_hash": "sha256",
 "validity": {
   "months": 36
 },
 "organization": {
   "name": "XXX",
   "units": [

   ]
 }
}
"@


$header = @{
 "Accept"="application/json"
 "KEY"="XXXX"
 "Content-Type"="application/json"
} 

$response = Invoke-WebRequest -Uri "https://www.digicert.comXXXX" -Method Post -Body $body -Headers $header 
$Content = $response.Content
对于JSON正文中的csr字段,我想直接复制C:\Scripts\csr.txt文件的内容。我尝试了以下方法,但不起作用

$CSRWithNoCRLF = Get-Content $path
并使用$CSRWithNoCRLF作为csr的值。但是Get内容添加了换行符和回车符,并且错误地生成了CSR值。所以这是行不通的。有没有办法解决这个问题

获取内容是添加换行符

有几种方法,每种方法都是一个完整的解决方案:

$CSRWithNoCRLF = Get-Content $path -Raw     # requires PSv3+

Get-Content $path | Out-String

(Get-Content $path) -join "`n"       # use "`r`n" for Windows-style line-endings
编辑

检查您发送的内容。试试这个:

[regex]::Escape($Body)
如果使用了
(Get Content$path)-join“
n”`则CSR部分中没有\r\n行结尾。但是,为什么要手工制作JSON?如果在windows框中执行此操作,JSON字符串中将包含windows行结尾

试试这个:

[regex]::Escape($Body)
$Body = [pscustomobject]@{
    profile_name = "XXX"
    common_name = "XX"
    additional_dns_names = @(
        "XX",
        "XX"
    )
    csr = (Get-Content $Path) -join "`n"
    signature_hash = "sha256"
    validity = [pscustomobject]@{
        months = 36
    }
    organization = [pscustomobject]@{
        name = "XXX"
        units = @()
    }

} | ConvertTo-Json -Compress
请注意,我使用的是
Compress

> [regex]::Escape($Body) -match '\\r'
False
试试看

获取内容是添加换行符

有几种方法,每种方法都是一个完整的解决方案:

$CSRWithNoCRLF = Get-Content $path -Raw     # requires PSv3+

Get-Content $path | Out-String

(Get-Content $path) -join "`n"       # use "`r`n" for Windows-style line-endings
编辑

检查您发送的内容。试试这个:

[regex]::Escape($Body)
如果使用了
(Get Content$path)-join“
n”`则CSR部分中没有\r\n行结尾。但是,为什么要手工制作JSON?如果在windows框中执行此操作,JSON字符串中将包含windows行结尾

试试这个:

[regex]::Escape($Body)
$Body = [pscustomobject]@{
    profile_name = "XXX"
    common_name = "XX"
    additional_dns_names = @(
        "XX",
        "XX"
    )
    csr = (Get-Content $Path) -join "`n"
    signature_hash = "sha256"
    validity = [pscustomobject]@{
        months = 36
    }
    organization = [pscustomobject]@{
        name = "XXX"
        units = @()
    }

} | ConvertTo-Json -Compress
请注意,我使用的是
Compress

> [regex]::Escape($Body) -match '\\r'
False
试一试。

试试这个:

$CSRWithNoCRLF = (Get-Content $path -Raw).Replace("`r`n","").Replace(" ","")
$body = @"
{
 "profile_name": "XXX",
 "common_name": "XX",
 "additional_dns_names": [
   "XX",
   "XX"
 ],
 "csr":"$CSRWithNoCRLF",

 "signature_hash": "sha256",
 "validity": {
   "months": 36
 },
 "organization": {
   "name": "XXX",
   "units": [

   ]
 }
}
"@
$header = @{
 "Accept"="application/json"
 "KEY"="XXXX"
 "Content-Type"="application/json"
} 

$response = Invoke-WebRequest -Uri "https://www.digicert.comXXXX" -Method Post -Body $body -Headers $header 
$Content = $response.Content
我不认为在修改证书后需要将其保存回文件。

尝试以下操作:

$CSRWithNoCRLF = (Get-Content $path -Raw).Replace("`r`n","").Replace(" ","")
$body = @"
{
 "profile_name": "XXX",
 "common_name": "XX",
 "additional_dns_names": [
   "XX",
   "XX"
 ],
 "csr":"$CSRWithNoCRLF",

 "signature_hash": "sha256",
 "validity": {
   "months": 36
 },
 "organization": {
   "name": "XXX",
   "units": [

   ]
 }
}
"@
$header = @{
 "Accept"="application/json"
 "KEY"="XXXX"
 "Content-Type"="application/json"
} 

$response = Invoke-WebRequest -Uri "https://www.digicert.comXXXX" -Method Post -Body $body -Headers $header 
$Content = $response.Content

我不认为在修改证书后需要将其保存回文件。

您的证书看起来怎么样?它是b64编码的吗?重定向到文件会导致UTF16而不是UTF8。您能给我们展示一个
C:\Scripts\CSR.txt
和打印
$CSRWithNoCRLF
的示例吗?另外,
$CSRWithNoCRLF
是否在脚本的其他地方声明?@Fourat我的CSR.txt是这样的:-----开始新证书申请------XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA61Cznbakippmhigcisgaqbgjcnagixzbiagebhloatqpbagmacgbvahmabwbmahqaibafsafmaqqqazablahidaqawdqyjkozihvcnaqelbqqqqvscse6x1wubrroe5uwls9p6pw=----ENDNEWCERTIFICATEREQUEST-----@Fourat我还没有在脚本的其他地方声明$CSRWithNoCRLF。你看起来怎么样?它是b64编码的吗?重定向到文件会导致UTF16而不是UTF8。您能给我们展示一个
C:\Scripts\CSR.txt
和打印
$CSRWithNoCRLF
的示例吗?另外,
$CSRWithNoCRLF
是否在脚本的其他地方声明?@Fourat我的CSR.txt是这样的:-----开始新证书申请------XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA61Cznbakippmhigcisgaqbgjcnagixzbiagebhloatqpbagmacgbvahmabwbmahqaibafsafmaqqqazablahidaqawdqyjkozihvcnaqelbqqqvscse6x1wubrroe5uwls9p6pw=----ENDNEWCERTIFICATEREQUEST-----@Fourat我在脚本的其他地方没有声明$CSRWithNoCRLF。我尝试了你提到的三种方法。在每种方法中,它都会在每行后面的末尾添加CRLF,并且不起作用。如果您使用\n而不是\r\n显式地加入,则它肯定不会将CR添加到您的
$CSRWithNoCRLF
变量中。也许您的API不喜欢JSON格式正文中的行结尾?请参阅我的编辑,了解如何让内置JSON serialiser格式适合您。另外,尝试不通过JSON发送,只让
调用WebRequest
为您序列化它。谢谢,这很有效。正如你所说,手工制作JSON是个问题。我尝试了你提到的三种方法。在每种方法中,它都会在每行后面的末尾添加CRLF,并且不起作用。如果您使用\n而不是\r\n显式地加入,则它肯定不会将CR添加到您的
$CSRWithNoCRLF
变量中。也许您的API不喜欢JSON格式正文中的行结尾?请参阅我的编辑,了解如何让内置JSON serialiser格式适合您。另外,尝试不通过JSON发送,只让
调用WebRequest
为您序列化它。谢谢,这很有效。正如你所说,手工制作JSON是个问题,我试过了。仍然不起作用。获取内容是在每行之后添加换行符。您的Powershell版本是什么?我在PS5.1.16299.1004上试用过,效果很好
Get Content$path-Raw
返回换行符,但我用
替换所有换行符和空格。replace(
r
n',“”)。replace(“,”)
因此从逻辑上讲,
$CSRWithNoCRLF
字符串变量不应该有任何换行符或空格。请用我的代码创建一个新脚本并进行测试。我尝试了这个。仍然不起作用。获取内容是在每行之后添加换行符。您的Powershell版本是什么?我在PS5.1.16299.1004上试用过,效果很好
Get Content$path-Raw
返回换行符,但我用
替换所有换行符和空格。replace(
r
n',“”)。replace(“,”)
从逻辑上讲,
$CSRWithNoCRLF
字符串变量sh