| ||||
| ||||
Добрый день. Вот бьюсь уже который день... Программирую на .NET. Есть: сертификат (контекст сертификата или сертификат в кодировке BASE64) и список отзыва сертификатов (контекст СОС или СОС в кодировке BASE64). Необходимо: получить дату отзыва сертификата! Где искал, что пробовал: искал в обьектах CertAdmin, CertView, CertRequest, CAPICOM. Что нашел: CryptoAPI есть функция CertFindCertificateInCRL. Вроде бы то, что надо...вот что делаю: [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] public struct CRYPT_INTEGER_BLOB { public uint cbData; public IntPtr pbData; } [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] public struct CRL_ENTRY { public CRYPT_INTEGER_BLOB serialNumber; public FILETIME RevocationDate; public uint cExtension; public IntPtr rgExtension; } [DllImport("Crypt32.DLL", EntryPoint="CertCreateCertificateContext", SetLastError=true, CharSet=CharSet.Unicode, ExactSpelling=false, CallingConvention=CallingConvention.StdCall)] private static extern IntPtr CertCreateCertificateContext( int dwCertEncodingType, byte[] pbCertEncoded, int cbCertEncoded); [DllImport("CRYPT32.DLL", SetLastError=true)] private static extern IntPtr CertCreateCRLContext( uint dwCertEncodingType, byte[] pbCrlEncoded, uint cbCrlEncoded); [DllImport("crypt32.dll", SetLastError=true)] private static extern bool CertFindCertificateInCRL( IntPtr pCert, IntPtr pCrlContext, uint dwFlags, IntPtr pvReserved, ref IntPtr ppCrlEntry); ------------------------------- private string GetRevocationDateTime(string certStr, string crlStr) { byte[] cert = Convert.FromBase64String(certStr); byte[] crl = Convert.FromBase64String(crlStr); IntPtr certContext = CertCreateCertificateContext(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, cert, cert.Length); IntPtr crlContext = CertCreateCRLContext(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, crl, (uint)crl.Length); IntPtr pCrlInfo = IntPtr.Zero; if ( CertFindCertificateInCRL(certContext, crlContext, 0, IntPtr.Zero, ref pCrlInfo) ) { if ( pCrlInfo != IntPtr.Zero ) { CRL_ENTRY info = (CRL_ENTRY)Marshal.PtrToStructure(pCrlInfo, typeof(CRL_ENTRY)); string serialnuber = Marshal.PtrToStringUni(info.serialNumber.pbData, (int)info.serialNumber.cbData); long ft = (long)(info.RevocationDate.dwHighDateTime << 32) + info.RevocationDate.dwLowDateTime; DateTime revocationDate = DateTime.FromFileTimeUtc(ft); string revocationDateStr = revocationDate.ToString(); } } return revocationDateStr; } // END FUNCTION GetRevocationDateTime ----------------------------------------------- Проблема в том, что в revocationDateStr, serialNumber я получаю всякую белеберду, совершенно не похожую на то, что надо! Может у кого есть какие соображения...? help plz |