728x90

▣ 실행 파일에 디지털 서명 넣기 (Ver 0.1)

▷ 준비물
    - 개인 키 파일(mycert.pvk) 및 PKCS #7 인증서 파일(mycert.spc)
    - 인증서 작업을 위한 프로그램 (signcode.exe)
    - 인증서 확인을 위한 프로그램 (chktrust.exe)


▷ 개인 키 파일(*.pvk) 및 PKCS #7 인증서 파일(*.spc)
    - 정식 인증서를 이용하는 경우 인증 기관을 통해 개인 키 파일과 PKCS #7 인증서를 발급 받는다.
    - 테스트 인증서를 이용하는 경우에는 makecert.exe, cert2spc.exe 프로그램을 이용해서 직접 만들어 사용한다.
    - [ActiveX] 테스트 인증서 만들기 내용 참고 (http://www.enjoydev.com/blog/70)


▷ 참고
    - 아래에서 테스트로 사용된 Project1.exe는 VB에서 기본으로 생성되는 "표준EXE" 프로젝트를 컴파일한 것입니다.
      단지 윈도우 폼만 나타날 뿐 아무런 작업도없으니 실행하셔도 괜찮습니다.
      VB 6.0에서 컴파일 했으므로 VB 런타임 라이브러리가 설치되어있지 않으면 실행되지 않습니다.


▷ 디지털 서명 작업 전후 비교 (Before)
    - 인터넷 주소창에 실행 파일의 경로를 입력하고, 실행 버튼을 누르면 다음의 화면을 볼 수 있다.

사용자 삽입 이미지


사용자 삽입 이미지


    - 디지털 서명이 없기 때문에 "알 수 없는 게시자"로 나타난다.


▷ 디지털 서명 작업 전후 비교 (After : 정식 인증서를 적용한 경우)
    - 인터넷 주소창에 실행 파일의 경로를 입력하고, 실행 버튼을 누르면 다음의 화면을 볼 수 있다.

사용자 삽입 이미지


사용자 삽입 이미지


사용자 삽입 이미지


    - 디지털 서명을 하면 위에서 처럼 게시자 정보가 표시되고 자신의 홈페이지로 연결시킬 수 있다.

    - 또한 클라이언트 PC에서 인증서 설치 과정을 거치면 보안 경고 없이 바로 실행되도록 할 수도 있다.

▷ 디지털 서명 작업 전후 비교 (After : 테스트 인증서를 적용한 경우)
    - 인터넷 주소창에 실행 파일의 경로를 입력하고, 실행 버튼을 누르면 다음의 화면을 볼 수 있다.

사용자 삽입 이미지


    - 디지털 서명을 넣더라도 테스트 인증서를 사용하는 경우에는 "알 수 없는 게시자"로 표시된다.

    - 로컬인트라넷 등 제한된 사용자에게 배포하는 경우에는 해당 인증서 설치를 유도함으로써 좀더 유연하게 사용 가능하다.
      (2007.01.23 현재 적용 방법 정리중)

▷ 디지털 서명 넣기 (윈도우 화면에서 클릭, 클릭으로 서명 작업)
    1. 탐색기에서 signcode.exe 프로그램을 더블클릭하면 "디지털 서명 마법사"가 시작된다.

    2. [파일 선택] "찾아보기" 버튼을 누른 후 서명할 파일 선택 (Project1.exe)

    3. [서명 옵션] "사용자 지정" 옵션 선택
        - "표준"을 선택하는 경우 "저장소" 설치된 인증서만 선택가능하다.
        - 인증서 파일을 직접 선택하기 위해서는 "사용자 지정"을 선택해야한다.

    4. [서명 인증서] "파일에서 선택" 버튼 클릭 후 인증서 파일(mycert.spc)을 선택한다.

    5. [개인 키 암호 입력] 인증서 비밀번호를 입력한다.

    6. [개인 키] 개인 키 파일(mycert.pvk)을 선택한다.

    7. [해시 알고리즘] "sha1"(기본)을 선택한다.

    8. [추가 인증서] "루트 인증서를 포함하여 인증 경로에 있는 모든 인증서"를 선택한다.
        - "테스트 인증서 만들기" 과정을 통해 만든 인증서(mycert.spc)에는 루트 인증서(root.cer) 정보가
          포함되어있으므로, 어느 항목을 선택하든 동일한 결과를 보인다.

    9. [데이터 설명] 게시자 설명과 게시자 정보 클릭에서 연결할 홈페이지 주소를 입력한다.

    10. [타임스탬프] 타임서버를 통해 인증시간을 기록한다.
        - 타임스탬프를 데이터를 생략해도 무관하지만, 타임스탬프 정보를 넣음으로서 신뢰성도를 높일 수 있다.
        - 또한 타임스탬프 정보를 통해 실제 디지털 서명한 시간을 기록으로 남길 수 있다.

    11. [디지털 서명 마법사 완료] 마법사 완료 전 설정 내용 확인

    12. [디지털 서명 마법사 완료] 마법사 정상 완료


▷ 디지털 서명 넣기 (도스창에서 서명 작업)
    - 다음의 도스명령으로 처리하면 번거로운 서명 작업을 쉽게 처리 할 수 있다.

    - signcode -spc "mycert.spc" -v "mycert.pvk" -n "EnjoyDev" -i "http://www.EnjoyDev.com" -t "http://timestamp.verisign.com/scripts/timestamp.dll" "Project1_cert.exe"
      ; 좀 길지만 하나의 문장이다.

    - 사용 형식
      ; signcode -spc "인증서파일" -v "개인키파일" -n "게시자설명" -i "홈페이지" -t "타임서버" "실행파일명"

    - 도스창에서 "signcode /?"를 입력하면 상세 설명을 볼 수 있다.


▷ 디지털 서명 확인
    - 도스창에서 "chktrust Project1_cert.exe"를 입력하면 다음과 같이 디지털 서명 결과를 볼 수 있다.

사용자 삽입 이미지




▣ Ver 0.1
    ; ActiveX 배포 관련 내용을 정리하다보니 많은 부분과 연결되고 있어 부분적으로 나누고 있습니다.
      추가적으로 정리되는 부분은 위 내용을 바탕으로 살을 붙여가도록 하겠습니다.


☞ 본문 출처 : http://www.enjoydev.com/blog/71

☞ 본인의 글 입니다. 이 글을 다른 곳에 게재하는 경우 본문 출처를 밝혀주시기 바랍니다.

☞ 위 내용은 정식 문서 번역이 아닌, 실무 적용에 따른 경험을 바탕으로 어느정도 자의적인 설명이 포함되어있습니다.
   잘못된 내용이 있는 경우 지적 바랍니다.


▣ 참고 사이트
    * Signing and Checking Code with Authenticode
       ; http://msdn.microsoft.com/workshop/secu … ning.asp
    * .cab 파일 서명 단계
       ; http://support.microsoft.com/kb/247257/ko
728x90
ActiveX를 사용하는 경우 사용자에게 설치 여부를 묻는 확인 메세지가 나타나는데, OS와 인증서 종류에 따라 메세지 내용이 달라진다.

- 테스트에 사용된 인증서
    1. "신뢰된 루트 인증기관"에 등록된 인증서 (정식 인증서와 동일하게 작동)
    2. "신뢰된 루트 인증기관"에 등록되지 않은 인증서 (테스트 인증서와는 약간의 차이가 있음)
    3. 테스트 인증서

- 테스트 환경
    1. Windows XP (SP2) + IE 6.0
    2. Windows 2000 (SP4) + IE 6.0
    3. Windows98 SE + IE 5.0


[Windows XP (SP2) + IE 6.0]
1. "신뢰된 루트 인증기관"에 등록된 인증서 (정식인증서)
    - 기본 보안 설정 상태에서 설치 여부를 묻는 확인창이 나타난다.
    - 해당 사이트를 "신뢰할 수 있는 사이트"에 등록하면 사용자 확인 없이 설치되도록 할 수 있다.
      (보안 -> 신뢰할 수 있는 사이트 -> 보안 설정 ->서명된 ActiveX 컨트롤 다운로드를 "사용"으로 선택)

사용자 삽입 이미지


2. "신뢰된 루트 인증기관"에 등록되지 않은 인증서
    - WindowsXP Service Pack2부터 보안이 강화됨에 따라 서명 안된 ActiveX, 테스트 인증서를 이용한 ActiveX, "신뢰된 루트 인증기관"에 등록되지 않은 인증서를 이용하는 경우에는 설치 여부 확인이 아닌 "차단" 메세지가 나타난다.
    - ActiveX가 설치되도록하기 위해서는 인터넷 옵션에서 보안 설정을 낮추거나(비추), 해당 사이트를 "신뢰할 수 있는 사이트"에 추가하는 방법(추천)이 있다.

사용자 삽입 이미지


    - 또는 인증서의 발급자(ROOT CA 인증서)를 "신뢰된 루트 인증기관"에 설치(추천)하는 방법도 있다.
    - 단, 발급자가 "Root Agency"로 되어있는 테스트 인증서를 "신뢰된 루트 인증기관"에 추가하는 경우 테스트 인증서를 이용한 악성 ActiveX가 무분별하게 설치될 수 있으므로 주의해야한다.

사용자 삽입 이미지


3. 테스트 인증서를 이용하는 경우
    - 위와 마찬가지로 차단 메세지가 나타난다.

사용자 삽입 이미지


    - 해당 사이트를 "신뢰할 수 있는 사이트"에 등록하면 아래와 같이 설치 여부를 묻는 메세지가 나타난다.

사용자 삽입 이미지




[Windows 2000 (SP4) + IE 6.0]
1. "신뢰된 루트 인증기관"에 등록된 인증서 (정식인증서)
    -  게시자 정보와 함께 설치 확인 메세지가 나타난다.

사용자 삽입 이미지


2. "신뢰된 루트 인증기관"에 등록되지 않은 인증서
    - "경고" 메세지와 함께 게시자 정보, 설치 확인 메세지가 나타난다.
    - "정식인증서"와의 차이는 사용자에게 보여지는 "경고" 메세지 뿐이다.

사용자 삽입 이미지


3. 테스트 인증서를 이용하는 경우
    - 위와 마찬가지로 "경고" 메세지와 함께 설치 확인 메세지가 나타난다.
    - 경고 메세지에 "테스트 루트"라는 글자가 들어감으로 인해 사용자에게 신뢰감은 더욱 떨어져 보인다.

사용자 삽입 이미지




[Windows 98 SE + IE 5.0] : Windows2000 + IE 6.0과 별 차이가 없어 보인다.
1. "신뢰된 루트 인증기관"에 등록된 인증서 (정식인증서)

사용자 삽입 이미지


2. "신뢰된 루트 인증기관"에 등록되지 않은 인증서

사용자 삽입 이미지


3. 테스트 인증서를 이용하는 경우

사용자 삽입 이미지

 

☞ 본문 출처 : http://www.enjoydev.com/blog/80


☞ 본인의 글 입니다. 이 글을 다른 곳에 게재하는 경우 본문 출처를 밝혀주시기 바랍니다.


☞ 위 내용은 정식 문서 번역이 아닌, 실무 적용에 따른 경험을 바탕으로 어느정도 자의적인 설명이 포함되어있습니다.

   잘못된 내용이 있는 경우 지적 바랍니다.

728x90

VB, VBA, Win32, ExcelReport 전문 개발카페입니다. 많은 관심 부탁드리여~~^^

http://cafe.naver.com/xlsvba



걍 혹시 VB루 엑셀 리포트 하실일 생기시믄 사용하시믄 어떨가하고 올립니다..
쓰레기 자료일거 같아 좀 머뭇거리다가 올려봅니다...
제 레베루 잘 아시겠지만 신임도 50%두 안되는 소스이니 잘 수정하셔서 올려주시믄 잘 배껴쓰겟습니다....
일부 문제점이 잇을수 있을거 같기두 하궁...
최소 5개 이상의 Child폼에서 사용한다는 가정하에 Public으루 맨들었으니..
두서너군데에서  사용된다면 Class Module에 놓구 사용하심이 조을듯 싶습니다...

Option Explicit

Private Const PROCESS_TERMINATE = &H1&
Private Const SYNCHRONIZE = &H100000
Private Const SW_HIDE = 0
Private Const SW_SHOWNORMAL = 1
Private Const HWND_TOPMOST = -1
Private Const HWND_NOTOPMOST = -2
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const Flags = SWP_NOMOVE Or SWP_NOSIZE
Private Const GW_HWNDNEXT = 2
Private Const GW_CHILD = 5

Private Declare Function GetTopWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal HProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Public Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Private Declare Function GetNextWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As Long, ByVal wFlag As Long) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function SearchTreeForFile Lib "imagehlp" (ByVal RootPath As String, ByVal InputPathName As String, ByVal OutputPathBuffer As String) As Long
Private Declare Function GetFullPathName Lib "kernel32" Alias "GetFullPathNameA" (ByVal lpFileName As String, ByVal nBufferLength As Long, ByVal lpBuffer As String, ByVal lpFilePart As String) As Long
Private Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long

Public XlApp As Object
Public XlWb As Object
Public Const XL_NOTRUNNING As Long = 429
Public Const XPath As String = "RPT시험위원문서양식"



'======================================================================================
' Function Name : GetXhwnd
' DateTime      : 2007-03-13 17:34
' Author        : 서은아빠 (foxmotor@nate.com)
' Purpose       : 해당 Excel파일의 핸들값을 구한다.
' Param         : strFN - 해당파일의 확장자와 Path를 제외한 이름
' Return        : GetXhwnd - 해당 Excel파일의 핸들값
'======================================================================================
Public Function GetXhwnd(ByVal strFN As String) As Long
   
   On Error GoTo GetXhwnd_Error

       GetXhwnd = FindWindow("XLMAIN", "Microsoft Excel - " & strFN & ".xls")

   On Error GoTo 0
   
   Exit Function

GetXhwnd_Error:

   On Error GoTo 0
   MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure GetXhwnd of Module modExcel", , vbCritical
End Function


'============================================================================================
' Procedure     : Process_Kill
' Description   : API로 해당 엑셀프로세스 주겨버리기
' Author        : 서은아빠 (foxmotor@nate.com)
' Return        :
' Parameter     :strFN   : 저정한 엑셀윈도우의 캡션명(확장자를 제외한 파일명)
'============================================================================================
Public Sub Process_Kill(ByVal strFN As String)
Dim Chwnd      As Long
Dim HProcess  As Long
Dim PID           As Long
Dim TID           As Long

   On Error GoTo Process_Kill_Error

      Chwnd = GetXhwnd(strFN)
   
      TID = GetWindowThreadProcessId(Chwnd, PID)
   
      HProcess = OpenProcess(SYNCHRONIZE Or PROCESS_TERMINATE, 0&, PID)
   
      Call TerminateProcess(HProcess, 0&)
   
      Call CloseHandle(HProcess)

      On Error GoTo 0
       
      Exit Sub

Process_Kill_Error:

   On Error GoTo 0
   MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure Process_Kill of Module modExcel", , vbCritical

End Sub



'======================================================================================
' Procedure : XReOpen
' DateTime  : 2007-03-13 17:46
' Author    : 서은아빠 (foxmotor@nate.com)
' Purpose   : 오픈된 엑셀을 재 오픈할시에 발생하는 오류를 사전에 차단
' Param     : strDpath - 해당파일의 FullName
'======================================================================================
Public Sub XReOpen(ByVal strDpath As String)
 Dim strFN As String
   On Error GoTo XReOpen_Error
       
       strFN = Mid(strDpath, InStrRev(strDpath, "", , vbTextCompare) + 1, _
       Len(strDpath) - InStrRev(strDpath, "", , vbTextCompare) - 4)

       If GetXhwnd(strFN) Then Call Process_Kill(strFN)
       
       Set XlApp = CreateObject("Excel.Application")
       
       With XlApp
           .WindowState = -4140        '## xlMinimized
           .Visible = True
           .EnableAnimations = False
           .workbooks.Open strDpath
       End With

   On Error GoTo 0
   
   Exit Sub

XReOpen_Error:

   On Error GoTo 0
   MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure XReOpen of Module modExcel", , vbCritical
End Sub




'======================================================================================
' Procedure : XlSetCreate
' DateTime  : 2007-03-13 17:46
' Author    : 서은아빠 (foxmotor@nate.com)
' Purpose   : 엑셀 개체를 생성하고 새로운 워크북을 만들고 시트의 개수를 생성한다.
' Param     : intSht - 생성 시트개수
'             bState - 윈도우 상태설정 True - xlMaximized, False - xlMinimized
'======================================================================================
Public Sub XlSetCreate(ByVal intSht As Integer, Optional bState As Boolean = False)
 Dim lngState As Long
 
   On Error GoTo XlSetCreate_Error

       Set XlApp = CreateObject("Excel.Application")
       
       lngState = IIf(bState = True, -4137, -4140)
       With XlApp
           .WindowState = lngState
           .Visible = True
           .EnableAnimations = False
           .SheetsInNewWorkbook = IIf(intSht > 0, intSht, 1)
           Set XlWb = .workbooks.Add

       End With
       
   On Error GoTo 0
   
   Exit Sub

XlSetCreate_Error:

   On Error GoTo 0
   MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure XlSetCreate of Module modExcel", , vbCritical
End Sub


'======================================================================================
' Procedure : XPreview
' DateTime  : 2007-03-13 17:58
' Author    : 서은아빠 (foxmotor@nate.com)
' Purpose   : Excel의 미리보기 창을 최상위 윈도우루 설정 - MDI폼을 BackGround루~~
' Param     : strFN - 해당파일의 확장자와 Path를 제외한 이름
'======================================================================================
Public Sub XPreview(ByVal strFN As String)
   
   On Error GoTo XPreview_Error

       SetWindowPos MDI폼.hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, Flags
       
       SetWindowPos GetXhwnd(strFN), HWND_TOPMOST, 0, 0, 0, 0, Flags
       
       XlApp.WindowState = -4137
       
       XlApp.workbooks(strFN & ".xls").PrintPreview
       
       XlApp.WindowState = -4140
   
   Call Process_Kill(strFN)

   On Error GoTo 0
   
   Exit Sub

XPreview_Error:

   On Error GoTo 0
   MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure XPreview of Module modExcel", , vbCritical
   
End Sub


'======================================================================================
' Procedure : XHighPos
' DateTime  : 2007-03-13 17:52
' Author    : 서은아빠 (foxmotor@nate.com)
' Purpose   : Excel의 미리보기 창을 최상위 윈도우루 설정
'======================================================================================
Public Sub MDIHighPos(Optional BLK As Boolean = True)
 Dim Top As Long
   On Error GoTo MDIHighPos_Error
       Top = IIf(BLK = True, HWND_TOPMOST, HWND_NOTOPMOST)
       SetWindowPos KMPMAIN.hwnd, Top, 0, 0, 0, 0, Flags

   On Error GoTo 0
   
   Exit Sub

MDIHighPos_Error:

   On Error GoTo 0
   MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure MDIHighPos of Module modExcel", , vbCritical
End Sub

'======================================================================================
' Procedure : GetXlfile
' DateTime  : 2007-03-15 03:31
' Author    : 서은아빠 (foxmotor@nate.com)
' Purpose   : 프로세스가 살아있는 Excel파일을 ListUp
'======================================================================================
Public Sub GetXlfile(ByVal frmN As Form)
   Dim Xhwnd    As Long
   Dim lngRet   As Long
   Dim lngSpace As Long
   Dim strSpace As String
   Dim strXname As String
   Dim Buf      As String * 255
   
   frmN.Show vbModeless
   
   frmN.cbXl.Clear
   
   Xhwnd = GetTopWindow(0)   '### 바탕화면 다음 윈도우를 얻는다.
   
   Do
   
   Xhwnd = GetNextWindow(Xhwnd, GW_HWNDNEXT)   '### 바탕화면 다음 윈도우를 얻는다.
   
   strSpace = Space(128)                                 '### 적당한 공간 할당하구
   
   lngRet = GetClassName(Xhwnd, strSpace, 128)           '### 클래스명을 얻었다믄(lngRet<>0) 공터에다가 클래스명 처넣구
   
   If lngRet Then strSpace = Left(strSpace, lngRet)      '### 클래스명을 얻었다믄(lngRet<>0) 빈문자열 삭제하구선
   
   If strSpace = "XLMAIN" Then                           '### Excel 윈도우라면...
       
       lngSpace = GetWindowTextLength(Xhwnd)             '### 캡션 길이 구하구
       
       strXname = Space(lngSpace)                        '### 변수에 공간 할당
       
       Call GetWindowText(Xhwnd, strXname, lngSpace + 1) '### 숨기구나 보여주거나
       
       strXname = Mid(strXname, 19, Len(strXname)) ' & ".xls"
       
       frmN.cbXl.AddItem strXname
       
   End If                                                '### 아님 말구
   
   Loop While Xhwnd                                      '### 핸들값 존재하믄 계속 지루박 돌구
   
   frmN.cbXl.ListIndex = 0

End Sub 설문투표

+ Recent posts