Skip to content

Instantly share code, notes, and snippets.

@Benshi
Last active September 27, 2023 03:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Benshi/49a257a3f97d43691f349a32647363c9 to your computer and use it in GitHub Desktop.
Save Benshi/49a257a3f97d43691f349a32647363c9 to your computer and use it in GitHub Desktop.
[C#] クライアント証明書の判定

certmgr.msc の「個人」にある証明書を列挙するには X509Certificate2Collection クラス を使う。
さらにそこから、個々の証明書の『目的』を得る実験的サンプル。

「クライアント認証」用の証明書を列挙するため、 X509KeyUsageExtension クラス を得るようにする。

Certificate Extensions は、X509Certificate2 オブジェクトに対して、 cert.Extensions[Oid] で得られる。
標準目的となる "Key Usage" の Oid は "2.5.29.15" で、
"Extended Key Usage" (EKU) の Oid は "2.5.29.37"

戻り値はそれぞれ、X509KeyUsageExtension クラスX509EnhancedKeyUsageExtensionのインスタンスとして得られる。
証明書から情報を得られなかった場合は null。
cert.Extensions を foreach で全列挙して、.Oid.FriendlyName を確認するという手もあるが、Oid が分かっている場合は直接指定した方が手っ取り早い。
image

そしてクライアント認証であれば、EKU フィールドを表す X509EnhancedKeyUsageExtension クラスのインスタンスを取得した後、EnhancedKeyUsages プロパティから、クライアント認証を示す Oid "1.3.6.1.5.5.7.3.2" の存在を確認すれば OK。
ちなみにサーバー証明書の場合は、Oid "1.3.6.1.5.5.7.3.1" である。

// class 宣言は省略しています。
//
public static bool CanUseForClientAuthentication(X509Certificate2 cert)
{
 // const string KeyUsage = "2.5.29.15";
 const string ExtKeyUsage = "2.5.29.37";
 var flag = X509KeyUsageFlags.DataEncipherment & X509KeyUsageFlags.DigitalSignature;
 var extKeyUsage = (X509KeyUsageExtension)cert.Extensions[KeyUsage];
 if (extKeyUsage != null && !extKeyUsage.KeyUsages.HasFlag(flag))
 {
  // 『証明書キーの利用目的』が限定されている状態で、かつ、
  // 「デジタル証明書」「キーの暗号化」のいずれかの利用が許可されていない
  return false;
 }
 
 const string ClientAuthentication = "1.3.6.1.5.5.7.3.2";
 // const string ServerAuthentication = "1.3.6.1.5.5.7.3.1";
 var extEnhancedKeyUsage = (X509EnhancedKeyUsageExtension)cert.Extensions[EnhancedKeyUsage];
 if (extEnhancedKeyUsage != null && extEnhancedKeyUsage.EnhancedKeyUsages[ClientAuthentication] != null)
 {
  // EKUフィールド(拡張キー使用法)において、
  //「クライアント認証」がサポートされている
  return true;
 }
 
 return false;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment