私は現在、証明書とCRLをリポジトリにアップロードできるプロトタイプC#MVCアプリケーションを開発中です。アプリケーションはアップロードされた.cerを受け取り、X509Certificate2のImport()メソッドを使って解析します。powershellを使用してX509証明書をアップロードしました - エラー '要求されたオブジェクトを見つけることができません'
public CertModel(byte[] bytes)
{
this._Certificate = new X509Certificate2();
try // Attempt to parse as a certificate to see if this is actually a cert
{
this._Certificate.Import(bytes);
this.Subject = _Certificate.Subject;
this.Sha1Fingerprint = _Certificate.Thumbprint;
this.RawData = Convert.ToBase64String(_Certificate.RawData);
}
catch (CryptographicException e)
{
this._Certificate = null;
}
}
がアップロードフォームを提示し、最終的には上記のコードが呼び出されたMVCのWebページがあります:私はこれは、アップロードしたユーザーが実際に証明書だったもののことを確認するために行います。これは、Webフォームを直接使用する場合はうまく動作します。
Powershellスクリプトを書く別のチームがあり、Invoke-WebRequestコマンドレットを使用してアップロードを実行しようとしています。これは私たちが働くことができないものです。
$filePath = "%HOMEPATH%\Desktop\certs\myCert.cer"
$fileInfo = gi $filePath
# Get the raw data of the cert to upload #
$rawCertData = [System.IO.File]::ReadAllText($fileInfo)
$length = $rawCertData.Length;
Write-Host $rawCertData
## Type of file you are uploading ##
$fileType = "Certificate"
## Build the POST Body ##
$boundary = [System.Guid]::NewGuid().ToString()
$lf = "`n"
$bodyLines = (
"--$boundary",
'Content-Disposition: form-data; name="Type"',
'',
"$fileType",
"--$boundary",
'Content-Disposition: form-data; name="upload"; filename="myCert.cer"',
'Content-Type: application/octet-stream',
'',
"$rawCertData",
"--$boundary--"
) -join $lf
$contentType = "multipart/form-data; boundary=$boundary"
$uri = "http://localhost:58484/repo/upload_service"
$response = Invoke-WebRequest -Uri $uri -Method POST -ContentType $contentType -Body $bodyLines -WebSession $session
$tempStore.Clear()
同じファイルについて、リクエストのペイロードがまったく同じであることを確認しました。さらに、Import()に渡されたバイト配列が同じであることを確認できます。ただし、curl/Invoke-WebRequestメソッドを使用する場合。私はCryptographicExceptionで '要求されたオブジェクトを見つけることができません'というメッセージを受け取ります。
これまでPowerShellに晒されたことはありませんでしたので、これを解決するために実装できるC#ソリューションがあることを願っていますが、私が得ることのできるアドバイスをすべて取っていきます。
証明書の内容をbase64でコード化したことはありません – Eris