2016-04-19 20 views
2

MMCの「証明書」スナップインを使用してWindows 10コンピュータ上のCurrentUserキーストアに最初にインポートされたX509証明書で作業しようとしています。同じ手順を同じ結果を持つWindows 8.1コンピュータでテストしました。標準のPowerShell PKIモジュールを使用して.NET Framework x509Certificate2クラス、HasPrivateKey == true && PrivateKey == null?

、私が取得-項目を使用してX509Certificate2オブジェクトを取得しています:以下のように

$my_cert = Get-Item Cert:\CurrentUser\My\ADAA82188A17THUMBPRINTXXXXXXXXXXX 

$my_cert | fl *の出力は次のようになります。

PSPath     : Microsoft.PowerShell.Security\Certificate::CurrentUser\My\XXXXXXXXXXXXXXXXXXX 
PSParentPath    : Microsoft.PowerShell.Security\Certificate::CurrentUser\My 
PSChildName    : XXXXXXXXXXXXXXXXXXX 
PSDrive     : Cert 
PSProvider    : Microsoft.PowerShell.Security\Certificate 
PSIsContainer   : False 
EnhancedKeyUsageList  : {Secure Email (1.3.6.1.5.5.7.3.4), IP security user (1.3.6.1.5.5.7.3.7), Encrypting File 
          System (1.3.6.1.4.1.311.10.3.4), Document Signing (1.3.6.1.4.1.311.10.3.12)...} 
DnsNameList    : {My Name} 
SendAsTrustedIssuer  : False 
EnrollmentPolicyEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty 
EnrollmentServerEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty 
PolicyId     : {D52C406F-C279-4BF2-B7C2-EE704290DB3E} 
Archived     : False 
Extensions    : {System.Security.Cryptography.Oid, System.Security.Cryptography.Oid, 
          System.Security.Cryptography.Oid, System.Security.Cryptography.Oid...} 
FriendlyName    : 
IssuerName    : System.Security.Cryptography.X509Certificates.X500DistinguishedName 
NotAfter     : 4/15/2017 2:15:16 PM 
NotBefore    : 4/15/2016 2:15:16 PM 
HasPrivateKey   : True 
PrivateKey    : 
PublicKey    : System.Security.Cryptography.X509Certificates.PublicKey 
RawData     : {56, 130, 19, 252...} 
SerialNumber    : 4F0000002F700000000000000000000000 
SubjectName    : System.Security.Cryptography.X509Certificates.X500DistinguishedName 
SignatureAlgorithm  : System.Security.Cryptography.Oid 
Thumbprint    : XXXXXXXXXXXXXXXXXXX 
Version     : 3 
Handle     : 2241663016272 
Issuer     : CN=Issuing CA, DC=My, DC=Domain, DC=us 
Subject     : [email protected], CN=My Name 

のでHasPrivateKey ==真ただし、PrivateKey == null私は秘密鍵にアクセスして暗号化と復号化を行う方法を理解しようとしています。すべて私がオンラインで見た例は、X509Certificate2クラスのPrivateKeyプロパティがすぐに利用できるはずであることを示しているようですが、明らかに私は何かを見逃しました。

Empty PrivateKey in x509certificate2など、私はここで同様の質問をお読みになりましたが、問題が解決しないようです。私も非常に啓発されていたPaul StovellのEight tips for working with X.509 certificates in .NETを読んだが、最終的には役に立たなかった。正しい権限がx509Certificate2クラスによって参照されるとそれは、私には秘密鍵が私の知る限り、正しい場所に存在していることを確認するのに役立ちました:

C:\Users\My.Name\AppData\Roaming\Microsoft\SystemCertificates\My\Keys 

キーファイルの名前はに一致します証明書のSubject Key Identifier。

編集:

certutil -user -store my "Serial Number"の出力がある:どのような "キー" の情報の一部は、私がここで行方不明です

Serial Number: 4f000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
Issuer: CN=Issuing CA, DC=My, DC=Domain, DC=us 
NotBefore: 4/15/2016 2:15 PM 
NotAfter: 4/15/2017 2:15 PM 
Subject: [email protected], CN=My Name 
Non-root Certificate 
Template: Userv1, User v1 
Cert Hash(sha1): ad ab 82 18 8a 17 4d 75 11 04 48 7c 43 43 d4 05 b9 74 c8 4c 
    Key Container = te-Userv1-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 
    Unique container name: fcbba1aa0xxxxxxxxxxxxxxxxxxxxxxx_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 
    Provider = Microsoft Software Key Storage Provider 
Encryption test passed 
CertUtil: -store command completed successfully. 

?秘密キーがX509Certificate2オブジェクトから便利に参照されないのはなぜですか?どうすればそれにアクセスできますか?

+0

'$ my_cert.get_PrivateKeyを()'試してみてください。い – PetSerAl

+0

@PetSerAl、例外があります - 「無効なプロバイダータイプが指定されています」 –

答えて

4

これは、次のいずれかを示すことがあります。

1)秘密鍵が不十分.NETでサポートされているとのPrivateKeyプロパティによってサポートされていないというレガシー暗号化サービスプロバイダよりもキーストレージプロバイダ()に格納されますX509Certificate2クラスです。これを確認するには、次のコマンドを実行します。

certutil -user -store my "<CertSerialNumber>" 

2)秘密鍵がありません。

HasPrivateKeyプロパティは実際の画像を反映する必要はなく、存在しないキーの場合はTrue、既存のキーの場合はFalseとなります。上記のcertutilコマンドを実行して、キーが表示されていることを確認します。場合

秘密鍵が提示されていますが、バインディングが壊れている場合は、次のコマンドを実行して、バインディングを復元しようとすることができますが:

certutil -user -repairstore my "<CertSerialNumber>" 
+0

私はオリジナルの投稿にCertUtilの出力を追加しました。キーストレージプロバイダ(KSP)。私は今、KSPとCNGキーを使って作業する良い例を探しています...何か知っていますか? –

+0

正確に何が必要ですか? – Crypt32

+0

私は何も必要ないと思います。私は例を理解するためのショートカットを探していただけでしたが、私はそれを一緒にハックすることができました...これに助けてくれてありがとう! –

3

あなたのcertutilの情報は、秘密鍵であることを意味しているProvider = Microsoft Software Key Storage Providerを示しWindows CryptoAPI(CAPI)の代わりにWindows CNGの下に格納されます。

.NET 4。6では、GetRSAPrivateKey(拡張)メソッドを追加して、PrivateKeyプロパティがRSACryptoServiceProvider(またはDSACryptoServiceProvider)ではないものを返すようにするための変更を容易にしました。その方法にアクセスできれば(PowerShellのどのバージョンのフレームワークが使用されているのか分かりません)、問題が解決します。注意すべき

2つのこと、しかし:

  1. GetRSAPrivateKeyは、ユニークな使い捨てのオブジェクトを毎回返します。あなたはそれをusingステートメントに置くか、手動でDisposeを呼び出す必要があります(cert.PrivateKeyと異なり、一意ではないため、Disposedではありません)。
  2. sign/verify // encrypt/decryptメソッドは、RSA基本クラス(少し前向きなシグネチャを持つalbiet)に移行しました。
2

私はこの問題を解決しました。

何らかの理由で、.NET Frameworkはファイルから秘密鍵をインポートできませんが、PrivateKeyメソッドがMicrosoft Specごとにのみサポートされているため、組み込みのWindowsストアからインポートできます。 「備考」セクションの注釈を読んでください。とにかく

、キー情報を返すためのPrivateKeyオブジェクトを取得するには、次の操作を行う必要があります。

1)をダブルクリックして、WindowsストアにあなたのP12ファイルをインポートします。 2)「現在のユーザー」 3にプロンプ​​トが表示されたら、「キーエクスポート可能にします」を選択していることを確認してください)「インポート」を選択し、

このオプションが使用できない場合は、あなたの証明書は何のプライベート キー

を持っていません

。 4)「店に置いて、自動的に」選択

5)は、あなたの証明書を取得するには、次のコードを書く:

Dim CertDataInfo As System.Security.Cryptography.X509Certificates.X509Certificate2 
Dim Store As New System.Security.Cryptography.X509Certificates.X509Store("MY", Security.Cryptography.X509Certificates.StoreLocation.CurrentUser) 

Store.Open(Security.Cryptography.X509Certificates.OpenFlags.ReadOnly) 
Console.writeline (Store.Certificates.Count) 

For I = 0 To Store.Certificates.Count - 1 
If Store.Certificates.Item(I).FriendlyName = "Heider Sati's Cert(48F57XTHVE)" Then 
    CertDataInfo = Store.Certificates.Item(I) 
End If 

Console.writeline ("Cert: " & Store.Certificates.Item(I).FriendlyName) 

Next 
Store.Close() 

If CertDataInfo.PrivateKey Is Nothing Then 
MsgBox("NULL") 
Else 
MsgBox("YES") 
End If 

6)のコードを実行し、あなたはYESを得るならば、秘密鍵がNULLではありません(または何もない)、それはあなたが探しているものです。

ファイルから直接同じ証明書をロードすると、秘密鍵は常にNOTHING/NULLになりますが、HasPrivateKeyはYESと表示されます。つまり、キーがあるとわかっていますが、わかりませんあなたは、Windowsストアにインポートすると、その後、Windowsは、.NET互換の形式に変換しない。それを理解する方法について説明します。

私はこのことができます願っています。

関連する問題