Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline art2207  
#1 Оставлено : 18 февраля 2008 г. 17:00:53(UTC)
art2207

Статус: Новичок

Группы: Участники
Зарегистрирован: 18.02.2008(UTC)
Сообщений: 6
Мужчина
Откуда: Санкт-Петербург (ЗАО "Центр Финансовых Технологий"

Добрый день всем!!!

Я программирую на Visual Studio 2005 (VC#). Создал запрос PKCS 10.

CertEnroll.ProviderType = 75;

CertEnroll.KeySpec = 1;
CertEnroll.GenKeyFlags = 1024 * (256 * 256);
CertEnroll.ContainerName = tbNameCon.Text.Trim();
CertEnroll.UseExistingKeySet = 1;

string pkcs = CertEnroll.createPKCS10(subject, "2.5.29.15 2.5.29.37 ");


Вопрос в следующем: Как мне из pkcs получить открытый ключ? (Если можно, то с примером кода)

И ещё вопросик... За что отвечает первый параметр в CertEnroll.addExtensionToRequest?

Заранее благодарю!!!

Отредактировано пользователем 18 февраля 2008 г. 17:56:30(UTC)  | Причина: Не указана

Offline art2207  
#2 Оставлено : 21 февраля 2008 г. 17:03:01(UTC)
art2207

Статус: Новичок

Группы: Участники
Зарегистрирован: 18.02.2008(UTC)
Сообщений: 6
Мужчина
Откуда: Санкт-Петербург (ЗАО "Центр Финансовых Технологий"

Я сделал это!!!!! :d/

Может быть кому-нибудь пригодится...

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool CryptAcquireContext(
ref IntPtr hProv,
String pszContainer,
String pszProvider,
Int32 dwProvType,
Int32 dwFlags
);

[DllImport("crypt32.dll")]
public static extern bool CryptExportPublicKeyInfo(
IntPtr hProv,
uint KeySpec,
uint CertEncodingType,
IntPtr pvStructInfo,
ref uint cbStructInfo
);


[StructLayout(LayoutKind.Sequential)]
public struct CERT_PUBLIC_KEY_INFO
{
public IntPtr SubjPKIAlgpszObjId;
public int SubjPKIAlgParameterscbData;
public IntPtr SubjPKIAlgParameterspbData;
public int PublicKeycbData;
public IntPtr PublicKeypbData;
public int PublicKeycUnusedBits;
}

const uint X509_ASN_ENCODING = 0x00000001;
const uint PKCS_7_ASN_ENCODING = 0x00010000;

static uint ENCODING_TYPE = PKCS_7_ASN_ENCODING | X509_ASN_ENCODING;

public string DecodeSubjectPublicKeyInfo(string name_con, string name_prov, int type_prov)
{
try
{
IntPtr hProv = IntPtr.Zero;
if (CryptAcquireContext(ref hProv, name_con, name_prov, type_prov, 0))
{
uint cbytes = 0;
if (CryptExportPublicKeyInfo(hProv, 1, ENCODING_TYPE, IntPtr.Zero, ref cbytes))
{
IntPtr key_info = Marshal.AllocHGlobal((int)cbytes);
if (CryptExportPublicKeyInfo(hProv, 1, ENCODING_TYPE, key_info, ref cbytes))
{

CERT_PUBLIC_KEY_INFO pkinfo = (CERT_PUBLIC_KEY_INFO)Marshal.PtrToStructure(key_info, typeof(CERT_PUBLIC_KEY_INFO));

IntPtr pencodeddata = pkinfo.PublicKeypbData;
int cblob = pkinfo.PublicKeycbData;
byte[] encodeddata = new byte[cblob];
Marshal.Copy(pencodeddata, encodeddata, 0, cblob); //copy bytes from IntPtr to byte[]
Marshal.FreeHGlobal(key_info);

CAPICOM.Utilities cap = new CAPICOM.Utilities();

return cap.BinaryToHex(cap.ByteArrayToBinaryString(encodeddata));
}
}
}
MessageBox.Show("Не удалось получить открытый ключ", "Ошибка");
l.Write_Log("1", "Create_Request:DecodeSubjectPublicKeyInfo", "Не удалось получить открытый ключ");
return "";
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка");
l.Write_Log("1", "Create_Request:DecodeSubjectPublicKeyInfo", ex.Message);
return "";
}
}
Offline Kirill Sobolev  
#3 Оставлено : 21 февраля 2008 г. 20:02:29(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,732
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Это достаточно непростой способ, да и работать он будет только при наличии секретного ключа. Можно сделать проще - в .NET есть класс IX509CertificateRequestPkcs10, его нужно инициализировать созданным PKCS10 запросом. Открытый ключ находится в свойстве PublicKey. Да и если использовать C#, то лучше и запросы создавать через классы .NET, а не через XEnroll, которого нет на висте.
Техническую поддержку оказываем тут
Наша база знаний
Offline Andrew_Silver  
#4 Оставлено : 24 марта 2008 г. 18:56:04(UTC)
Andrew_Silver

Статус: Участник

Группы: Участники
Зарегистрирован: 15.01.2008(UTC)
Сообщений: 18
Мужчина
Откуда: Пермь

по поводу IX509CertificateRequestPkcs10
А вы не перепутали? не нашел такого класса в .net. Есть только интерфейс в Certificate Enrollment API, это COM
Offline Kirill Sobolev  
#5 Оставлено : 24 марта 2008 г. 20:06:18(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,732
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Да, я имел ввиду конечно интерфейс IX509CertificateRequestPkcs10, прошу прощения что неточно выразился.
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.