.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ファイルの管理が重要だ。