2016-05-30 14 views
0

私は現在、証明書と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#ソリューションがあることを願っていますが、私が得ることのできるアドバイスをすべて取っていきます。

+1

証明書の内容をbase64でコード化したことはありません – Eris

答えて

0

@Erisあなたのコメントの解決に感謝します。私には不思議です

$rawCertData = [System.IO.File]::ReadAllBytes($fileInfo) 
$rawCertData = [System.Convert]::ToBase64String($rawCertData); 

唯一のことは、Webフォームを使用するときにバイト配列が異なっているということですが、X509Certificate2.Importは()のいずれかの場合にはそれを正しく解析する方法を知っていることが表示されます。

+0

ReadAllText()の代わりにReadAllBytes()を使用しなければならないことに注意してください。 – ccsandrew

関連する問題