X509Certificate2 Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Представляет сертификат X.509.
public ref class X509Certificate2 : System::Security::Cryptography::X509Certificates::X509Certificate
public class X509Certificate2 : System.Security.Cryptography.X509Certificates.X509Certificate
[System.Serializable]
public class X509Certificate2 : System.Security.Cryptography.X509Certificates.X509Certificate
type X509Certificate2 = class
inherit X509Certificate
[<System.Serializable>]
type X509Certificate2 = class
inherit X509Certificate
Public Class X509Certificate2
Inherits X509Certificate
- Наследование
- Атрибуты
Примеры
В следующем примере показано, как использовать X509Certificate2 объект для шифрования и расшифровки файла.
using System;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.IO;
using System.Text;
// To run this sample use the Certificate Creation Tool (Makecert.exe) to generate a test X.509 certificate and
// place it in the local user store.
// To generate an exchange key and make the key exportable run the following command from a Visual Studio command prompt:
//makecert -r -pe -n "CN=CERT_SIGN_TEST_CERT" -b 01/01/2010 -e 01/01/2012 -sky exchange -ss my
namespace X509CertEncrypt
{
class Program
{
// Path variables for source, encryption, and
// decryption folders. Must end with a backslash.
private static string encrFolder = @"C:\Encrypt\";
private static string decrFolder = @"C:\Decrypt\";
private static string originalFile = "TestData.txt";
private static string encryptedFile = "TestData.enc";
static void Main(string[] args)
{
// Create an input file with test data.
StreamWriter sw = File.CreateText(originalFile);
sw.WriteLine("Test data to be encrypted");
sw.Close();
// Get the certificate to use to encrypt the key.
X509Certificate2 cert = GetCertificateFromStore("CN=CERT_SIGN_TEST_CERT");
if (cert == null)
{
Console.WriteLine("Certificate 'CN=CERT_SIGN_TEST_CERT' not found.");
Console.ReadLine();
}
// Encrypt the file using the public key from the certificate.
EncryptFile(originalFile, (RSA)cert.PublicKey.Key);
// Decrypt the file using the private key from the certificate.
DecryptFile(encryptedFile, cert.GetRSAPrivateKey());
//Display the original data and the decrypted data.
Console.WriteLine("Original: {0}", File.ReadAllText(originalFile));
Console.WriteLine("Round Trip: {0}", File.ReadAllText(decrFolder + originalFile));
Console.WriteLine("Press the Enter key to exit.");
Console.ReadLine();
}
private static X509Certificate2 GetCertificateFromStore(string certName)
{
// Get the certificate store for the current user.
X509Store store = new X509Store(StoreLocation.CurrentUser);
try
{
store.Open(OpenFlags.ReadOnly);
// Place all certificates in an X509Certificate2Collection object.
X509Certificate2Collection certCollection = store.Certificates;
// If using a certificate with a trusted root you do not need to FindByTimeValid, instead:
// currentCerts.Find(X509FindType.FindBySubjectDistinguishedName, certName, true);
X509Certificate2Collection currentCerts = certCollection.Find(X509FindType.FindByTimeValid, DateTime.Now, false);
X509Certificate2Collection signingCert = currentCerts.Find(X509FindType.FindBySubjectDistinguishedName, certName, false);
if (signingCert.Count == 0)
return null;
// Return the first certificate in the collection, has the right name and is current.
return signingCert[0];
}
finally
{
store.Close();
}
}
// Encrypt a file using a public key.
private static void EncryptFile(string inFile, RSA rsaPublicKey)
{
using (Aes aes = Aes.Create())
{
// Create instance of Aes for
// symmetric encryption of the data.
aes.KeySize = 256;
aes.Mode = CipherMode.CBC;
using (ICryptoTransform transform = aes.CreateEncryptor())
{
RSAPKCS1KeyExchangeFormatter keyFormatter = new RSAPKCS1KeyExchangeFormatter(rsaPublicKey);
byte[] keyEncrypted = keyFormatter.CreateKeyExchange(aes.Key, aes.GetType());
// Create byte arrays to contain
// the length values of the key and IV.
byte[] LenK = new byte[4];
byte[] LenIV = new byte[4];
int lKey = keyEncrypted.Length;
LenK = BitConverter.GetBytes(lKey);
int lIV = aes.IV.Length;
LenIV = BitConverter.GetBytes(lIV);
// Write the following to the FileStream
// for the encrypted file (outFs):
// - length of the key
// - length of the IV
// - encrypted key
// - the IV
// - the encrypted cipher content
int startFileName = inFile.LastIndexOf("\\") + 1;
// Change the file's extension to ".enc"
string outFile = encrFolder + inFile.Substring(startFileName, inFile.LastIndexOf(".") - startFileName) + ".enc";
Directory.CreateDirectory(encrFolder);
using (FileStream outFs = new FileStream(outFile, FileMode.Create))
{
outFs.Write(LenK, 0, 4);
outFs.Write(LenIV, 0, 4);
outFs.Write(keyEncrypted, 0, lKey);
outFs.Write(aes.IV, 0, lIV);
// Now write the cipher text using
// a CryptoStream for encrypting.
using (CryptoStream outStreamEncrypted = new CryptoStream(outFs, transform, CryptoStreamMode.Write))
{
// By encrypting a chunk at
// a time, you can save memory
// and accommodate large files.
int count = 0;
// blockSizeBytes can be any arbitrary size.
int blockSizeBytes = aes.BlockSize / 8;
byte[] data = new byte[blockSizeBytes];
int bytesRead = 0;
using (FileStream inFs = new FileStream(inFile, FileMode.Open))
{
do
{
count = inFs.Read(data, 0, blockSizeBytes);
outStreamEncrypted.Write(data, 0, count);
bytesRead += count;
}
while (count > 0);
inFs.Close();
}
outStreamEncrypted.FlushFinalBlock();
outStreamEncrypted.Close();
}
outFs.Close();
}
}
}
}
// Decrypt a file using a private key.
private static void DecryptFile(string inFile, RSA rsaPrivateKey)
{
// Create instance of Aes for
// symmetric decryption of the data.
using (Aes aes = Aes.Create())
{
aes.KeySize = 256;
aes.Mode = CipherMode.CBC;
// Create byte arrays to get the length of
// the encrypted key and IV.
// These values were stored as 4 bytes each
// at the beginning of the encrypted package.
byte[] LenK = new byte[4];
byte[] LenIV = new byte[4];
// Construct the file name for the decrypted file.
string outFile = decrFolder + inFile.Substring(0, inFile.LastIndexOf(".")) + ".txt";
// Use FileStream objects to read the encrypted
// file (inFs) and save the decrypted file (outFs).
using (FileStream inFs = new FileStream(encrFolder + inFile, FileMode.Open))
{
inFs.Seek(0, SeekOrigin.Begin);
inFs.Seek(0, SeekOrigin.Begin);
inFs.Read(LenK, 0, 3);
inFs.Seek(4, SeekOrigin.Begin);
inFs.Read(LenIV, 0, 3);
// Convert the lengths to integer values.
int lenK = BitConverter.ToInt32(LenK, 0);
int lenIV = BitConverter.ToInt32(LenIV, 0);
// Determine the start position of
// the cipher text (startC)
// and its length(lenC).
int startC = lenK + lenIV + 8;
int lenC = (int)inFs.Length - startC;
// Create the byte arrays for
// the encrypted Aes key,
// the IV, and the cipher text.
byte[] KeyEncrypted = new byte[lenK];
byte[] IV = new byte[lenIV];
// Extract the key and IV
// starting from index 8
// after the length values.
inFs.Seek(8, SeekOrigin.Begin);
inFs.Read(KeyEncrypted, 0, lenK);
inFs.Seek(8 + lenK, SeekOrigin.Begin);
inFs.Read(IV, 0, lenIV);
Directory.CreateDirectory(decrFolder);
// Use RSA
// to decrypt the Aes key.
byte[] KeyDecrypted = rsaPrivateKey.Decrypt(KeyEncrypted, RSAEncryptionPadding.Pkcs1);
// Decrypt the key.
using (ICryptoTransform transform = aes.CreateDecryptor(KeyDecrypted, IV))
{
// Decrypt the cipher text from
// from the FileSteam of the encrypted
// file (inFs) into the FileStream
// for the decrypted file (outFs).
using (FileStream outFs = new FileStream(outFile, FileMode.Create))
{
int count = 0;
int blockSizeBytes = aes.BlockSize / 8;
byte[] data = new byte[blockSizeBytes];
// By decrypting a chunk a time,
// you can save memory and
// accommodate large files.
// Start at the beginning
// of the cipher text.
inFs.Seek(startC, SeekOrigin.Begin);
using (CryptoStream outStreamDecrypted = new CryptoStream(outFs, transform, CryptoStreamMode.Write))
{
do
{
count = inFs.Read(data, 0, blockSizeBytes);
outStreamDecrypted.Write(data, 0, count);
}
while (count > 0);
outStreamDecrypted.FlushFinalBlock();
outStreamDecrypted.Close();
}
outFs.Close();
}
inFs.Close();
}
}
}
}
}
}
Imports System.Security.Cryptography
Imports System.Security.Cryptography.X509Certificates
Imports System.IO
Imports System.Text
' To run this sample use the Certificate Creation Tool (Makecert.exe) to generate a test X.509 certificate and
' place it in the local user store.
' To generate an exchange key and make the key exportable run the following command from a Visual Studio command prompt:
'makecert -r -pe -n "CN=CERT_SIGN_TEST_CERT" -b 01/01/2010 -e 01/01/2012 -sky exchange -ss my
Class Program
' Path variables for source, encryption, and
' decryption folders. Must end with a backslash.
Private Shared encrFolder As String = "C:\Encrypt\"
Private Shared decrFolder As String = "C:\Decrypt\"
Private Shared originalFile As String = "TestData.txt"
Private Shared encryptedFile As String = "TestData.enc"
Shared Sub Main(ByVal args() As String)
' Create an input file with test data.
Dim sw As StreamWriter = File.CreateText(originalFile)
sw.WriteLine("Test data to be encrypted")
sw.Close()
' Get the certificate to use to encrypt the key.
Dim cert As X509Certificate2 = GetCertificateFromStore("CN=CERT_SIGN_TEST_CERT")
If cert Is Nothing Then
Console.WriteLine("Certificate 'CN=CERT_SIGN_TEST_CERT' not found.")
Console.ReadLine()
End If
' Encrypt the file using the public key from the certificate.
EncryptFile(originalFile, CType(cert.PublicKey.Key, RSA))
' Decrypt the file using the private key from the certificate.
DecryptFile(encryptedFile, cert.GetRSAPrivateKey())
'Display the original data and the decrypted data.
Console.WriteLine("Original: {0}", File.ReadAllText(originalFile))
Console.WriteLine("Round Trip: {0}", File.ReadAllText(decrFolder + originalFile))
Console.WriteLine("Press the Enter key to exit.")
Console.ReadLine()
End Sub
Private Shared Function GetCertificateFromStore(ByVal certName As String) As X509Certificate2
' Get the certificate store for the current user.
Dim store As New X509Store(StoreLocation.CurrentUser)
Try
store.Open(OpenFlags.ReadOnly)
' Place all certificates in an X509Certificate2Collection object.
Dim certCollection As X509Certificate2Collection = store.Certificates
' If using a certificate with a trusted root you do not need to FindByTimeValid, instead use:
' currentCerts.Find(X509FindType.FindBySubjectDistinguishedName, certName, true);
Dim currentCerts As X509Certificate2Collection = certCollection.Find(X509FindType.FindByTimeValid, DateTime.Now, False)
Dim signingCert As X509Certificate2Collection = currentCerts.Find(X509FindType.FindBySubjectDistinguishedName, certName, False)
If signingCert.Count = 0 Then
Return Nothing
End If ' Return the first certificate in the collection, has the right name and is current.
Return signingCert(0)
Finally
store.Close()
End Try
End Function 'GetCertificateFromStore
' Encrypt a file using a public key.
Private Shared Sub EncryptFile(ByVal inFile As String, ByVal rsaPublicKey As RSA)
Dim aes As Aes = Aes.Create()
Try
' Create instance of Aes for
' symmetric encryption of the data.
aes.KeySize = 256
aes.Mode = CipherMode.CBC
Dim transform As ICryptoTransform = aes.CreateEncryptor()
Try
Dim keyFormatter As New RSAPKCS1KeyExchangeFormatter(rsaPublicKey)
Dim keyEncrypted As Byte() = keyFormatter.CreateKeyExchange(aes.Key, aes.GetType())
' Create byte arrays to contain
' the length values of the key and IV.
Dim LenK(3) As Byte
Dim LenIV(3) As Byte
Dim lKey As Integer = keyEncrypted.Length
LenK = BitConverter.GetBytes(lKey)
Dim lIV As Integer = aes.IV.Length
LenIV = BitConverter.GetBytes(lIV)
' Write the following to the FileStream
' for the encrypted file (outFs):
' - length of the key
' - length of the IV
' - encrypted key
' - the IV
' - the encrypted cipher content
Dim startFileName As Integer = inFile.LastIndexOf("\") + 1
' Change the file's extension to ".enc"
Dim outFile As String = encrFolder + inFile.Substring(startFileName, inFile.LastIndexOf(".") - startFileName) + ".enc"
Directory.CreateDirectory(encrFolder)
Dim outFs As New FileStream(outFile, FileMode.Create)
Try
outFs.Write(LenK, 0, 4)
outFs.Write(LenIV, 0, 4)
outFs.Write(keyEncrypted, 0, lKey)
outFs.Write(aes.IV, 0, lIV)
' Now write the cipher text using
' a CryptoStream for encrypting.
Dim outStreamEncrypted As New CryptoStream(outFs, transform, CryptoStreamMode.Write)
Try
' By encrypting a chunk at
' a time, you can save memory
' and accommodate large files.
Dim count As Integer = 0
' blockSizeBytes can be any arbitrary size.
Dim blockSizeBytes As Integer = aes.BlockSize / 8
Dim data(blockSizeBytes) As Byte
Dim bytesRead As Integer = 0
Dim inFs As New FileStream(inFile, FileMode.Open)
Try
Do
count = inFs.Read(data, 0, blockSizeBytes)
outStreamEncrypted.Write(data, 0, count)
bytesRead += count
Loop While count > 0
inFs.Close()
Finally
inFs.Dispose()
End Try
outStreamEncrypted.FlushFinalBlock()
outStreamEncrypted.Close()
Finally
outStreamEncrypted.Dispose()
End Try
outFs.Close()
Finally
outFs.Dispose()
End Try
Finally
transform.Dispose()
End Try
Finally
aes.Dispose()
End Try
End Sub
' Decrypt a file using a private key.
Private Shared Sub DecryptFile(ByVal inFile As String, ByVal rsaPrivateKey As RSA)
' Create instance of Aes for
' symmetric decryption of the data.
Dim aes As Aes = Aes.Create()
Try
aes.KeySize = 256
aes.Mode = CipherMode.CBC
' Create byte arrays to get the length of
' the encrypted key and IV.
' These values were stored as 4 bytes each
' at the beginning of the encrypted package.
Dim LenK() As Byte = New Byte(4 - 1) {}
Dim LenIV() As Byte = New Byte(4 - 1) {}
' Consruct the file name for the decrypted file.
Dim outFile As String = decrFolder + inFile.Substring(0, inFile.LastIndexOf(".")) + ".txt"
' Use FileStream objects to read the encrypted
' file (inFs) and save the decrypted file (outFs).
Dim inFs As New FileStream(encrFolder + inFile, FileMode.Open)
Try
inFs.Seek(0, SeekOrigin.Begin)
inFs.Seek(0, SeekOrigin.Begin)
inFs.Read(LenK, 0, 3)
inFs.Seek(4, SeekOrigin.Begin)
inFs.Read(LenIV, 0, 3)
' Convert the lengths to integer values.
Dim lengthK As Integer = BitConverter.ToInt32(LenK, 0)
Dim lengthIV As Integer = BitConverter.ToInt32(LenIV, 0)
' Determine the start postition of
' the cipher text (startC)
' and its length(lenC).
Dim startC As Integer = lengthK + lengthIV + 8
Dim lenC As Integer = (CType(inFs.Length, Integer) - startC)
' Create the byte arrays for
' the encrypted AES key,
' the IV, and the cipher text.
Dim KeyEncrypted() As Byte = New Byte(lengthK - 1) {}
Dim IV() As Byte = New Byte(lengthIV - 1) {}
' Extract the key and IV
' starting from index 8
' after the length values.
inFs.Seek(8, SeekOrigin.Begin)
inFs.Read(KeyEncrypted, 0, lengthK)
inFs.Seek(8 + lengthK, SeekOrigin.Begin)
inFs.Read(IV, 0, lengthIV)
Directory.CreateDirectory(decrFolder)
' Use RSA
' to decrypt the AES key.
Dim KeyDecrypted As Byte() = rsaPrivateKey.Decrypt(KeyEncrypted, RSAEncryptionPadding.Pkcs1)
' Decrypt the key.
Dim transform As ICryptoTransform = aes.CreateDecryptor(KeyDecrypted, IV)
' Decrypt the cipher text from
' from the FileSteam of the encrypted
' file (inFs) into the FileStream
' for the decrypted file (outFs).
Dim outFs As New FileStream(outFile, FileMode.Create)
Try
' Decrypt the cipher text from
' from the FileSteam of the encrypted
' file (inFs) into the FileStream
' for the decrypted file (outFs).
Dim count As Integer = 0
Dim blockSizeBytes As Integer = aes.BlockSize / 8
Dim data(blockSizeBytes) As Byte
' By decrypting a chunk a time,
' you can save memory and
' accommodate large files.
' Start at the beginning
' of the cipher text.
inFs.Seek(startC, SeekOrigin.Begin)
Dim outStreamDecrypted As New CryptoStream(outFs, transform, CryptoStreamMode.Write)
Try
Do
count = inFs.Read(data, 0, blockSizeBytes)
outStreamDecrypted.Write(data, 0, count)
Loop While count > 0
outStreamDecrypted.FlushFinalBlock()
outStreamDecrypted.Close()
Finally
outStreamDecrypted.Dispose()
End Try
outFs.Close()
Finally
outFs.Dispose()
End Try
inFs.Close()
Finally
inFs.Dispose()
End Try
Finally
aes.Dispose()
End Try
End Sub
End Class
В следующем примере создается исполняемый файл командной строки, который принимает файл сертификата в качестве аргумента и выводит на консоль различные свойства сертификата.
#using <System.dll>
using namespace System;
using namespace System::Security::Cryptography;
using namespace System::Security::Permissions;
using namespace System::IO;
using namespace System::Security::Cryptography::X509Certificates;
//Reads a file.
array<Byte>^ ReadFile( String^ fileName )
{
FileStream^ f = gcnew FileStream( fileName,FileMode::Open,FileAccess::Read );
int size = (int)f->Length;
array<Byte>^data = gcnew array<Byte>(size);
size = f->Read( data, 0, size );
f->Close();
return data;
}
[SecurityPermissionAttribute(SecurityAction::LinkDemand, Unrestricted = true)]
int main()
{
array<String^>^args = Environment::GetCommandLineArgs();
//Test for correct number of arguments.
if ( args->Length < 2 )
{
Console::WriteLine( "Usage: CertInfo <filename>" );
return -1;
}
try
{
System::Security::Cryptography::X509Certificates::X509Certificate2 ^ x509 =
gcnew System::Security::Cryptography::X509Certificates::X509Certificate2;
//Create X509Certificate2 object from .cer file.
array<Byte>^rawData = ReadFile( args[ 1 ] );
x509->Import(rawData);
//Print to console information contained in the certificate.
Console::WriteLine( "{0}Subject: {1}{0}", Environment::NewLine, x509->Subject );
Console::WriteLine( "{0}Issuer: {1}{0}", Environment::NewLine, x509->Issuer );
Console::WriteLine( "{0}Version: {1}{0}", Environment::NewLine, x509->Version );
Console::WriteLine( "{0}Valid Date: {1}{0}", Environment::NewLine, x509->NotBefore );
Console::WriteLine( "{0}Expiry Date: {1}{0}", Environment::NewLine, x509->NotAfter );
Console::WriteLine( "{0}Thumbprint: {1}{0}", Environment::NewLine, x509->Thumbprint );
Console::WriteLine( "{0}Serial Number: {1}{0}", Environment::NewLine, x509->SerialNumber );
Console::WriteLine( "{0}Friendly Name: {1}{0}", Environment::NewLine, x509->PublicKey->Oid->FriendlyName );
Console::WriteLine( "{0}Public Key Format: {1}{0}", Environment::NewLine, x509->PublicKey->EncodedKeyValue->Format(true) );
Console::WriteLine( "{0}Raw Data Length: {1}{0}", Environment::NewLine, x509->RawData->Length );
Console::WriteLine( "{0}Certificate to string: {1}{0}", Environment::NewLine, x509->ToString( true ) );
Console::WriteLine( "{0}Certificate to XML String: {1}{0}", Environment::NewLine, x509->PublicKey->Key->ToXmlString( false ) );
//Add the certificate to a X509Store.
X509Store ^ store = gcnew X509Store;
store->Open( OpenFlags::MaxAllowed );
store->Add( x509 );
store->Close();
}
catch ( DirectoryNotFoundException^ )
{
Console::WriteLine( "Error: The directory specified could not be found." );
}
catch ( IOException^ )
{
Console::WriteLine( "Error: A file in the directory could not be accessed." );
}
catch ( NullReferenceException^ )
{
Console::WriteLine( "File must be a .cer file. Program does not have access to that type of file." );
}
}
using System;
using System.Security.Cryptography;
using System.Security.Permissions;
using System.IO;
using System.Security.Cryptography.X509Certificates;
class CertInfo
{
//Reads a file.
internal static byte[] ReadFile (string fileName)
{
FileStream f = new FileStream(fileName, FileMode.Open, FileAccess.Read);
int size = (int)f.Length;
byte[] data = new byte[size];
size = f.Read(data, 0, size);
f.Close();
return data;
}
//Main method begins here.
static void Main(string[] args)
{
//Test for correct number of arguments.
if (args.Length < 1)
{
Console.WriteLine("Usage: CertInfo <filename>");
return;
}
try
{
byte[] rawData = ReadFile(args[0]);
//Create X509Certificate2 object from .cer file.
X509Certificate2 x509 = new X509Certificate2(rawData);
//Print to console information contained in the certificate.
Console.WriteLine("{0}Subject: {1}{0}", Environment.NewLine, x509.Subject);
Console.WriteLine("{0}Issuer: {1}{0}", Environment.NewLine, x509.Issuer);
Console.WriteLine("{0}Version: {1}{0}", Environment.NewLine, x509.Version);
Console.WriteLine("{0}Valid Date: {1}{0}", Environment.NewLine, x509.NotBefore);
Console.WriteLine("{0}Expiry Date: {1}{0}", Environment.NewLine, x509.NotAfter);
Console.WriteLine("{0}Thumbprint: {1}{0}", Environment.NewLine, x509.Thumbprint);
Console.WriteLine("{0}Serial Number: {1}{0}", Environment.NewLine, x509.SerialNumber);
Console.WriteLine("{0}Friendly Name: {1}{0}", Environment.NewLine, x509.PublicKey.Oid.FriendlyName);
Console.WriteLine("{0}Public Key Format: {1}{0}", Environment.NewLine, x509.PublicKey.EncodedKeyValue.Format(true));
Console.WriteLine("{0}Raw Data Length: {1}{0}", Environment.NewLine, x509.RawData.Length);
Console.WriteLine("{0}Certificate to string: {1}{0}", Environment.NewLine, x509.ToString(true));
Console.WriteLine("{0}Certificate to XML String: {1}{0}", Environment.NewLine, x509.PublicKey.Key.ToXmlString(false));
//Add the certificate to a X509Store.
X509Store store = new X509Store();
store.Open(OpenFlags.MaxAllowed);
store.Add(x509);
store.Close();
}
catch (DirectoryNotFoundException)
{
Console.WriteLine("Error: The directory specified could not be found.");
}
catch (IOException)
{
Console.WriteLine("Error: A file in the directory could not be accessed.");
}
catch (NullReferenceException)
{
Console.WriteLine("File must be a .cer file. Program does not have access to that type of file.");
}
}
}
Imports System.Security.Cryptography
Imports System.Security.Permissions
Imports System.IO
Imports System.Security.Cryptography.X509Certificates
Class CertInfo
'Reads a file.
Friend Shared Function ReadFile(ByVal fileName As String) As Byte()
Dim f As New FileStream(fileName, FileMode.Open, FileAccess.Read)
Dim size As Integer = Fix(f.Length)
Dim data(size - 1) As Byte
size = f.Read(data, 0, size)
f.Close()
Return data
End Function
<SecurityPermission(SecurityAction.LinkDemand, Unrestricted:=True)> _
Shared Sub Main(ByVal args() As String)
'Test for correct number of arguments.
If args.Length < 1 Then
Console.WriteLine("Usage: CertInfo <filename>")
Return
End If
Try
Dim x509 As New X509Certificate2()
'Create X509Certificate2 object from .cer file.
Dim rawData As Byte() = ReadFile(args(0))
x509.Import(rawData)
'Print to console information contained in the certificate.
Console.WriteLine("{0}Subject: {1}{0}", Environment.NewLine, x509.Subject)
Console.WriteLine("{0}Issuer: {1}{0}", Environment.NewLine, x509.Issuer)
Console.WriteLine("{0}Version: {1}{0}", Environment.NewLine, x509.Version)
Console.WriteLine("{0}Valid Date: {1}{0}", Environment.NewLine, x509.NotBefore)
Console.WriteLine("{0}Expiry Date: {1}{0}", Environment.NewLine, x509.NotAfter)
Console.WriteLine("{0}Thumbprint: {1}{0}", Environment.NewLine, x509.Thumbprint)
Console.WriteLine("{0}Serial Number: {1}{0}", Environment.NewLine, x509.SerialNumber)
Console.WriteLine("{0}Friendly Name: {1}{0}", Environment.NewLine, x509.PublicKey.Oid.FriendlyName)
Console.WriteLine("{0}Public Key Format: {1}{0}", Environment.NewLine, x509.PublicKey.EncodedKeyValue.Format(True))
Console.WriteLine("{0}Raw Data Length: {1}{0}", Environment.NewLine, x509.RawData.Length)
Console.WriteLine("{0}Certificate to string: {1}{0}", Environment.NewLine, x509.ToString(True))
Console.WriteLine("{0}Certificate to XML String: {1}{0}", Environment.NewLine, x509.PublicKey.Key.ToXmlString(False))
'Add the certificate to a X509Store.
Dim store As New X509Store()
store.Open(OpenFlags.MaxAllowed)
store.Add(x509)
store.Close()
Catch dnfExcept As DirectoryNotFoundException
Console.WriteLine("Error: The directory specified could not be found.")
Catch ioExpcept As IOException
Console.WriteLine("Error: A file in the directory could not be accessed.")
Catch nrExcept As NullReferenceException
Console.WriteLine("File must be a .cer file. Program does not have access to that type of file.")
End Try
End Sub
End Class
Комментарии
Структура X.509 возникла в рабочих группах Международной организации по стандартизации (ISO). Эта структура может использоваться для представления различных типов информации, включая удостоверения, права и атрибуты владельца (разрешения, возраст, пол, расположение, принадлежность и т. д.). Несмотря на то, что спецификации ISO наиболее информативны в отношении самой структуры, X509Certificate2 класс предназначен для моделирования сценариев использования, определенных в спецификациях, выданных рабочей группой Internet Engineering Task Force (IETF) Public Key Infrastructure, X.509 (PKIX). Наиболее информативным из этих спецификаций является RFC 3280, "Профиль списка отзыва сертификатов (CRL)".
Важно!
Начиная с платформа .NET Framework 4.6, этот тип реализует IDisposable интерфейс . По окончании использования выдаленную ему память следует прямо или косвенно освободить. Чтобы сделать это прямо, вызовите его метод Dispose в блоке try
/catch
. Чтобы сделать это косвенно, используйте языковые конструкции, такие как using
(в C#) или Using
(в Visual Basic). Дополнительные сведения см. в разделе "Использование объекта, реализующего IDisposable" в статье об интерфейсе IDisposable.
Для приложений, предназначенных для платформа .NET Framework 4.5.2 и более ранних версий, X509Certificate2 класс не реализует IDisposable интерфейс и, следовательно, не имеет Dispose
метода .
Конструкторы
X509Certificate2() |
Устаревшие..
Устаревшие..
Инициализирует новый экземпляр класса X509Certificate2. |
X509Certificate2(Byte[]) |
Устаревшие..
Инициализирует новый экземпляр класса X509Certificate2 с использованием информации из указанного массива байтов. |
X509Certificate2(Byte[], SecureString) |
Устаревшие..
Инициализирует новый экземпляр класса X509Certificate2 с использованием массива байтов и пароля. |
X509Certificate2(Byte[], SecureString, X509KeyStorageFlags) |
Устаревшие..
Инициализирует новый экземпляр класса X509Certificate2 с использованием массива байтов, пароля и флага хранилища ключей. |
X509Certificate2(Byte[], String) |
Устаревшие..
Инициализирует новый экземпляр класса X509Certificate2 с использованием массива байтов и пароля. |
X509Certificate2(Byte[], String, X509KeyStorageFlags) |
Устаревшие..
Инициализирует новый экземпляр класса X509Certificate2 с использованием массива байтов, пароля и флага хранилища ключей. |
X509Certificate2(IntPtr) |
Инициализирует новый экземпляр класса X509Certificate2 с помощью неуправляемого дескриптора. |
X509Certificate2(ReadOnlySpan<Byte>) |
Устаревшие..
Инициализирует новый экземпляр класса X509Certificate2 на основе данных сертификата. |
X509Certificate2(ReadOnlySpan<Byte>, ReadOnlySpan<Char>, X509KeyStorageFlags) |
Устаревшие..
Инициализирует новый экземпляр класса X509Certificate2 на основе данных сертификата, пароля и флагов хранилища ключа. |
X509Certificate2(SerializationInfo, StreamingContext) |
Устаревшие..
Инициализирует новый экземпляр класса X509Certificate2, используя заданную информацию о сериализации и контексте потоков. |
X509Certificate2(String) |
Устаревшие..
Инициализирует новый экземпляр класса X509Certificate2 с помощью имени файла сертификата. |
X509Certificate2(String, ReadOnlySpan<Char>, X509KeyStorageFlags) |
Устаревшие..
Инициализирует новый экземпляр класса X509Certificate2 с использованием имени файла сертификата, пароля и флага хранилища ключа. |
X509Certificate2(String, SecureString) |
Устаревшие..
Инициализирует новый экземпляр класса X509Certificate2 с использованием имени файла сертификата и пароля. |
X509Certificate2(String, SecureString, X509KeyStorageFlags) |
Устаревшие..
Инициализирует новый экземпляр класса X509Certificate2 с использованием имени файла сертификата, пароля и флага хранилища ключа. |
X509Certificate2(String, String) |
Устаревшие..
Инициализирует новый экземпляр класса X509Certificate2, используя имя файла сертификата и пароль для доступа к сертификату. |
X509Certificate2(String, String, X509KeyStorageFlags) |
Устаревшие..
Инициализирует новый экземпляр класса X509Certificate2 с использованием имени файла сертификата и пароля для доступа к сертификату, а также флага хранилища ключа. |
X509Certificate2(X509Certificate) |
Инициализирует новый экземпляр класса X509Certificate2 с помощью объекта X509Certificate. |
Свойства
Archived |
Получает или задает значение, указывающее на архивирование сертификата X.509. |
Extensions |
Возвращает коллекцию объектов X509Extension. |
FriendlyName |
Получает или задает связанный псевдоним для сертификата. |
Handle |
Получает дескриптор контекста сертификата Microsoft Cryptographic API, описанный неуправляемой структурой |
HasPrivateKey |
Возвращает значение, которое указывает, содержит ли объект X509Certificate2 закрытый ключ. |
Issuer |
Получает имя центра сертификации, выдавшего сертификат X.509v3. (Унаследовано от X509Certificate) |
IssuerName |
Получает различающееся имя поставщика сертификата. |
NotAfter |
Получает дату в формате местного времени, после которой сертификат недействителен. |
NotBefore |
Получает дату в формате местного времени, после которой сертификат становится действительным. |
PrivateKey |
Устаревшие..
Получает или задает объект AsymmetricAlgorithm, который представляет закрытый ключ, связанный с сертификатом. |
PublicKey |
Получает объект PublicKey, связанный с сертификатом. |
RawData |
Возвращает необработанные общедоступные данные X.509 сертификата. |
RawDataMemory |
Возвращает необработанные общедоступные данные X.509 сертификата. |
SerialNumber |
Получает серийный номер сертификата в виде шестнадцатеричной строки в обратном порядке. |
SerialNumberBytes |
Возвращает представление серийного номера сертификата в формате big-endian. (Унаследовано от X509Certificate) |
SignatureAlgorithm |
Получает алгоритм, используемый для создания подписи сертификата. |
Subject |
Возвращает различающееся имя субъекта из сертификата. (Унаследовано от X509Certificate) |
SubjectName |
Получает различающееся имя субъекта от сертификата. |
Thumbprint |
Получает отпечаток сертификата. |
Version |
Получает версию формата сертификата X.509. |
Методы
CopyWithPrivateKey(ECDiffieHellman) |
Объединяет закрытый ключ с открытым ключом ECDiffieHellman сертификата для создания нового сертификата ECDiffieHellman. |
CreateFromEncryptedPem(ReadOnlySpan<Char>, ReadOnlySpan<Char>, ReadOnlySpan<Char>) |
Создает новый сертификат X.509 на основе содержимого сертификата RFC 7468 в кодировке PEM и защищенный паролем закрытый ключ. |
CreateFromEncryptedPemFile(String, ReadOnlySpan<Char>, String) |
Создает новый сертификат X.509 на основе содержимого файла сертификата RFC 7468 в кодировке PEM и защищенный паролем закрытый ключ. |
CreateFromPem(ReadOnlySpan<Char>) |
Создает новый сертификат X509 на основе содержимого сертификата RFC 7468 в кодировке PEM. |
CreateFromPem(ReadOnlySpan<Char>, ReadOnlySpan<Char>) |
Создает новый сертификат X.509 на основе содержимого сертификата RFC 7468 в кодировке PEM и закрытый ключ. |
CreateFromPemFile(String, String) |
Создает новый сертификат X.509 на основе содержимого файла сертификата RFC 7468 в кодировке PEM и закрытый ключ. |
Dispose() |
Освобождает все ресурсы, используемые текущим объектом X509Certificate. (Унаследовано от X509Certificate) |
Dispose(Boolean) |
Освобождает все неуправляемые ресурсы, используемые объектом X509Certificate, и при необходимости освобождает также управляемые ресурсы. (Унаследовано от X509Certificate) |
Equals(Object) |
Сравнивает два объекта X509Certificate на равенство. (Унаследовано от X509Certificate) |
Equals(X509Certificate) |
Сравнивает два объекта X509Certificate на равенство. (Унаследовано от X509Certificate) |
Export(X509ContentType) |
Экспортирует текущий объект X509Certificate в массив байтов в формате, описанном одним из значений X509ContentType. (Унаследовано от X509Certificate) |
Export(X509ContentType, SecureString) |
Экспортирует текущий объект X509Certificate в массив байтов с использованием заданных формата и пароля. (Унаследовано от X509Certificate) |
Export(X509ContentType, String) |
Экспортирует текущий объект X509Certificate в массив байтов в формате, описанном одним из значений X509ContentType, с использованием заданного пароля. (Унаследовано от X509Certificate) |
ExportCertificatePem() |
Экспортирует общедоступный сертификат X.509, закодированный как PEM. |
GetCertContentType(Byte[]) |
Показывает тип сертификата, содержащегося в массиве байтов. |
GetCertContentType(ReadOnlySpan<Byte>) |
Указывает тип сертификата, содержащегося в предоставленных данных. |
GetCertContentType(String) |
Показывает тип сертификата, содержащегося в файле. |
GetCertHash() |
Возвращает хэш-значение для сертификата X.509v3 в виде массива байтов. (Унаследовано от X509Certificate) |
GetCertHash(HashAlgorithmName) |
Возвращает хэш-значение для сертификата X.509v3, который вычисляется с помощью указанного криптографического хэш-алгоритма. (Унаследовано от X509Certificate) |
GetCertHashString() |
Возвращает хэш-значение SHA1 для сертификата X.509v3 в виде шестнадцатеричной строки. (Унаследовано от X509Certificate) |
GetCertHashString(HashAlgorithmName) |
Возвращает шестнадцатеричную строку, содержащую хэш-значение для сертификата X.509v3, который вычисляется с помощью указанного криптографического хэш-алгоритма. (Унаследовано от X509Certificate) |
GetECDiffieHellmanPrivateKey() |
Получает закрытый ECDiffieHellman ключ из этого сертификата. |
GetECDiffieHellmanPublicKey() |
Возвращает открытый ECDiffieHellman ключ из этого сертификата. |
GetEffectiveDateString() |
Возвращает дату вступления в силу сертификата X.509v3. (Унаследовано от X509Certificate) |
GetExpirationDateString() |
Возвращает срок действия сертификата X.509v3. (Унаследовано от X509Certificate) |
GetFormat() |
Возвращает имя формата данного сертификата X.509v3. (Унаследовано от X509Certificate) |
GetHashCode() |
Возвращает хэш-код для сертификата X.509v3 в виде целого числа. (Унаследовано от X509Certificate) |
GetIssuerName() |
Устаревшие..
Устаревшие..
Устаревшие..
Возвращает имя центра сертификации, выдавшего сертификат X.509v3. (Унаследовано от X509Certificate) |
GetKeyAlgorithm() |
Возвращает сведения об алгоритме ключа для сертификата X.509v3 в виде строки. (Унаследовано от X509Certificate) |
GetKeyAlgorithmParameters() |
Возвращает параметры алгоритма ключа для сертификата X.509v3 в виде массива байтов. (Унаследовано от X509Certificate) |
GetKeyAlgorithmParametersString() |
Возвращает параметры алгоритма ключа для сертификата X.509v3 в виде шестнадцатеричной строки. (Унаследовано от X509Certificate) |
GetName() |
Устаревшие..
Устаревшие..
Устаревшие..
Возвращает имя участника, которому выдан сертификат. (Унаследовано от X509Certificate) |
GetNameInfo(X509NameType, Boolean) |
Получает имена субъекта и поставщика сертификата. |
GetPublicKey() |
Возвращает открытый ключ для сертификата X.509v3 в виде массива байтов. (Унаследовано от X509Certificate) |
GetPublicKeyString() |
Возвращает открытый ключ для сертификата X.509v3 в виде шестнадцатеричной строки. (Унаследовано от X509Certificate) |
GetRawCertData() |
Возвращает необработанные данные для всего сертификата X.509v3 в виде массива байтов. (Унаследовано от X509Certificate) |
GetRawCertDataString() |
Возвращает необработанные данные для всего сертификата X.509v3 в виде шестнадцатеричной строки. (Унаследовано от X509Certificate) |
GetSerialNumber() |
Возвращает серийный номер сертификата X.509v3 в виде массива байтов в прямом порядке. (Унаследовано от X509Certificate) |
GetSerialNumberString() |
Возвращает серийный номер сертификата X.509v3 в виде шестнадцатеричной строки в прямом порядке. (Унаследовано от X509Certificate) |
GetType() |
Возвращает объект Type для текущего экземпляра. (Унаследовано от Object) |
Import(Byte[]) |
Устаревшие..
Устаревшие..
Заполняет объект X509Certificate2 данными из массива байтов. |
Import(Byte[]) |
Устаревшие..
Устаревшие..
Заполняет объект X509Certificate данными из массива байтов. (Унаследовано от X509Certificate) |
Import(Byte[], SecureString, X509KeyStorageFlags) |
Устаревшие..
Устаревшие..
Заполняет объект X509Certificate2 с помощью данных из массива данных, пароля и флага хранилища ключа. |
Import(Byte[], SecureString, X509KeyStorageFlags) |
Устаревшие..
Устаревшие..
Заполняет объект X509Certificate с помощью данных из массива данных, пароля и флага хранилища ключа. (Унаследовано от X509Certificate) |
Import(Byte[], String, X509KeyStorageFlags) |
Устаревшие..
Устаревшие..
Заполняет объект X509Certificate2 с помощью данных из массива данных, пароля и флагов, чтобы определить способ импорта закрытого ключа. |
Import(Byte[], String, X509KeyStorageFlags) |
Устаревшие..
Устаревшие..
Заполняет объект X509Certificate с помощью данных из массива байтов, пароля и флагов, чтобы определить способ импорта закрытого ключа. (Унаследовано от X509Certificate) |
Import(String) |
Устаревшие..
Устаревшие..
Заполняет объект X509Certificate2 сведениями из файла сертификата. |
Import(String) |
Устаревшие..
Устаревшие..
Заполняет объект X509Certificate сведениями из файла сертификата. (Унаследовано от X509Certificate) |
Import(String, SecureString, X509KeyStorageFlags) |
Устаревшие..
Устаревшие..
Заполняет объект X509Certificate2 сведениями из файла сертификата, паролем и флагом хранилища ключа. |
Import(String, SecureString, X509KeyStorageFlags) |
Устаревшие..
Устаревшие..
Заполняет объект X509Certificate сведениями из файла сертификата, паролем и флагом хранилища ключа. (Унаследовано от X509Certificate) |
Import(String, String, X509KeyStorageFlags) |
Устаревшие..
Устаревшие..
Заполняет объект X509Certificate2 сведениями из файла сертификата, паролем и значением X509KeyStorageFlags. |
Import(String, String, X509KeyStorageFlags) |
Устаревшие..
Устаревшие..
Заполняет объект X509Certificate сведениями из файла сертификата, паролем и значением X509KeyStorageFlags. (Унаследовано от X509Certificate) |
MatchesHostname(String, Boolean, Boolean) |
Проверяет, соответствует ли сертификат указанному имени узла. |
MemberwiseClone() |
Создает неполную копию текущего объекта Object. (Унаследовано от Object) |
Reset() |
Сбрасывает состояние объекта X509Certificate2. |
Reset() |
Сбрасывает состояние объекта X509Certificate2. (Унаследовано от X509Certificate) |
ToString() |
Отображает сертификат X.509 в текстовом формате. |
ToString(Boolean) |
Отображает сертификат X.509 в текстовом формате. |
TryExportCertificatePem(Span<Char>, Int32) |
Пытается экспортировать общедоступный сертификат X.509, закодированный как PEM. |
TryGetCertHash(HashAlgorithmName, Span<Byte>, Int32) |
Пытается создать "отпечаток" для сертификата путем хэширования закодированного представления сертификата с помощью указанного хэш-алгоритма. (Унаследовано от X509Certificate) |
Verify() |
Выполняет проверку цепочки X.509 с использованием базовой политики проверки. |
Явные реализации интерфейса
IDeserializationCallback.OnDeserialization(Object) |
Реализует интерфейс ISerializable и вызывается событием десериализации после завершения десериализации в ходе обратного вызова. (Унаследовано от X509Certificate) |
ISerializable.GetObjectData(SerializationInfo, StreamingContext) |
Получает сведения сериализации со всеми данными, необходимыми для повторного создания экземпляра текущего объекта X509Certificate. (Унаследовано от X509Certificate) |
Методы расширения
CopyWithPrivateKey(X509Certificate2, DSA) |
Объединяет закрытый ключ с открытым ключом сертификата DSA для создания нового сертификата DSA. |
GetDSAPrivateKey(X509Certificate2) |
Получает закрытый ключ DSA из сертификата X509Certificate2. |
GetDSAPublicKey(X509Certificate2) |
Получает открытый ключ DSA из X509Certificate2. |
CopyWithPrivateKey(X509Certificate2, ECDsa) |
Объединяет закрытый ключ с открытым ключом сертификата ECDsa для создания нового сертификата ECDSA. |
GetECDsaPrivateKey(X509Certificate2) |
Возвращает закрытый ключ ECDsa из сертификата X509Certificate2. |
GetECDsaPublicKey(X509Certificate2) |
Возвращает закрытый ключ ECDsa из сертификата X509Certificate2. |
CopyWithPrivateKey(X509Certificate2, RSA) |
Объединяет закрытый ключ с открытым ключом сертификата RSA для создания нового сертификата RSA. |
GetRSAPrivateKey(X509Certificate2) |
Получает закрытый ключ RSA из сертификата X509Certificate2. |
GetRSAPublicKey(X509Certificate2) |
Получает открытый ключ RSA из X509Certificate2. |