запись сертификата в контейнер на Rutoken

Доброго времени суток! Начну с того, что Cert2Cont отличная утилита, но есть вопрос. Есть ли метод "смотреть" контейнеры только на Rutoken-e? Ибо функции получают все контейнеры без сертификата - с реестра,с рутокена и т.д.
Заранее спасибо

Re: запись сертификата в контейнер на Rutoken

Здравствуйте!
Утилита уже "устарела".
Сейчас ее функции выполняет закладка "Сертификаты" Панели управления Рутокен.

(2013-06-19 06:12:19 отредактировано Mourinjo)

Re: запись сертификата в контейнер на Rutoken

Добрый день Алексей Несененко!  Я пытаюсь программно создать сертификат .cer  и записать на Рутокен S 32k (версия 48.00.32.00). Я использую компоненты Delphi BlackBox. С еТокенами проблем нет, а вот с рутокеном выходит ошибка EEICertificateError with message "Issuer fields are empty". Что необходимо заполнить ?

Re: запись сертификата в контейнер на Rutoken

Добрый день, покажите пожалуйста код, которым вы это делаете.
Может быть мы подскажем, куда копать дальше.

Re: запись сертификата в контейнер на Rutoken

procedure TfrmGenerateCert.btnGenerateClick(Sender: TObject);
var
  Cert : TElX509CertificateEx;
  SigAlg, KeyAlg : TElAlgorithmIdentifier;
  ind : integer;
begin
  SigAlg := TElAlgorithmIdentifier.CreateByAlgorithm(GetSignatureAlgorithm);
  KeyAlg := TElAlgorithmIdentifier.CreateByAlgorithm(GetPublicKeyAlgorithm);

  if KeyAlg is TElECAlgorithmIdentifier then
    TElECAlgorithmIdentifier(KeyAlg).Curve := GetCurve
  else if KeyAlg is TElGOST3410AlgorithmIdentifier then
    TElGOST3410AlgorithmIdentifier(KeyAlg).PublicKeyParamSet := GetGostParamset;


  Cert := TElX509CertificateEx.Create(nil);
  Cert.SubjectRDN.Count := 6;
  For ind:=0 to 5 do Cert.SubjectRDN.Tags[ind] := SB_ASN1_PRINTABLESTRING;
  Cert.SubjectRDN.OIDs[0] := SB_CERT_OID_COUNTRY;
  Cert.SubjectRDN.Values[0] := GetCountryAbbr(cbCountry.Text);
  Cert.SubjectRDN.OIDs[1] := SB_CERT_OID_STATE_OR_PROVINCE;
  Cert.SubjectRDN.Values[1] := edtState.Text;
  Cert.SubjectRDN.OIDs[2] := SB_CERT_OID_LOCALITY;
  Cert.SubjectRDN.Values[2] := edtLocality.Text;
  Cert.SubjectRDN.OIDs[3] := SB_CERT_OID_ORGANIZATION;
  Cert.SubjectRDN.Values[3] := edtOrganization.Text;
  Cert.SubjectRDN.OIDs[4] := SB_CERT_OID_ORGANIZATION_UNIT;
  Cert.SubjectRDN.Values[4] := edtOrganizationUnit.Text;
  Cert.SubjectRDN.OIDs[5] := SB_CERT_OID_COMMON_NAME;
  Cert.SubjectRDN.Values[5] := edtCommonName.Text;
  Cert.ValidFrom := dtpFrom.Date;
  Cert.ValidTo := dtpTo.Date;

  if rbSelfSigned.Checked then
  begin
    Cert.CAAvailable := False;

    Cert.IssuerRDN.Count := 6;
    For ind:=0 to 5 do Cert.IssuerRDN.Tags[ind] := SB_ASN1_PRINTABLESTRING;
    Cert.IssuerRDN.Tags[0] := SB_ASN1_PRINTABLESTRING;
    Cert.IssuerRDN.OIDs[0] := SB_CERT_OID_COUNTRY;
    Cert.IssuerRDN.Values[0] := GetCountryAbbr(cbCountry.Text);
    Cert.IssuerRDN.Tags[1] := SB_ASN1_PRINTABLESTRING;
    Cert.IssuerRDN.OIDs[1] := SB_CERT_OID_STATE_OR_PROVINCE;
    Cert.IssuerRDN.Values[1] := edtState.Text;
    Cert.IssuerRDN.Tags[2] := SB_ASN1_PRINTABLESTRING;
    Cert.IssuerRDN.OIDs[2] := SB_CERT_OID_LOCALITY;
    Cert.IssuerRDN.Values[2] := edtLocality.Text;
    Cert.IssuerRDN.Tags[3] := SB_ASN1_PRINTABLESTRING;
    Cert.IssuerRDN.OIDs[3] := SB_CERT_OID_ORGANIZATION;
    Cert.IssuerRDN.Values[3] := edtOrganization.Text;
    Cert.IssuerRDN.Tags[4] := SB_ASN1_PRINTABLESTRING;
    Cert.IssuerRDN.OIDs[4] := SB_CERT_OID_ORGANIZATION_UNIT;
    Cert.IssuerRDN.Values[4] := edtOrganizationUnit.Text;
    Cert.IssuerRDN.Tags[0] := SB_ASN1_PRINTABLESTRING;
    Cert.IssuerRDN.OIDs[5] := SB_CERT_OID_COMMON_NAME;
    Cert.IssuerRDN.Values[5] := edtCommonName.Text;
  end;

  Screen.Cursor := crHourGlass;

  Generating := true;
  btnBack.Enabled := false;
  btnNext.Enabled := false;
  btnCancel.Enabled := false;
  btnGenerate.Enabled := false;

  If rbSelfSigned.Checked then
    Thread := TCertificateGenerationThread.Create(nil, Cert)
  else
    Thread := TCertificateGenerationThread.Create(CACert, Cert);

  TCertificateGenerationThread(Thread).SignatureAlgorithm := SigAlg;
  TCertificateGenerationThread(Thread).KeyAlgorithm := KeyAlg;
  TCertificateGenerationThread(Thread).Bits := GetKeyLength;

  Thread.OnTerminate := HandleThreadTerminate;
  StartProgressbar;
  Thread.Resume;
end;

Re: запись сертификата в контейнер на Rutoken

Добрый день Кирилл Мещеряков!  Я пытаюсь программно создать сертификат .cer  и записать на Рутокен S 32k (версия 48.00.32.00). Я использую компоненты Delphi BlackBox. С еТокенами проблем нет, а вот с рутокеном выходит ошибка EEICertificateError with message "Issuer fields are empty". Что необходимо заполнить ? Код приложен выше

(2013-08-13 11:26:38 отредактировано Mourinjo)

Re: запись сертификата в контейнер на Rutoken

Кирилл. Мы добавили поля Issuer и все ок, но теперь другая ошибка выходит: PKCS#11 error CKR_USER_NOT_LOGGED_IN in function C_CreateObject.   Что это может значить ?

Re: запись сертификата в контейнер на Rutoken

Mourinjo пишет:

Кирилл. Мы добавили поля Issuer и все ок, но теперь другая ошибка выходит: PKCS#11 error CKR_USER_NOT_LOGGED_IN in function C_CreateObject.   Что это может значить ?

Это означает что нужно выполнить фукнцию C_Login перед C_CreateObject

Re: запись сертификата в контейнер на Rutoken

Кирилл Мещеряков. Спасибо большое

(2013-08-15 19:19:24 отредактировано Mourinjo)

Re: запись сертификата в контейнер на Rutoken

Кирилл Мещеряков. Мы собираемся использовать в своем проекте два устройства (токена): Е-токен и Рутокен. Как нам программно определить какой тип устройства, чтобы выбрать соответствующую библиотеку PKCS#11  ?

Re: запись сертификата в контейнер на Rutoken

Mourinjo пишет:

Кирилл Мещеряков. Мы собираемся использовать в своем проекте два устройства (токена): Е-токен и Рутокен. Как нам программно определить какой тип устройства, чтобы выбрать соответствующую библиотеку PKCS#11  ?

Можно обратиться к более нижнему уровню, WinSCard API в Windows или pcsc-lite в Linux и Mac, там поискать устройства и посмотреть их названия.
Ну а вообще для Вас не должно быть большой проблемой загружать обе библиотеки сразу.

Re: запись сертификата в контейнер на Rutoken

Mourinjo пишет:

Кирилл Мещеряков. Мы собираемся использовать в своем проекте два устройства (токена): Е-токен и Рутокен. Как нам программно определить какой тип устройства, чтобы выбрать соответствующую библиотеку PKCS#11  ?

С Е-токеном не делал, только на ру-токен
Функция есть получения списка подключенных устройств

ckResult = pFunctionList->C_GetSlotList(CK_TRUE,NULL_PTR,&ulSlotCount );

возможно он и попадет (Е-токен) в этот список.