SSL 채널을 통한 WCF 서비스(JSON RESTful Service) 방법
[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