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

... 46  47  48  [49]  50  51  52  53  54  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
12715정성태7/17/202122462오류 유형: 736. Windows - MySQL zip 파일 버전의 "mysqld --skip-grant-tables" 실행 시 비정상 종료 [1]
12714정성태7/16/202115808오류 유형: 735. VCRUNTIME140.dll, MSVCP140.dll, VCRUNTIME140.dll, VCRUNTIME140_1.dll이 없어 exe 실행이 안 되는 경우
12713정성태7/16/202117229.NET Framework: 1077. C# - 동기 방식이면서 비동기 규약을 따르게 만드는 Task.FromResult파일 다운로드1
12712정성태7/15/202116183개발 환경 구성: 579. Azure - 리눅스 호스팅의 Site Extension 제작 방법
12711정성태7/15/202116171개발 환경 구성: 578. Azure - Java Web App Service를 위한 Site Extension 제작 방법
12710정성태7/15/202118824개발 환경 구성: 577. MQTT - emqx.io 서비스 소개
12709정성태7/14/202114349Linux: 42. 실행 중인 docker 컨테이너에 대한 구동 시점의 docker run 명령어를 확인하는 방법
12708정성태7/14/202118553Linux: 41. 리눅스 환경에서 디스크 용량 부족 시 원인 분석 방법
12707정성태7/14/202185761오류 유형: 734. MySQL - Authentication method 'caching_sha2_password' not supported by any of the available plugins.
12706정성태7/14/202116941.NET Framework: 1076. C# - AsyncLocal 기능을 CallContext만으로 구현하는 방법 [2]파일 다운로드1
12705정성태7/13/202117359VS.NET IDE: 168. x64 DLL 프로젝트의 컨트롤이 Visual Studio의 Designer에서 보이지 않는 문제 - 두 번째 이야기
12704정성태7/12/202116137개발 환경 구성: 576. Azure VM의 서비스를 Azure Web App Service에서만 접근하도록 NSG 설정을 제한하는 방법
12703정성태7/11/202121488개발 환경 구성: 575. Azure VM에 (ICMP) ping을 허용하는 방법
12702정성태7/11/202117256오류 유형: 733. TaskScheduler에 등록된 wacs.exe의 Let's Encrypt 인증서 업데이트 문제
12701정성태7/9/202116782.NET Framework: 1075. C# - ThreadPool의 스레드는 반환 시 ThreadStatic과 AsyncLocal 값이 초기화 될까요?파일 다운로드1
12700정성태7/8/202117246.NET Framework: 1074. RuntimeType의 메모리 누수? [1]
12699정성태7/8/202115780VS.NET IDE: 167. Visual Studio 디버깅 중 GC Heap 상태를 보여주는 "Show Diagnostic Tools" 메뉴 사용법
12698정성태7/7/202120006오류 유형: 732. Windows 11 업데이트 시 3% 또는 0%에서 다운로드가 멈춘 경우
12697정성태7/7/202115094개발 환경 구성: 574. Windows 11 (Insider Preview) 설치하는 방법
12696정성태7/6/202116041VC++: 146. 운영체제의 스레드 문맥 교환(Context Switch)을 유사하게 구현하는 방법파일 다운로드2
12695정성태7/3/202116095VC++: 145. C 언어의 setjmp/longjmp 기능을 Thread Context를 이용해 유사하게 구현하는 방법파일 다운로드1
12694정성태7/2/202118023Java: 24. Azure - Spring Boot 앱을 Java SE(Embedded Web Server)로 호스팅 시 로그 파일 남기는 방법 [1]
12693정성태6/30/202114966오류 유형: 731. Azure Web App Site Extension - Failed to install web app extension [...]. {1}
12692정성태6/30/202115429디버깅 기술: 180. Azure - Web App의 비정상 종료 시 남겨지는 로그 확인
12691정성태6/30/202115663개발 환경 구성: 573. 테스트 용도이지만 테스트에 적합하지 않은 Azure D1 공유(shared) 요금제
12690정성태6/28/202116685Java: 23. Azure - 자바(Java)로 만드는 Web App Service - Tomcat 호스팅
... 46  47  48  [49]  50  51  52  53  54  55  56  57  58  59  60  ...