X509Certificate が取り消されたときにプログラムで取得するにはどうすればよいですか? 証明書が取り消された場合は情報を取得できますが、いつ取り消されるかを取得する必要があります.CRLリストにはその情報があると思いますが、誰かがそれを読む方法を教えてもらえますか.
8 に答える
CRL は、X509Certificate オブジェクトの拡張プロパティに OID として格納されます。OID FriendlyName と Value は「CRL Distribution Points」と「2.5.29.31」です。証明書の拡張子で値 2.5.29.31 の OID を検索すると、生データを解析して配布ポイントを取得できます。
次のコード サンプルはこちらで見つかりました。公的に署名された証明書と内部の Microsoft CA 証明書の両方でテストしました。URL または LDAP 接続文字列を返します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace System.Security.Cryptography.X509Certificates
{
public static class X509Certificate2Extensions
{
/// <summary>
/// Returns an array of CRL distribution points for X509Certificate2 object.
/// </summary>
/// <param name="certificate">X509Certificate2 object.</param>
/// <returns>Array of CRL distribution points.</returns>
public static string[] GetCrlDistributionPoints(this X509Certificate2 certificate)
{
X509Extension ext = certificate.Extensions.Cast<X509Extension>().FirstOrDefault(
e => e.Oid.Value == "2.5.29.31");
if (ext == null || ext.RawData == null || ext.RawData.Length < 11)
return EmptyStrings;
int prev = -2;
List<string> items = new List<string>();
while (prev != -1 && ext.RawData.Length > prev + 1)
{
int next = IndexOf(ext.RawData, 0x86, prev == -2 ? 8 : prev + 1);
if (next == -1)
{
if (prev >= 0)
{
string item = Encoding.UTF8.GetString(ext.RawData, prev + 2, ext.RawData.Length - (prev + 2));
items.Add(item);
}
break;
}
if (prev >= 0 && next > prev)
{
string item = Encoding.UTF8.GetString(ext.RawData, prev + 2, next - (prev + 2));
items.Add(item);
}
prev = next;
}
return items.ToArray();
}
static int IndexOf(byte[] instance, byte item, int start)
{
for (int i = start, l = instance.Length; i < l; i++)
if (instance[i] == item)
return i;
return -1;
}
static string[] EmptyStrings = new string[0];
}
}
失効ステータスは、(a) CRL リストを取得し、そこに証明書がリストされているかどうかを確認し、(b) OCSP 要求をサーバーに送信して同じことを確認することによって確認されます。
.NET では、これを行うことはできません。CryptoAPI にはこれらの操作のための何らかの手段があるかもしれませんが、最も簡単な方法は .NET 用のサードパーティ ライブラリを使用することです。BouncyCastle は OCSP と CRL をある程度サポートしていると主張しており、SecureBlackbox は OCSP と CRL を完全にサポート (クライアント コンポーネントとサーバー コンポーネントの両方が利用可能) しており、完全な証明書検証 (すべての CRL と OCSP チェックと必要に応じて HTTP および LDAP 通信) を 1 つのメソッド呼び出しで実行します。
将来の読者のために。
既に述べたように、.NET は現在、パブリック クラス、X.509 証明書失効リスト、および OCSP メッセージングを公開していません。もちろん、独自のコードを記述したり、サード パーティのライブラリを使用したりすることもできます。
PowerShell PKIモジュール プロジェクト (PKI.Core.dll ライブラリ)から独自の CryptoAPI マネージ拡張機能を試すことができます。X509 CRL マネージ クラス (CryptoAPI ネイティブ関数の上に構築) のサポートがあります: X509CRL2 クラス。RevokedCertificates プロパティは、失効した証明書の配列を格納します。さらに、ライブラリには、PKI.OCSP 名前空間に格納されている OCSP メッセージング クラス (完全に管理されている) が含まれています。証明書の AIA 拡張に OCSP リンクが含まれている場合、 OCSPRequestオブジェクトをインスタンス化し、 OCSPRequest.SendRequestメソッドを呼び出すことで、X509Certificate2 オブジェクトから OCSP 要求を簡単に作成できます。戻りオブジェクトはOCSPResponseクラスのインスタンスです。
基本的に、コードは次のようになります。
using System;
using System.Security.Cryptography.X509Certificates;
using PKI.OCSP;
public class Class1 {
public static DateTime? GetrevocationDate(X509Certificate2 cert) {
OCSPRequest request = new OCSPRequest(cert);
OCSPResponse response = request.SendRequest();
if (response.Responses[0].CertStatus == CertificateStatus.Revoked) {
return response.Responses[0].RevocationInfo.RevocationDate;
}
return null;
}
}
NULL は、証明書が取り消されていないことを意味します。
X509 CRL では、コードは次のようになります。
using System;
using System.Security.Cryptography.X509Certificates;
public class Class1 {
// crlRawData could a type of System.String and pass the path to a CRL file there.
public static DateTime? GetrevocationDate(X509Certificate2 cert, Byte[] crlRawData) {
X509CRL2 crl = new X509CRL2(crlRawData);
X509CRLEntry entry = crl.RevokedCertificates[cert.SerialNumber];
if (entry != null) {
return entry.RevocationDate;
}
return null;
}
}
x509.h ファイルからこの API を使用する openssl 1.0 またはそれ以降のバージョンを使用する
X509_CRL_get0_by_cert(X509_CRL *crl, X509_REVOKED **ret, X509 *x);
確認したい証明書の X ;
Ret は失効構造の Address であり、失効の理由と格納されているすべての
crl は CRL です。
上記の@Hiveの回答に賛成票を投じるという評判はありませんが、言語を除いて、まさに私が必要としていたものでした。以下に PowerShell ポートを投稿しました。
$cert = (Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object {$_.Subject -match "SUBJECT NAME*"})
function IndexOfByte([byte[]]$instance, [byte]$item, [int]$start)
{
$len = $instance.Length
for ($i = $start; $i -lt $len; $i++) {
if ($instance[$i] -eq $item) { return $i }
}
return -1;
}
$crls = $cert.Extensions | ? { $_.Oid.FriendlyName -eq "CRL Distribution Points" }
$prev = -2;
[System.Collections.ArrayList]$items = @();
while ($prev -ne -1 -and $crls.RawData.Length -gt $prev + 1)
{
if($prev -eq -2) { $y = 8 } else {$y = $prev + 1}
$next = IndexOfByte -instance $crls.RawData -item 0x86 -start $y
if ($next -eq -1) {
if ($prev -ge 0) {
$item = [system.Text.Encoding]::UTF8.GetString($crls.RawData, $prev + 2, $crls.RawData.Length - ($prev + 2));
$items.Add($item);
}
break;
}
if ($prev -ge 0 -and $next -gt $prev) {
$item = [system.Text.Encoding]::UTF8.GetString($crls.RawData, $prev + 2, $next - ($prev + 2));
$items.Add($item);
}
$prev = $next;
}
Write-Host "Certificate CRLs: `n$($items | out-string)"
これはあなたを助けることができます:
よろしく。
取り消されたということは、無効ということですか?取り消された場合、Web サーバーが最初に邪魔になるため、コード内のリクエストに到達するとは思われません。
x509certificate から派生した x509certificate2 を使用すると、さらに多くのプロパティを確認できます。以下のリンクにいくつかの例があります。