2017-11-15 30 views
-1

私は秘密鍵で証明書をインポートしようとしていますが、私のスクリプトは「働いています」とは分かりません。秘密鍵で証明書をインポートする

私はKeyVaultと通話し、この証明書を承認用に使用するアプリを持っています。私は上記の証明書のパスワードを持っています。PFXを手動でインストールするときには、NETWORK SERVICEアカウントの許可を割り当てても問題ありません。ただし、次のPowerShellを使用するとエラーKeyset does not existが発生します。私が証明書マネージャーの下でこれをチェックすると、すべてが正常に見えます。明らかに、UIは何か異なることをやっています..任意のアイデア?

編集 アカウントを手動で追加すると、正常に動作します。私はスクリプトを実行するとPowerShellは管理者モードで実行されているので、おそらくその奇妙な点がありますか?

スクリプト

cls 
$certName = "certname.pfx" 
$path = "C:\Certificates\$certName" 
$serviceAccount = 'NETWORK SERVICE' 
$permissionType = 'Read' 
$password = 'somepassword' 

try { 
    # Import the certificate maintaining the private key format 
    $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 
    $cert.Import($path, $password, [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]"PersistKeySet") 

    # Add the cert to personal store location 
    $store = Get-Item Cert:\LocalMachine\My 
    $store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]"ReadWrite") 
    $store.Add($cert) 
    $store.Close() 

    # Get SecurityIdentifier value from current username 
    $currentUser = New-Object System.Security.Principal.NTAccount($env:USERNAME) 
    $strSID = $currentUser.Translate([System.Security.Principal.SecurityIdentifier]) 
    $path = "$env:USERPROFILE\AppData\Roaming\Microsoft\Crypto\RSA\$($strSID.Value)\$($cert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName)" 
    $acl = Get-Acl $path 
    $rule = New-Object Security.AccessControl.FileSystemAccessRule $serviceAccount, 'FullControl', Allow 
    $acl.AddAccessRule($rule) 
    Set-Acl $path $acl 

    Write-Host "Cert installed, press any key to continue" -ForegroundColor Green 
    Read-Host 
} 
catch { 
    Write-Error -Message $_ 
} 

ANSWER私があったように、単に複数のストレージフラグ提供同じ問題が発生して他人のために

$flags = @([System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]"MachineKeySet", [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]"PersistKeySet") 
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 
$cert.Import($path, $password, $flags) 
+0

どこでエラーが発生しますか? – bartonjs

+0

私のアプリケーションを実行します。スクリプトは正常に実行されますが、手動で処理するとNETWORK SERVICEアカウントを正しく追加していません。 –

+0

はい、どの行/どのステップですか? – bartonjs

答えて

0

あなたはおそらくを使用して証明書をインポートするにPersistKeySetMachineKeySetです。あなたがマシンキーセット

  • 対ユーザーを指定せずに

    • オープンPFXを持っているあなたがここに物事をやっているかを見てみるとLocalMachineストアに追加します。
    • 現在のユーザーのSIDでキーファイルを検索します。

    Windows証明書ストアAFAIKは、どのユーザーがキーを所有しているのかを書き留めません。この証明書は「ユーザーキー{ID}」とペアになっています。したがって、マシン(共有)キーストアである必要があります。

    "キーセットが存在しません"というのは、ネットワークサービスユーザーがキーストアにそのIDで指定されたキーを持っていないためです。

    おそらく、違いはおそらく、あなたがLocalMachineストアにインポートしていることを知っているので、UIがMachineKeySet(同等)をアサーションしていることでしょう。

  • +0

    両方の場所を渡すことができました!ありがとう。 –

    関連する問題