Programming

SSL 채널을 통한 WCF 서비스(JSON RESTful Service) 방법

콜러스 XXII 2015. 6. 19. 14:50



[SSL 채널을 통한 WCF 서비스(JSON RESTful Service) 방법]

 

1.     시스템내의 인증서를 만든다. (Simple 인증서 발급)


a.     시작메뉴의 Visual Studio XXX로 가면 Visual Studio Tools가 있고 그 안에는 개발자용의 명령창을 선택해서 연다.

b.     다음과 같이 입력 한다.


makecert.exe -r -pe -n "CN=XXX-PC" -b 01/01/2015 -e 01/01/2050 -eku 1.3.6.1.5.5.7.3.1 -ss my -sr localMachine -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12

 

각 의미는 다음을 참조 한다.


https://msdn.microsoft.com/ko-kr/library/bfsktky3(v=vs.110).aspx

https://msdn.microsoft.com/en-us/library/windows/desktop/bb931357(v=vs.85).aspx


대충 “XXX-PC”라는 이름의 인증서를 만드는데 암호화는 RSA정도 이용한다는 뜻이다.

 

c.     IIS(인터넷 정보 서비스) 관리자를 연다.

 

 

d.     서버인증서를 더블클릭 하면 다음과 같이 인증서 내역이 나온다.

 


 

2.     WCF 서비스를 만든다.


l  다음과 같이 선택하고 생성한다.

 

 

ð  IIS 호스팅을 이용한 WCF 서비스 생성을 기본으로 한다.

ð  프로젝트 이름은 WCFHTTPsTest, 서비스 이름은 Service1라고 가정한다.

 

l  web.config

 

<system.serviceModel>

<services>

<service name ="WCFHTTPsTest.Service1">       

<!-- For SSL -->      

<endpoint address="" binding="webHttpBinding"

contract="WCFHTTPsTest.IService1"

bindingConfiguration="SSLBinding"                 

behaviorConfiguration="webHttpBehavior" />

<!-- For Normal -->

<endpoint address="" binding="webHttpBinding"

          contract="WCFHTTPsTest.IService1"                       

            behaviorConfiguration="webHttpBehavior" />

<endpoint address="mex" binding="mexHttpBinding"

contract="IMetadataExchange"/>       

</service>

</services>

 

<bindings>     

<!-- For SSL -->     

<webHttpBinding>

<binding name = "SSLBinding">

<security mode ="Transport">

          <transport clientCredentialType="None" />

           </security>

</binding>

</webHttpBinding>

<!-- For Normal : keep it empty -->     

</bindings>

   

<behaviors>     

<serviceBehaviors>

<behavior>

<!-- To avoid disclosing metadata information, set the values

below to false before deployment -->

           <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>         

           <!-- To receive exception details in faults for debugging purposes,

           set the value below to true.  Set to false before deployment to

           avoid disclosing exception information -->

           <serviceDebug includeExceptionDetailInFaults="false"/>

</behavior>

</serviceBehaviors>

 

<!-- For JSON REST service -->

<endpointBehaviors>

<behavior name="webHttpBehavior">

<webHttp helpEnabled="true"

defaultOutgoingResponseFormat="Json" />     

</behavior>

</endpointBehaviors>     

</behaviors>

 

<serviceHostingEnvironment aspNetCompatibilityEnabled="true"

 multipleSiteBindingsEnabled="true" />   

</system.serviceModel>

 

ð  Secured 채널용 End Point를 잡는다.

ð  SSL 바인딩 방법을 설정한다.

ð  JSON으로 통신함을 설정한다.

 

l  POST로 주고 받을 class를 정의한다.

 

[DataContract]

public class TestDataModel

{

[DataMember]

public string Input { get; set; }

}

 

[DataContract]

public class TestDataReturnModel

{

[DataMember]

public string ID { get; set; }

[DataMember]

public string Output { get; set; }

}

 

l  서비스 인터페이스 코드 (POST 예제) à 구체적 설명은 다른 설명 참조

 

[OperationContract]

[WebInvoke(

           Method = "POST",

           UriTemplate = "GetDataModel/{value}",

           BodyStyle = WebMessageBodyStyle.Bare,

           ResponseFormat = WebMessageFormat.Json,

           RequestFormat = WebMessageFormat.Json)]

TestDataReturnModel GetDataModel(string value, TestDataModel model);

 

ð  POST JSON Format으로 요청(model)을 받아 JSON Format으로 결과를 리턴한다.

ð  value URL로 들어감을 표시한다.

 

l  서비스 내용 코드

 

public TestDataReturnModel GetDataModel(string value, TestDataModel model)

{

           TestDataReturnModel ret = new TestDataReturnModel();

           ret.ID = "" + value;

           ret.Output = "Output is " + model.Input;

 

           return ret;

}

 

ð  간단히 결과를 리턴한다.

 

3.     WCF 서비스를 IIS에 올린다. à 개발/테스트 목적의 과정이다. 실제 Deploy는 다른 방법으로 해야한다.


a.     IIS(인터넷 정보 서비스) 관리자를 연다.

b.     왼쪽 사이트 트리에서 루트를 선택한 후 오른쪽 클릭을 해서 [웹 사이트 추가]를 선택한다.

 

 

c.     사이트 이름과 실제 경로(프로젝트 메인 루트 폴더), 포트번호만 지정한다. (80보다는 다른 번호가 좋다.)

d.     왼쪽 트리에서 [응용프로그램 풀]을 선택해서 해당 서비스의 [응용프로그램 풀]을 확인하고 .NET 2.0이면 .NET 4.0으로 바꾼다.

 

 

e.     왼쪽 트리에서 추가된 웹사이트를 선택한다. 그런 뒤 오른쪽 작업 메뉴의 [바인딩]을 선택한다.

 

 

ð  위의 예제처럼 http https를 설정한다. 사실 https만 해도 되는데 디버깅용으로 http도 연다. (web.config으로 조정가능 하다.)

ð  포트도 임의로 정하면 된다. 여기서는 12254(http)12253(https)으로 했다.


f.      웹 사이트 서비스를 재시작 한다.

 

4.     서비스 테스트


a.     크롬에서 Advanced REST Client plugin을 설치한다.

b.     plugin을 실행한다.

 

 

c.     일반 서비스 테스트 - 필요한 부분을 입력한 뒤 [Send]를 누른다.

 

 

ð  URL : http://<주소:12254>/Service1.svc/GetDataModel/2

ð  Payload : {“Input” : “XXX” }

 

ð  결과는 다음과 같이 나온다.

 

 

ð  Wireshark으로 보면 암호화 되지 않게 전송됨을 알 수 있다.


[Client à Server]



[Server à Client]


 

d.     HTTPS 서비스 테스트 - 필요한 부분을 입력한 뒤 [Send]를 누른다.

 

 

ð  URL : https://<주소:12253>/Service1.svc/GetDataModel/2

ð  Payload : {“Input” : “XXX” }

ð  처음 연결을 한다면 [No Response]가 나올 수도 있다. 그럴 때는 주소 창에서 URL을 입력한 후 브라우저를 신뢰하도록 해서 연결을 한다. (아래 그림참조)

 

 

ð  결과는 다음과 같이 나온다.

 

 

ð  Wireshark으로 보면 암호화 되게 전송됨을 알 수 있다.


[Client à Server]



[Server à Client]



[Server à Client]



[Client à Server]


 

안드로이드로 본 서비스를 이용하는 방법은 다음을 참조 하도록 한다.

  

http://blog.saltfactory.net/android/using-https-on-android.html