カテゴリー別アーカイブ: VB.NET

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

無線LANなどの802.11 認証に使うための証明書は、デバイスIDなどのコンピュータを証明するための証明書を利用する。

この場合、インポート先のストアは、Windows の証明書ストアの[ コンピュータ ]-[ 個人 ] である。

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

そこでプログラムからp12形式の証明書をインポートする際のポイントを紹介する。お決まりの x509Certificate2 を使う。

Dim computerCert As New X509Certificate2(distCerFile, pWord, X509KeyStorageFlags.MachineKeySet Or  X509KeyStorageFlags.PersistKeySet)

‘ X509KeyStorageFlags.MachineKeySet だけではダメで、
or X509KeyStorageFlags.PersistKeySet を指定しないと、
一見インポートされているように見えるが、実際には機能しないので要注意。

‘ ストア指定、
Dim myStore As New X509Store(StoreName.My, StoreLocation.LocalMachine)

‘ ストアオープン
myStore.Open(OpenFlags.ReadWrite)

‘ 証明書追加
myStore.Add(computerCert)

その後クローズということである。

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

有効な証明書を表示する

‘ コンピューター名の取得
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)