::: 델파이 Tip&Trick :::

델파이 Tip&Trick 성격에 맞지 않는 광고,비방,질문의 글은 즉시 삭제하며
내용을 복사하여 사용할 경우 반드시 이곳(http://www.howto.pe.kr)을 출처로 명시하여 주세요


Category

  김영대(2004-10-29 11:47:42, Hit : 7161, Vote : 1453
 http://www.howto.pe.kr
 인증서(certificate) 파일에서 직접 정보 읽어오기

// 아래 예제는 폴더에 있는 인증서 파일에서 직접 정보를 읽어
// 인증서의 버전, 일련번호, 주체, 발급자, 유효 기간을 화면에 보여준다
// Wcrypt2는 http://stuff.irsoft.de/CryptoAPI2.zip 에서 다운받으면 된다

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Wcrypt2;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function GetLocalTime(a: TFileTime): String;
var
  mtm: TSystemTime;
  at: TFileTime;
  ds,ts: ShortString;
begin
  filetimetolocalfiletime(a,at);
  filetimetosystemtime(at,mtm);
  SetLength(ds, GetDateFormat(LOCALE_USER_DEFAULT, 0, @mtm, NIL, @ds[1], 255) - 1);
  SetLength(ts, GetTimeFormat(LOCALE_USER_DEFAULT, time_noseconds, @mtm, NIL, @ts[1], 255)  - 1);
  Result := ds+'  '+ts;
end;
  
procedure TForm1.Button1Click(Sender: TObject);
const
  // 인증서 파일명
  CertFileName = 'C:\zzz\test.cer';

  // encoding 유형
  MyEncType = PKCS_7_ASN_ENCODING or X509_ASN_ENCODING;
var
  hCertStr: HCERTSTORE;
  pCertCntx: PCCERT_CONTEXT;
  pCertFileName: PWideChar;
  nameBLOB: CERT_NAME_BLOB;
  nameString: PChar;
  size: DWORD;
  NotBefore, NotAfter: TFileTime;
  serNum: PChar;
begin
  Memo1.Clear;

  // 모든 데이터는 null terminated Unicode 로 표현된다
  GetMem(pCertFileName, 2*Length(CertFileName)+1);
  StringToWideChar(CertFileName, pCertFileName, 2*Length(CertFileName)+1);
  
  try
    hCertStr := CertOpenStore(CERT_STORE_PROV_FILENAME,
                              0,
                              0,
                              CERT_STORE_READONLY_FLAG,
                              pCertFileName);
  finally
    FreeMem(pCertFileName, 2*Length(CertFileName)+1);
  end;
  if hCertStr = nil then
  begin
    ShowMessage('인증서 파일을 열 수 없습니다');
    Exit;
  end;

  try
    nameString := StrAlloc(512);
    pCertCntx := CertEnumCertificatesInStore(hCertStr, nil); // 첫번째 인증서

    while pCertCntx <> nil do
    begin
      Memo1.Lines.Add('버전: '+IntToStr(pCertCntx^.pCertInfo^.dwVersion + 1)); // CERT_V3 = 2

      serNum := PChar(pCertCntx^.pCertInfo^.SerialNumber.pbData);
      Memo1.Lines.Add('일련번호: '+Format('%x%x', [pInt64(serNum+8)^, pInt64(serNum)^]));

      nameBLOB := pCertCntx^.pCertInfo^.Subject;
      size := CertNameToStr(MyEncType, @nameBlob, CERT_SIMPLE_NAME_STR, nameString, 512);
      if size > 1 then
        Memo1.Lines.Add('주체: '+nameString);

      nameBLOB := pCertCntx^.pCertInfo^.Issuer;
      size := CertNameToStr(MyEncType, @nameBlob, CERT_SIMPLE_NAME_STR, nameString, 512);
      if size > 1 then
        Memo1.Lines.Add('발급자: '+nameString);

      NotBefore := pCertCntx^.pCertInfo^.notBefore;
      NotAfter := pCertCntx^.pCertInfo^.notAfter;
      Memo1.Lines.Add('유효 기간(시작): '+GetLocalTime(NotBefore));
      Memo1.Lines.Add('유효 기간(끝): '+GetLocalTime(NotAfter));
      Memo1.Lines.Add('');

      pCertCntx := CertEnumCertificatesInStore(hCertStr, pCertCntx); // 다음 인증서
    end;
  finally
    StrDispose(nameString);
    CertFreeCertificateContext(pCertCntx);
    CertCloseStore(hCertStr,0);
  end;
end;

end.





971   [시스템] 사용중인 USB 포트의 장치정보 구하기  김영대 2008/11/04 18474 1509
970   [윈도우즈 API] ShellExecute(Ex) 사용법 예제 12가지  김영대 2004/09/22 17229 1687
969   [시스템] 원도우즈 도메인 이름 구하기  김영대 2008/11/04 12417 1393
968   [네트웍/인터넷] IOCP(I/O Completion Port) class  김영대 2003/11/18 10493 800
967   [윈도우즈 API] 디렉토리나 파일의 속성(변경/생성/사용한 날짜, 특성) 바꾸기  김영대 2004/12/08 9953 1371
966   [데이터베이스] DBGrid의 Column, Record 의 위치 저장/이동  김영대 2003/03/04 9382 1389
965   [시스템] 델파이로 DOS 프로그램(Console application) 만들기  김영대 2003/03/06 8811 2841
964   [윈도우즈 API] 다른 프로그램에 마우스/키보드 이벤트 발생시키기  김영대 2004/09/07 8063 1299
963   [일반/컴포넌트] 폼 흔들기  김영대 2006/02/28 8034 1231
962   [윈도우즈 API] URLDownloadToFile()를 사용한 파일 다운받기  김영대 2004/12/15 7948 1434
961   [시스템] 한글 한 음절을 초성,중성,종성 음소로 분해하기('김' => 'ㄱ'+'ㅣ'+'ㅁ')  김영대 2004/10/22 7886 1271
960   [윈도우즈 API] 실행 파일의 아이콘 바꾸기  김영대 2008/11/27 7828 1435
959   [일반/컴포넌트] RichEdit 2.0 줄간격 조정  김영대 2005/02/11 7773 1313
958   [COM/OLE] 탐색기에서 파일을 선택하여 ActiveX(ActiveFortm)에 Drag&Drop 하기  김영대 2005/01/06 7770 1306
957   [네트웍/인터넷] FTP로 디렉토리 목록(ls -l) 구하기  김영대 2004/10/09 7722 1366
956   [윈도우즈 API] 외부 프로그램 실행하기(ShellExecute) 정리  김영대 2003/03/05 7715 1414
955   [네트웍/인터넷] 윈도우즈 소켓의 에러번호에 대한 설명  김영대 2003/03/05 7610 2642
954   [네트웍/인터넷] HTTP의 다운받을 파일의 정보만 미리 읽어오기  김영대 2004/12/02 7603 1418
953   [네트웍/인터넷] RFC: Request for Comments  김영대 2003/03/05 7545 1979
952   [시스템] '응답없음' 프로세서를 감지하는 잼나는 방법  구창민 2003/03/14 7458 1205
951   [시스템] 2기가 이상의 하드의 남은 용량 알아내기...  김영대 2003/03/06 7406 2072
950   [시스템] 시스템 대기모드/화면 보호기/모니터 끄기 이벤트 감지하기  김영대 2005/07/21 7339 1542
949   [시스템] 시스템 타임이 변경되었는지를 알아내려면...  김영대 2003/03/05 7266 2003
948   [시스템] 시스템의 각종 정보  김영대 2003/03/06 7263 1253
947   [시스템] 마우스의 좌/우 기능설정과 버튼갯수 알기  김영대 2003/03/06 7234 1965
946   [일반/컴포넌트] 눌려진 키보드 키의 명칭 구하기  김영대 2003/03/07 7170 1380
  [시스템] 인증서(certificate) 파일에서 직접 정보 읽어오기  김영대 2004/10/29 7161 1453
944   [시스템] 윈도우즈 등록정보의 보안에 있는 권한 설정 변경하기(NT/2000/XP)  김영대 2004/09/25 7132 1549
943   [네트웍/인터넷] Ethernet 랜카드의 MAC adress 구하기  김영대 2003/03/07 7094 1843
942   [윈도우즈 API] 작업표시줄의 시계 감추기/보이기  김영대 2003/03/27 7061 1926
941   [네트웍/인터넷] How to bring a network down - "Win Nuke"  김영대 2003/03/06 7044 1924
940   [네트웍/인터넷] List of raw FTP commands  김영대 2003/03/05 7036 1831
939   [네트웍/인터넷] NetMask 알아내기  김영대 2003/03/07 7015 1798
938   [일반/컴포넌트] 명령행 인자 받아오기  김영대 2003/03/05 7002 1823
937   [일반/컴포넌트] List of the Delphi 3 file types  김영대 2003/03/05 6970 1299
936   [일반/컴포넌트] 문자가 영문/숫자/영숫자/한글 인지 검사하기  김영대 2004/08/31 6892 1476
935   [네트웍/인터넷] 네트워크 공유 설정/공유 사용 권한/해제 하기 (Windows XP)  김영대 2004/11/09 6866 1356
934   [일반/컴포넌트] TRichEdit 를 disable 할 때 배경색과 폰트 바꾸기  김영대 2004/09/02 6857 1765
933   [데이터베이스] DBGrid 특정 Cell에 색상넣기  김영대 2003/03/06 6848 1503
932   [시스템] DOS 명령어 실행하고 실시간 결과 받아오기  김영대 2004/09/29 6825 1407

1 [2][3][4][5][6][7][8][9][10]..[25] [다음 10개]
 

Copyright 1999-2019 Zeroboard / skin by zero