「PKI」カテゴリーアーカイブ

.Net x509certificate2 で証明書をインポートする

無線LANなどの802.11 認証に使うための証明書は、デバイスIDなどのコンピュータを証明するための証明書を利用する。この場合、インポート先のストアは、Windows の証明書ストアの[ コンピュータ ]-[ 個人 ] である。

Windows には証明書インポートウィザードがあるので、こちらを使えばよいのだが、管理者でないと [ ユーザー ] アカウントにしかインポートができない。また、ユーザーに証明書スナップインを立ち上げさせて、インポートさせることは難しい。

そこで.Net (VB/C#) でp12形式の証明書をインポートする際のポイントを紹介する。

C#
X509Certificate2 computerCert = new X509Certificate2(P12File, Password, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet);
X509Store myStore = new X509Store(StoreName.My, StoreLocation.LocalMachine);
myStore.Open(OpenFlags.ReadWrite)
myStore.Add(computerCert)
myStore.Close();

VB
Dim computerCert As New X509Certificate2(P12File, Password, X509KeyStorageFlags.MachineKeySet Or  X509KeyStorageFlags.PersistKeySet)
Dim myStore As New X509Store(StoreName.My, StoreLocation.LocalMachine)
myStore.Open(OpenFlags.ReadWrite)
myStore.Add(computerCert)
myStore.Close();

秘密鍵をインポートするには、X509KeyStorageFlags.MachineKeySet だけではダメで、
X509KeyStorageFlags.PersistKeySet を記述する必要がある。
X509KeyStorageFlags.PersistKeySet がないと、秘密鍵はテンポラリーでインポートされるが、その後削除されてしまい、実際には機能しないので注意が必要だ。

p12形式でインポートの際にPINが設定されている場合は、①ユーザーに入力させセキュアストリングスで受けるか、②外部からPINを書いたファイルを読み込むか、③ハードコードするかということになる。

②と③はいずれもディスアセンブルされると、p12のPINが漏洩する可能性がある。インポート後は消去するなど、P12ファイルの管理が重要だ。

有効な証明書を表示する

‘ コンピューター名の取得
Dim ComputerName As String = System.Environment.MachineName

‘現時点で有効な証明書に絞り込む
Dim value As X509Certificate2
values = values.Find(X509FindType.FindByTimeValid, Now, True)

‘発行者情報がABCである証明書を絞り込み
values = values.Find(X509FindType.FindByIssuerName, “ABC”, True)

‘識別名 (DN) がコンピュータ名である証明書を絞り込み
values = values.Find(X509FindType.FindBySubjectDistinguishedName, ComputerName, True)

Console.WriteLine(“証明書の発行局  :” & value.Issuer)
Console.WriteLine(“証明書の有効期限 :” & value.NotAfter)
Console.WriteLine(“サブジェクト識別名:” & value.Subject)
Console.WriteLine(value.NotBefore)