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

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


Category

  김영대(2004-10-29 11:20:17, Hit : 5717, Vote : 1271
 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
  // 인증서 저장소=개인(MY)
  StoreName = 'MY'; // MY, CA, ROOT 등 종류는 다양하다

  // 발급 주체(Subject)의 Common Name(CN)
  CN = 'www.howto.pe.kr';

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

  // 모든 데이터는 null terminated Unicode 로 표현된다
  // 아래의 일련의 명령어들은 아래의 한 문장으로 표현된다
  //   hCertStr := CertOpenSystemStore(0, 'MY');
  GetMem(pStoreName, 2*Length(StoreName)+1);
  StringToWideChar(StoreName, pStoreName, 2*Length(StoreName)+1);

  try
    hCertStr := CertOpenStore(CERT_STORE_PROV_SYSTEM,
                              0,
                              0,
                              CERT_STORE_READONLY_FLAG or CERT_SYSTEM_STORE_CURRENT_USER,
                              pStoreName);
  finally
    FreeMem(pStoreName, 2*Length(StoreName)+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.





651   [윈도우즈 API] Windows 가 Shutdown 되는지 검사하기  김영대 2003/03/04 4292 1293
650   [일반/컴포넌트] 마우스로 ProgressBar의 Position 바꾸기  김영대 2006/02/28 5011 1292
649   [일반/컴포넌트] RichEdit 에 URL link 만들기  김영대 2004/08/04 5802 1292
648   [일반/컴포넌트] Treeview의 수평 스크롤바 감추고 스크롤 막기  김영대 2006/03/22 5657 1290
647   [윈도우즈 API] Windows Desktop에 직접 그림을 그리고(draw) 지우기(refresh)  김영대 2003/03/04 4637 1290
646   [시스템] 여러개의 DOS 명령어를 차례데로 실행하기  김영대 2004/10/21 6408 1289
645   [윈도우즈 API] 현재 키보드 입력 언어 구하기  김영대 2004/07/24 4818 1289
644   [윈도우즈 API] 다른 프로그램의 구동 디렉토리 알아내기  김영대 2003/03/07 4777 1287
643   [일반/컴포넌트] TOpenDialog 의 '선택','취소' 버튼 이름 바꾸기  김영대 2003/03/07 4173 1287
642   [시스템] 파일의 소유자와 도메인 구하기2  김영대 2004/09/25 4721 1286
641   [윈도우즈 API] 윈도우즈 탐색기에서 "Copy" 될 파일목록 구하기  김영대 2003/03/07 4873 1286
640   [시스템] 윈도우즈 화면 잠그기  김영대 2004/08/03 5068 1285
639   [윈도우즈 API] PrintScreen(PrtSc)키의 동작 막기  김영대 2003/03/07 5746 1285
638   [일반/컴포넌트] Access Violation at address ?????? 로부터 소스위치 알기  김영대 2003/03/07 6560 1284
637   [시스템] 파일이 다른 프로그램에 의해 사용중인지 검사  김영대 2003/03/07 5789 1283
636   [시스템] 프로그램에서 화면모드 변경하기  김영대 2003/03/04 4681 1283
635   [일반/컴포넌트] ListView의 타이틀 폰트 바꾸기  김영대 2005/03/31 5378 1282
634   [윈도우즈 API] 4가지 윈도우즈 관련 폴더의 path 구하기  김영대 2003/04/08 5692 1281
633   [COM/OLE] TWebBrowser에서 JavaScript 호출하기2  김영대 2004/10/10 6290 1280
632   [시스템] 드라이브 포맷(Format) API 함수  김영대 2003/03/04 4730 1280
631   [일반/컴포넌트] 두개의 RichEdit 사이에 내용 복사하기  김영대 2003/03/06 5459 1279
630   [일반/컴포넌트] 객체의 valid검사 Assigned() 대체  김영대 2005/07/29 4905 1278
629   [윈도우즈 API] Canvas의 색상수  김영대 2003/03/04 4126 1278
628   [일반/컴포넌트] MIME 타입에 해당하는 파일 확장자 구하기  김영대 2004/11/18 4802 1277
627   [일반/컴포넌트] StringGrid의 Cell에 입력 값 제한 하기  김영대 2003/03/04 5931 1277
626   [COM/OLE] 윈도우즈 "인터넷 등록 정보" 화면  김영대 2004/07/25 4112 1276
625   [일반/컴포넌트] 명령행 인자(command line argument) 사용하기  김영대 2003/03/05 4693 1276
624   [시스템] 한글 한 음절을 초성,중성,종성 음소로 분해하기('김' => 'ㄱ'+'ㅣ'+'ㅁ')  김영대 2004/10/22 7955 1275
623   [윈도우즈 API] 전체 화면(Full Screen) 만들기  김영대 2003/03/29 4990 1275
622   [일반/컴포넌트] 해상도(screen resolution)를 변경했는지 검사  김영대 2003/03/07 4501 1273
621   [COM/OLE] IE의 속성을 변경하여 뛰우기  김영대 2006/02/28 5467 1272
620   [COM/OLE] TWebBroswer 에서 오른쪽 마우스 클릭 막기  김영대 2004/11/24 5126 1271
  [시스템] 윈도우즈에 설치된 모든 인증서(certificate) 정보 읽어오기  김영대 2004/10/29 5717 1271
618   [COM/OLE] ActiveForm의 OnDestroy 대용  김영대 2005/04/21 5445 1270
617   [네트웍/인터넷] 소켓의 전송크기는 얼마 ?  김영대 2003/03/05 5207 1270
616   [윈도우즈 API] 화면캡처하기 Delphi3.0에서...  김영대 2003/03/04 4728 1270
615   [네트웍/인터넷] 네트워크 공유 설정/공유 사용 권한/해제 하기 (Windows NT/2000)  김영대 2004/11/06 5517 1268
614   [윈도우즈 API] 떠있는 모든 Microsoft Internet Explorer 죽이기  김영대 2003/03/29 4484 1267
613   [윈도우즈 API] Windows error beep 켜기/끄기  김영대 2003/03/07 4448 1266
612   [일반/컴포넌트] TPanel, TImage 에 Gradient 효과 주기  김영대 2003/03/07 4368 1266

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

Copyright 1999-2020 Zeroboard / skin by zero