Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
부모글 보이기/감추기
(연관된 글이 1개 있습니다.)
7. 인증서/스마트 카드에 기반한 Managed Card - STS 구현


"SelfIssuedAuth"에 대해서는 지난번 "11.3.2 Managed Card 발행에 대한 Microsoft 예제 실습 (2) - STS 구현"에서 살펴보았고, 오늘은 "SmartCard" 유형으로 실습을 해보도록 하겠습니다. 전체적인 예제 형식은 "11.3.2 Managed Card 발행에 대한 Microsoft 예제 실습 (2) - STS 구현"을 기반으로 할 텐데, 그중에서 다음과 같은 사항들을 수정해 볼 것입니다.

- 인증서를 "Simple STS.zip"에서 제공되는 것을 쓰지 않고 직접 인증서 서비스를 구성해서 SSL 인증서를 웹 사이트에 설치
- 인증서 또는 Smart Card를 기반으로 해서 Managed Card를 발급

자, 그럼 첫 번째 단계로 "테스트 웹 사이트"를 구성하는 것으로 시작해 보겠습니다.



[테스트 웹 사이트 구성]

1. "C:\Net30\SmartSTS" 폴더를 만들고 해당 폴더를 "IIS 관리자"에서 가상 디렉터리로 구성합니다. 다음과 같이 나와야 합니다.

테스트 가상 디렉터리

2. SSL 통신을 할 것이기 때문에, 위의 가상 디렉터리가 속한 "웹 사이트"(위의 화면에서는 Default Web Site)에 "서버 인증서"를 받습니다. 이를 위해서는 인증서 서비스를 구성하거나 makecert.exe를 이용해서 테스트 인증서를 만들어야 합니다. 다음의 토픽을 참고하십시오.


18.1 윈도우즈 인증서 서비스 설치 
; https://www.sysnet.pe.kr/2/0/354

18.2. 웹 사이트에 SSL을 적용 
; https://www.sysnet.pe.kr/2/0/372


3. 저 같은 경우에는 위의 토픽 실습을 기반으로 "Default Web Site"에 "sedona2"라는 이름으로 서버 인증서가 설치되었습니다.

서버 인증서

4. 아래의 파일을 다운로드 받습니다. 이 파일 안에서 "/website/CardSpace" 폴더가 웹 응용 프로그램 폴더인데 이 부분을 "C:\Net30\SmartSTS" 폴더에 복사합니다.

Simple STS.zip
; http://cardspace.netfx3.com/files/folders/6082/download.aspx

5. 폴더 내용이 다음과 같이 구성되어져야 합니다.

SmartSTS 폴더 내용

6. 성공적으로 동작을 하는지 "https://sedona2/SmartSTS/sample.htm" 주소로 Internet Explorer를 이용해서 방문을 해봅니다.




위의 내용을 완료하고 나면, Web Site(Relying Party)에 해당하는 부분은 준비가 되었습니다. 다음으로 "Security Token Service"를 준비해 보겠습니다.

STS 빌드 및 실행

1. 이 부분은 이전의 "11.3.2 Managed Card 발행에 대한 Microsoft 예제 실습 (2) - STS 구현"과 거의 동일합니다. 일단, 다운로드한 "Simple STS.zip"에서 "SecurityTokenServer" 폴더의 "SampleSecurityTokenService.csproj" 프로젝트를 VS.NET 2005에서 읽어들이고, "RequestSecurityTokenResponse.cs" 파일을 아래와 같이 편집해 줍니다.

    protected List GetTokenAttributes()
    {
      List result = new List();

      string ppid = "your ppid";

      result.Add(new SamlAttribute(new Claim(ClaimTypes.PPID, ppid, Rights.PossessProperty)));
      result.Add(new SamlAttribute(new Claim(ClaimTypes.GivenName, "SeongTae", Rights.PossessProperty)));

      result.Add(new SamlAttribute(new Claim(ClaimTypes.Surname, "Jeong", Rights.PossessProperty)));
      result.Add(new SamlAttribute(new Claim(ClaimTypes.Email, "kevin13@chol.net", Rights.PossessProperty)));

      return result;
    }


2. app.config 파일에서 "appSettings" 부분을 여러분들의 환경에 맞게 수정합니다.

  
    <!-- The Identity Provider -->
    <add key="issuer" value="sedona2" />
    <!-- The Thumbprint of the certificate to sign the RSTR-->
    <add key="certificateThumbprint" value="9557939035075d2c024a855555d5d39d24653ed3" />
    <!-- The Base address of the WS-Trust endpoint -->
    <add key="baseAddress" value="http://sedona2:7000/sample/trust" />
    <!-- The Base address of the MEX endpoint -->
    <add key="baseMexAddress" value="https://sedona2:7001/sample/trust" />
  </appSettings>

위의 WCF 서비스에서는 "Default Web Site"에 구성된 인증서를 동일하게 사용할 것입니다. 따라서 "certificateThumbprint" 값은 그 인증서의 thumbprint 값을 사용하시면 됩니다. 인증서의 thumbprint 값을 구하는 방법은 다음의 토픽을 참고하십시오.

WCF에 SSL 적용 (1) - Httpcfg.exe 도구를 이용한 SSL 설정
; https://www.sysnet.pe.kr/2/0/389

3. 역시 이번에도 "11.3.2 Managed Card 발행에 대한 Microsoft 예제 실습 (2) - STS 구현"에서와 같이 7001 포트에 대해서 SSL 인증서를 매핑시켜 줘야 합니다. 다음과 같은 명령어로 가능합니다.

C:\...>httpcfg set ssl -i 0.0.0.0:7001 -h 9557939035075d2c024a855555d5d39d24653ed3
HttpSetServiceConfiguration completed with 0.

C:\...>httpcfg query ssl
    IP                      : 0.0.0.0:443
    Hash                    : 9557939035 75d2c 24a855555d5d39d24653ed3
    Guid                    : {4dc3e181-e14b-4a21-b022-59fc669b0914}
    CertStoreName           : MY
    CertCheckMode           : 0
    RevocationFreshnessTime : 0
    UrlRetrievalTimeout     : 0
    SslCtlIdentifier        :
    SslCtlStoreName         :
    Flags                   : 0
------------------------------------------------------------------------------
    IP                      : 0.0.0.0:7001
    Hash                    : 9557939035 75d2c 24a855555d5d39d24653ed3
    Guid                    : {00000000-0000-0000-0000-000000000000}
    CertStoreName           : (null)
    CertCheckMode           : 0
    RevocationFreshnessTime : 0
    UrlRetrievalTimeout     : 0
    SslCtlIdentifier        : (null)
    SslCtlStoreName         : (null)
    Flags                   : 0
------------------------------------------------------------------------------

보시는 것처럼, IIS 서비스의 "Default Web Site"에 설정된 443 포트에 SSL 인증서가 설치되어져 있는 것과 함께 7001에도 동일한 인증서로 매핑이 된 것을 확인할 수 있습니다.

4. 이제, "SampleSecurityTokenService.csproj" 프로젝트를 빌드해서 실행시키면 다음과 같은 화면으로 서비스가 실행되어져서 대기를 하게 됩니다.

Listener = http://sedona2:7000/sample/trust/smartcard/sts, State = Opened
Listener = https://sedona2:7001/sample/trust/smartcard/mex, State = Opened
Listener = http://sedona2:7000/sample/trust/smartcard, State = Opened
Listener = http://sedona2:7000/sample/trust/selfissuedsaml/sts, State = Opene
Listener = https://sedona2:7001/sample/trust/selfissuedsaml/mex, State = Open
Listener = http://sedona2:7000/sample/trust/selfissuedsaml, State = Opened
Listener = http://sedona2:7000/sample/trust/usernamepassword/sts, State = Opend
Listener = https://sedona2:7001/sample/trust/usernamepassword/mex, State = Opend
Listener = http://sedona2:7000/sample/trust/usernamepassword, State = Opened

Press  to terminate services




말씀드린 데로, 이전 예제에서와는 달리 이번에는 "스마트 카드"를 이용한 통신을 할 것입니다. 사실, 스마트 카드를 가지고 계신 분들이 그다지 많지는 않을 것이기 때문에, 대신에 클라이언트 측에 인증서를 설치해서 그걸 가지고 실습을 할 것입니다. 스마트 카드로 하는 것도 결국은 해당 인증서를 사용할 때 스마트 카드가 존재하는지 "Window CardSpace"에 의해서 체크하는 과정만 추가되는 것이므로 아래의 실습에는 별다른 지장이 없습니다.

만약 여러분이 SmartCard 인증을 지원하는 시스템의 개발 담당자라면 SmartCard를 가지고 실습을 하셔도 됩니다. 만약 그렇지 않은 분이라면 아래의 실습을 진행하기 위해서는 "개발 환경 구성: 18.4. 사용자 인증서 발급"을 먼저 읽으셔서 인증서를 클라이언트에 설치하시기 바랍니다.

[인증서/스마트 카드를 이용한 Managed Card 발행]

1. 다운로드한 "Simple STS.zip"에서 "CardWriter" 폴더의 "CardWriter.csproj" 프로젝트를 VS.NET 2005에서 읽어들여서 빌드하고, 결과물인 "CardWriter.exe"가 생성된 것을 확인합니다.

2. "Simple STS.zip"에 포함된 "SampleCards" 폴더에 보시면 여러 가지 유형의 Managed Card를 발행할 수 있는 INI 템플릿 파일들이 있습니다. 그중에서 "FabrikamCertificate.ini" 파일의 내용에서 "[Issuer]"절과 "[Credentials]"절을 다음과 같이 수정해 줍니다. (물론, 자신의 환경에 맞게 변경합니다.)

[Issuer]
Name=Sedona2 Web Site
Address=http://sedona2:7000/sample/trust/smartcard/sts
MexAddress=https://sedona2:7001/sample/trust/smartcard/mex
PrivacyPolicy=http://sedona2/PrivacyPolicy.xml
Certificate=Localmachine/MY/sedona2

[Credentials]
value=XoJ7ZCXuOJTs2aZdhLW3S5WPs6c=
Hint=Insert your smartcard please.

"[Issuer]"절의 Certificate는 sedona2 서버 측에 설치된 "개인키"가 포함된 인증서의 경로를 지정해 준 것이고, "[Credentials]"절의 value 값은 제가 가지고 있는 (스마트 카드와 연결된) 인증서의 Thumbprint 값의 base64 인코딩된 문자열입니다. 이러한 값들을 구하는 방법은 다음의 토픽을 참조하십시오.

NET 3.0 : 11.5. CardWriter.csproj와 함께 알아보는 인증서 식별 방법 
; https://www.sysnet.pe.kr/2/0/397


3. 이제 CardWriter.exe를 이용해서 설정된 INI 파일을 입력으로 CRD 확장자를 가진 Managed Card를 생성합니다.

C:\...>cardwriter Kevin025Certificate.ini
Reading card config from
   C:\...\Kevin025Certificate.ini
Did not find smart card certificate, setting smartcard certificate hash to [XoJ7ZCXuOJTs2aZdhLW3S5WPs6c=]
Card written to
   C:\...\Kevin025Certificate.crd

4. 이제, 생성된 CRD 파일을 클라이언트 측 컴퓨터로 복사한 후 2번 클릭해서 실행하면 "Windows CardSpace"가 실행되어 설치가 됩니다.




모든 설치는 완료되었습니다. 이제는 정상적으로 모든 것들이 동작하는지 실습해 볼 차례입니다. 하나씩 따라해 볼까요? ^^

1. 빌드시켜 두었던 "SampleSecurityTokenService.exe" 프로그램을 서버 측에서 실행시켜 둡니다.

2. "Managed Card"를 설치해 두었던 클라이언트 측 컴퓨터에서 https://sedona2/SmartSTS/sample.htm 페이지를 방문합니다.

3. "Click here to get the token" 버튼을 누릅니다. 그럼 다음과 같이 "CardWriter" 단계에서 만들었던 CRD 파일을 설치해서 생긴 "My Card"가 한 장 있는데 이 카드를 선택하고 "Send" 버튼을 누릅니다.

설치된 Managed Card를 선택

4. INI 파일의 "[Credentials]"절에 Hint 값으로 주었던 텍스트가 나오게 됩니다. (만약 스마트 카드를 가지고 실습을 하시는 분들은 실제로 이 단계에서 스마트 카드를 컴퓨터에 연결하고 "확인" 버튼을 누릅니다.)

스마트 카드 연결 확인창

5. 만약 스마트 카드로 테스트 하시는 분들은 다음 화면과 같이 "PIN"을 입력하는 화면이 한번 더 뜨게 됩니다. 물론, 그냥 개인 인증서 가지고 테스트하는 분들은 이 단계가 생략됩니다.

PIN 입력

6. 잠시, STS 측과의 통신이 이루어지고 난 다음에 STS에 요청한 claims에 해당하는 값들을 전송받은 아래와 같은 XML 구조가 텍스트 박스에 보이게 됩니다.

Relying Party로 전송될 인증 정보

7."Click here to send the card to the server" 버튼을 누르게 되면 서버로 해당 XML 내용이 전송되게 되고, 웹 사이트(Relying party) 측에서는 전송되어진 XML 내용으로부터 자신이 요청했던 claims에 해당하는 정보들을 추출할 수 있게 됩니다.

인증 정보를 추출해서 출력




여기까지, 인증서 및 스마트 카드를 기반으로 하는 로그인 방법에 대해 설명을 드렸습니다. 제가 실제로 사용할만한 스마트 카드가 없어서 완벽한 실습은 안되었지만, 부분적으로 "Microsoft MVP" 자격으로 "공유 소스 프로그램" 신청을 통해 받은 스마트 카드를 이용해서 대강은 꾸며봤습니다.

사실, 어느 정도는 "인증서를 기반으로 한 Managed Card"와 "스마트 카드를 기반으로 한 Managed Card"와는 별다른 차이점이 존재하지 않습니다. 스마트 카드의 경우 PIN 정보를 입력하도록 되어 있는데, 사실 이런 정도는 "인증서를 기반으로 한 Managed Card"에서도 "Lock card" 정도로 구현이 가능합니다. 그렇게 따지면 유일한 차이점이라고는 물리적인 "스마트 카드"가 컴퓨터에 연결되어져 있느냐에 대한 추가적인 보안이 요구되는 정도입니다.



[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 7/10/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2006-11-14 11시13분
[석] 잘 봤습니다. 많은 도움이 되고 있네요.

이해 안되는 부분이 생기면 자주 질문 드리겠습니다. ㅎㅎ

그럼 좋은 하루 되세요.
[guest]
2006-11-14 11시28분
^^
kevin25
2006-11-15 07시47분
[석] 스마트 카드를 가지고 Retrieve 할때 SmartCard Connection 에러가 발생을 하는데

이런 에러는 경험 하셨는지요?? 그리고 위에 이야기 나온 공유 소스 프로그램을 신청해서 만들었다는건

스마트 카드를 소프트웨어 적으로 제공을 하는 툴을 받아서 하신건가요? 괜찮으시면 Heliman@nate.com 으로 좀

보내 주실수 있을까요. ^^

Framework 버전이 달라서 안되는건지...머리가 아퍼지고 있습니다. ㅜㅜ
[guest]
2006-11-22 09시23분
SmartCard Connection 할 때 어떤 에러가 발생한다는 것인가요? 구체적으로 써주셔야죠. ^^
"공유 소스 프로그램"은 Microsoft가 MVP들에게 자사의 Windows의 소스를 열람할 수 있는 것입니다. 스마트 카드는 그 "웹 사이트"를 방문하기 위해 필요한 것이고요.

암튼, 딱히 뭐라 도움을 못 드리는 군요. 일단, SmartCard 말고 인증서만 가지고 먼저 테스트를 해보십시오.
kevin25
2008-03-14 11시53분
A C# Code Library for building an Information Card STS
; http://www.identityblog.com/?p=940
kevin25

[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13609정성태4/27/202470닷넷: 2250. PInvoke 호출 시 참조 타입(class)을 마샬링하는 [IN], [OUT] 특성파일 다운로드1
13608정성태4/26/2024424닷넷: 2249. C# - 부모의 필드/프로퍼티에 대해 서로 다른 자식 클래스 간에 Reflection 접근이 동작할까요?파일 다운로드1
13607정성태4/25/2024423닷넷: 2248. C# - 인터페이스 타입의 다중 포인터를 인자로 갖는 C/C++ 함수 연동
13606정성태4/24/2024475닷넷: 2247. C# - tensorflow 연동 (MNIST 예제)파일 다운로드1
13605정성태4/23/2024714닷넷: 2246. C# - Python.NET을 이용한 파이썬 소스코드 연동파일 다운로드1
13604정성태4/22/2024756오류 유형: 901. Visual Studio - Unable to set the next statement. Set next statement cannot be used in '[Exception]' call stack frames.
13603정성태4/21/2024905닷넷: 2245. C# - IronPython을 이용한 파이썬 소스코드 연동파일 다운로드1
13602정성태4/20/2024945닷넷: 2244. C# - PCM 오디오 데이터를 연속(Streaming) 재생 (Windows Multimedia)파일 다운로드1
13601정성태4/19/2024972닷넷: 2243. C# - PCM 사운드 재생(NAudio)파일 다운로드1
13600정성태4/18/2024989닷넷: 2242. C# - 관리 스레드와 비관리 스레드
13599정성태4/17/2024938닷넷: 2241. C# - WAV 파일의 PCM 사운드 재생(Windows Multimedia)파일 다운로드1
13598정성태4/16/2024981닷넷: 2240. C# - WAV 파일 포맷 + LIST 헤더파일 다운로드2
13597정성태4/15/2024977닷넷: 2239. C# - WAV 파일의 PCM 데이터 생성 및 출력파일 다운로드1
13596정성태4/14/20241083닷넷: 2238. C# - WAV 기본 파일 포맷파일 다운로드1
13595정성태4/13/20241070닷넷: 2237. C# - Audio 장치 열기 (Windows Multimedia, NAudio)파일 다운로드1
13594정성태4/12/20241088닷넷: 2236. C# - Audio 장치 열람 (Windows Multimedia, NAudio)파일 다운로드1
13593정성태4/8/20241091닷넷: 2235. MSBuild - AccelerateBuildsInVisualStudio 옵션
13592정성태4/2/20241228C/C++: 165. CLion으로 만든 Rust Win32 DLL을 C#과 연동
13591정성태4/2/20241203닷넷: 2234. C# - WPF 응용 프로그램에 Blazor App 통합파일 다운로드1
13590정성태3/31/20241084Linux: 70. Python - uwsgi 응용 프로그램이 k8s 환경에서 OOM 발생하는 문제
13589정성태3/29/20241162닷넷: 2233. C# - 프로세스 CPU 사용량을 나타내는 성능 카운터와 Win32 API파일 다운로드1
13588정성태3/28/20241406닷넷: 2232. C# - Unity + 닷넷 App(WinForms/WPF) 간의 Named Pipe 통신 [2]파일 다운로드1
13587정성태3/27/20241362오류 유형: 900. Windows Update 오류 - 8024402C, 80070643
13586정성태3/27/20241542Windows: 263. Windows - 복구 파티션(Recovery Partition) 용량을 늘리는 방법
13585정성태3/26/20241500Windows: 262. PerformanceCounter의 InstanceName에 pid를 추가한 "Process V2"
[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...