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

... 151  152  [153]  154  155  156  157  158  159  160  161  162  163  164  165  ...
NoWriterDateCnt.TitleFile(s)
1224정성태1/21/201237211개발 환경 구성: 139. 아마존 EC2에 새로 추가된 "1년 무료 Windows 서버 인스턴스"가 있다는데, 직접 만들어 볼까요? ^^ [11]
1223정성태1/20/201227258.NET Framework: 296. 괜찮은 문자열 해시함수? - 두 번째 이야기 [1]파일 다운로드1
1222정성태1/18/201234993.NET Framework: 295. 괜찮은 문자열 해시 함수? [4]파일 다운로드1
1221정성태1/17/201223943오류 유형: 147. System.Runtime.InteropServices.COMException (0x80005000)
1220정성태1/15/201224101.NET Framework: 294. Master web.config 파일을 수정하려면?파일 다운로드1
1219정성태1/15/201226529.NET Framework: 293. Microsoft PowerPoint 슬라이드를 HTML 파일로 ".files" 폴더 없이 저장하는 방법 (C# 코드)파일 다운로드1
1218정성태1/15/201238972.NET Framework: 292. RSACryptoServiceProvider의 공개키와 개인키 구분 [1]파일 다운로드2
1217정성태1/14/201241115.NET Framework: 291. .NET에서 WAV, MP3 파일 재생하는 방법 [1]파일 다운로드1
1216정성태1/14/201229812오류 유형: 146. Microsoft Visual C++ 재배포 패키지 - 설치 로그 남기는 방법 [1]
1215정성태1/9/201227367제니퍼 .NET: 20. 제니퍼 닷넷 적용 사례 (3) - '닷넷'이 문제일까? '닷넷 개발자'가 문제일까? [6]
1214정성태1/3/201224208제니퍼 .NET: 19. 제니퍼 닷넷 설치/제거 방법 - IIS
1213정성태12/31/201124172.NET Framework: 290. WCF - 접속된 클라이언트의 IP 주소 알아내는 방법 - 두 번째 이야기
1212정성태12/31/201124250오류 유형: 145. The trust relationship between this workstation and the primary domain failed.
1211정성태12/31/201129009.NET Framework: 289. WindowsFormsHost를 사용하는 XBAP 응용 프로그램파일 다운로드1
1210정성태12/30/201148047.NET Framework: 288. FFmpeg.exe를 이용한 C# 동영상 인코더 예제 [9]파일 다운로드1
1209정성태12/29/201122665개발 환경 구성: 138. BizTalk 2006 설치 방법
1208정성태12/28/201145651.NET Framework: 287. Excel Sheet를 WinForm에서 사용하는 방법 [8]파일 다운로드2
1207정성태12/26/201124934.NET Framework: 286. x86/x64로 구분된 코드를 포함하는 경우, 다중으로 어셈블리를 만들어야 할까요?파일 다운로드1
1206정성태12/25/201125953.NET Framework: 285. Shader 강좌와 함께 배워보는 XNA Framework (3) - 텍스처 매핑 예제파일 다운로드1
1205정성태12/25/201131691.NET Framework: 284. Thread 개체의 Interrupt와 Abort의 차이점파일 다운로드1
1204정성태12/22/201125173.NET Framework: 283. MEF를 ASP.NET에 성능 손실 없이 적용하려면? [7]
1203정성태12/21/201125558제니퍼 .NET: 18. MEF가 적용된 ASP.NET 웹 사이트를 제니퍼 닷넷으로 모니터링 해본 결과! [6]
1202정성태12/21/201125951오류 유형: 144. The database '...' cannot be opened because it is version 661.
1201정성태12/14/201141020디버깅 기술: 47. .NET Reflector를 이용한 "소스 코드가 없는" 어셈블리 디버깅 [4]
1200정성태12/11/201126910디버깅 기술: 46. Windbg 확장 DLL 만들기 (2) - Debugger Extension API 사용파일 다운로드1
1199정성태12/11/201128232VC++: 55. JNI DLL 컴파일 시 x86과 x64의 Export된 함수의 이름이 왜 다를까요? [2]파일 다운로드1
... 151  152  [153]  154  155  156  157  158  159  160  161  162  163  164  165  ...