2013년 4월 23일 화요일

인증서 만들기


인증서 만들기

출처 : 딤딤이 블로그(http://dimdim.tistory.com/50)

openssl 을 이용한 인증서 생성 절차를 정리한다.
참고로 여기서 개인키파일(key.pem), CSR파일(csr.pem), 인증서 파일 (crt.pem) 등의 파일명은 마음데로 변경할 수 있다.
1. 개인키 파일 생성
  - Random Sate 사용 여부 및 암호화는 필수가 아닌 선택사항이다.
  - 키파일을 암호화할 경우 패스워드 입력이 필요하며, 해당 패스워드를 알아야만 키파일을 사용할 수 있다. (암호화 했으니까 복호화해야 키값을 알지!!! 암복호화에 사용되는 것이 패스워드고!!!)
$ openssl md5 * > rand.dat  #Random State 파일 생성
$ openssl genrsa -rand rand.dat -des3 1024 > key.pem    #Random State 사용 & des3 암호화 사용 & 1024 bit 키 생성
$ openssl genrsa -des3 1024 > key.pem  #des3 암호화 사용 & 1024 bit 키 생성
$ openssl genrsa 1024 > key.pem  #1024bit 키생성 (패스워드 필요없음)
$ openssl genrsa > key.pem  #기본 512bit 키 생성

2. CSR 생성
  - CSR은 "Certificate Signing Request" 의 약자로 인증서 서명 요청을 의미한다. 좀더 쉽게 설명하면 CSR 파일은 인증서를 발급받기 위해서 나는 "아무개"이고 키값은 어떤걸 사용한다는 정보를 저장하고 있다.
$ openssl req -new -key key.pem > csr.pem
Enter pass phrase for key.pem:    #키파일 생성시 사용한 패스워드 입력 (키파일을 암호화한 경우만 필요한 과정임)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:                                         #ISO 국가코드 입력
State or Province Name (full name) [Berkshire]:                       #도/시 입력
Locality Name (eg, city) [Newbury]:                                        #도시명 입력
Organization Name (eg, company) [My Company Ltd]:              #회사명 입력
Organizational Unit Name (eg, section) []:                               #조직명 입력
Common Name (eg, your name or your server's hostname) []:   #사용자명 혹은 서버 호스트명
Email Address []:                                                                 #이메일주소

3. SSL 인증서 파일 생성
3.1 공인 인증서 파일 생성
  - 공인인증서 발급 기관의 박급절차를 따라 인정서 파일을 발급받으며 인정서 발급시 위에서 생성한 CSR 파일이 필요하다.
  - 공인 인증 기관은 아래와 같다.
    + 한국전자인증 : http://www.crosscert.com
    + 금융결제원 전자인증센터(yessign) : https://www.yessign.or.kr/ssl/index.htm
3.2 사설 인증서 파일 생성
  - openssl을 이용하여 사설 인증서 파일을 생성한다. 
$ openssl req -key key.pem -x509 -nodes -sha1 -days 365 -in csr.pem -out crt.pem


저작자 표시 비영리 동일 조건 변경 허락
 
크리에이티브 커먼즈 라이선스
Creative Commons License

SOAP이란


SOAP (Simple Object Access Protocol)

출처 : http://tequiero35.egloos.com/1026372

강좌 : http://www.w3schools.com/soap/default.asp

What is SOAP?

분산 환경에서 어플리케이션 간에 정보를 교환하기 위한 XML 기반의 메시지 프로토콜.

  • SOAP stands for Simple Object Access Protocol
  • SOAP is a communication protocol
  • SOAP is for communication between applications
  • SOAP is a format for sending messages
  • SOAP communicates via Internet
  • SOAP is platform independent
  • SOAP is language independent
  • SOAP is based on XML
  • SOAP is simple and extensible
  • SOAP allows you to get around firewalls
  • SOAP is a W3C recommendation

Why SOAP?

It is important for application development to allow Internet communication between programs.
Today's applications communicate using Remote Procedure Calls (RPC) between objects like DCOM and CORBA, but HTTP was not designed for this.
RPC represents a compatibility and security problem; firewalls and proxy servers will normally block this kind of traffic.
A better way to communicate between applications is over HTTP, because HTTP is supported by all Internet browsers and servers. SOAP was created to accomplish this.
SOAP provides a way to communicate between applications running on different operating systems, with different technologies and programming languages.


SOAP 구조

SOAPPart 구조HTTP

1. 요 청 (Request)
Request = Request-Line
* (general-header | request-header | entity-header)
CRLF
[message-body]

POST /axis/services/axisTest HTTP/1.0
Content-Type: text/xml; charset=utf-8
Accept: application/soap+xml, application/dime, multipart/related, text/*
User-Agent: Axis/1.4
Host: 127.0.0.1:1234
Cache-Control: no-cache
Pragma: no-cache
SOAPAction: ""
Content-Length: 934

Method

POST
메시지의 entity body에 포함되어 있는 자원을 Request-Line에 있는 Request-URI에 지정되어 있는 대로 서버에서 수용해달라고 요청할 때 쓰인다
HTTP/1.0의 모든 POST 요구 메시지에는 Content-Length가 반드시 있어야 하며, 서버가 이에 대한 정보를 확보하지 못하게 되면 400 (Bad Request) 메시지를 응답해야 한다.

Header Field

◦ Content-Length
Entity-Body의 크기를 바이트 단위로 표시하여 수신측에게 알려주는 용도.

◦ Content-Type
수신측에게 전달하는 Entity-Body의 데이타 형식을 표시한다. (MIME)

◦ Pragma
general-header필드. request/response chain을 따라 어떤 수신측에도 적용할 수 있는 구현 방식에 한정된 지시자(implementation-specific)를 포함하는 데 사용한다
"no-cache" 변수가 요구 메시지에 존재한다면 응용 프로그램에서는 해당 자원이 캐시되어 있을지라도 원래 위치하고 있는 서버로 요구 메시지를 전달해야 한다. 이것은 클라이언트가 보내는 요구에 대해 신뢰할 수 있는 응답을 받고자 할 때 쓰일 수 있으며, 또한 클라이언트에게 데이타 오류와 같이 문제가 발생한 캐시 문서를 갱신할 수 있도록 할 때 쓰일 수 있다.

Cache-Control
브라우저나 프록시 서버로 하여금 요청시에 캐시된 문서를 사용하지 말고 매번 서버로부터 새로운 문서를 다시 전송받아 사용하도록 알리는 헤더.
HTTP1.0 에서는 Pragma헤더에 'no-cache', HTTP1.1 에서는 Cache-Control헤더에 'no-cache'를 각각 지정함으로써 가능하다.

User-Agent
사용자가 요구 메시지를 생성시키는 브라우저에 대한 정보를 나타낸다.

◦ Host
request-header필드. 자원의 인터넷 호스트와 포트 숫자를 명시. ◦ Acceptrequest-header필드. 요구에 대한 응답 메시지로서 허용할 수 있는 media type범위를 알려줄 때 사용한다."type/*" 표시는 해당 type에 대한 모든 종류의 subtype형식을 허용한다는 뜻.
◦ Date메시지가 만들어지는 날짜와 시간

2. 응 답 (Response)
Response = Status-Line
* (general-header | request-header | entity-header)
CRLF
[message-body]

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/xml;charset=utf-8
Date: Mon, 19 Nov 2007 05:53:00 GMT
Connection: close

▷ 상태 코드 (Status Code)

◦ Informational 1xx
임시적인 응답을 의미. Status-Line과 선택적인 헤더들로 구성되어 빈줄로서 끝을 나타낸다.

Successful 2XX
클라이언트의 요구가 성공적으로 수신되어 처리되었다는 것을 의미.
- 200 OK
클라이언트의 요구가 서버에서 성공적으로 처리되었음.

Redirection 3xx
해당 요구를 수행하기 위해 추가적인 동작이 필요

◦ Client Error 4xx
클라이언트에 의해 생긴 오류 상황들에 대해 사용한다.

◦ Server Error 5xx
서버에게 일어난 오류상황이나 요구 사항을 처리할 수 없을 때.


SOAPPart 구조



<env:Envelop>

◦ 루트 엘리먼트
SOAP메시지를 위한 네임스페이스
-XML Schema네임스페이스 : http://www.w3.org/2001/XMLSchema
-XML Schema인스턴스 네임스페이스 : http://www.w3.org/2001/XMLSchema-instance
-데이터 타입 인코딩 네임스페이스
SOAP버전
-SOAP Envelope 엘리먼트는명시적으로프로토콜의버전을표현하지않는다.
-대신 XML 네임스페이스의 능력을 증대시키고, SOAP envelope namespace URI되기위한프로토콜의버전을정의한다.

예제
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">


<env:Header>
<env:Envelop> 엘리먼트의하위엘리먼트.
SOAP 메시지 처리하는데 필요한 추가 정보를 기술한다. (인증 정보, 세션, 트랜잭션 등)
바디 엘리먼트에서 인코딩하기 힘든 데이터를 전달할 때 이용한다. (예를 들어, 압축메시지를 풀기 위한 알고리즘...)

 Header 요소를 사용하는 경우    1) 인증 (Authentication)
        : 수신받은 메시지를 사용하기 전 허가된 전송자가 송신한 메시지인지 확인해야 하는 경우 사용한다.
    2) 보안 (Sercurity degest information)
        : 메시지를 수신하는 입장에서는 수신메시지가 훼손되지 않은 상태임을 보장받고 싶어한다.
          이 경우, 전송자는 디지털 서명을 메시지 본문에 전송하고 digest 를 헤더에 포함해 보낸다.
    3) 정보 라우팅 (Routing information)
        : 메시지를 전송해야 할 곳이 많다면 헤더에 그 리스트 및 순서를 포함할 수 있다.
    4) 트랜잭션 (Transaction)
        : 메시지를 수신한 쪽에서 어떤 행위를 수행할 때 송신측의 트랜잭션 범주 내에 포함되어야 하는 경우 사용한다.
    5) 지불 정보 (Payment information)
        : 서비스 호출 단위로 그 사용료를 지불하는 경우라면 지불 정보 수집에 필요한 정보를 헤더에 포함시킬 수 있다.
Attribute
1)actor
-해당 Header블록을 누가 처리해야 하는지 지정.
-지정된 경우 : actor어트리뷰트에 지정된 노드가 SOAP Header블록을 처리
-지정되지 않은 경우 : SOAP메시지의 최종 수신자가 처리

2)mustUnderstand
-Header에 포함된 내용이 반드시 처리되어야 하는지 지정.
-값이 1 일 때 : 반드시 처리
-값이 0 일 때 : 처리하지 않아도 무방.

3)
예제
<env:Header xmlns:t="http://example.org/2001/06/tx">
<t:Transaction actor="http://example.org/2001/06/tx">
5
</t:Transaction>

<t:authentication mustUnderstand="1">
<t:userName>Tom</t:userName>
<t:password>12345678</t:password>
</t:authentication>
</env:Header>


<env:Body>

Web Service 를 이용하기 위한 실제 메시지 기술.
-서비스 호출, 응답에 관련된 내용
-웹 서비스 수행 후, 에러 있을 때 SOAP Fault 를 기술한다.
Attribute
1)encodingStyle : 인코딩타입지정.
-데이터타입이사용된엘리먼트의어트리뷰트로선언한다.
-SOAP 1.1 인코딩규칙 : http://schemas.xmlsoap.org/encoding/
-SOAP 1.2 인코딩규칙 : http://www.w3.org/2001/09/soap-encoding

예제
<soapenv:Body>
<ns1:example soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:ns1="http://classArrayTest.ex">
<in0 soapenc:arrayType="xsd:int[2]" xsi:type="soapenc:Array"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
<in0 href="#id0"/>
<in0 href="#id1"/>
</in0>
</ns1:example>

<multiRef id="id0" soapenc:root="0"
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="xsd:int" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">4</multiRef>
<multiRef id="id1" soapenc:root="0"
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="xsd:int" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">9</multiRef>
</soapenv:Body>


<env:Fault>

<env:Body> 엘리먼트의하위엘리먼트.
SOAP문서 처리 할 때 에러가 발생할 경우, 그 내용을 기술한다.


fault 엘리먼트의 서브 엘리먼트.
Sub Element
Description
<faultcode>
required. SOAP 스펙에 정의된 fault 코드. (아래 fault code 참조)
<faultstring>
required. 사람이 읽을 수 있는 fault에 대한 설명.
<faultactor>
optional. 누구에 의해 야기된 fault 인지에 대한 정보. 에러가 발생한 노드 기술.
<detail>
optional. Body 엘리먼트에 관계된 application specific 에러 정보를 기술.

작성 예제
<env:Body>
      <env:Fault>
<faultcode>MustUnderstand</faultcode>
<faultstring>One or more mandatory headers not understood</faultstring>
      </env:Fault></env:Body>


◦ fault code
Error
Description
VersionMismatch
요쳥 SOAP Envelope 엘리먼트의 네임스페이스가 잘못된 것을 발견한 경우.
MustUnderstand
mustUnderstand 애트리뷰트 값이 "1"로 셋팅된 (Header 엘리먼트의 자식) 엘리먼트를 처리하지 못했다.
Client
발신자의 요청 SOAP 메시지 정보가 불충분하여 처리할 수 없는 경우.
The message was incorrectly formed or contained incorrect information
Server
수신자(server)에서 SOAP 메시지를 처리하는 도중 오류가 발생한 경우.

<REFERENCE>
소설같은XML & XML Web Services웹서비스+기본개념+이해-pres_de_toi.ppt
http://www.w3schools.com/soap/soap_fault.asp

[웹 서비스] 3. SOAP 메시지 : http://blog.naver.com/vhwani/30021637109  (원 출처 : XML 웹 서비스 (신민철 저/프리렉) )

WS-Security 스펙문서 요점


WS-Security


스키마 및 스펙 :  OASIS Web Services Security UsernameToken Profile 1.0( http://docs.oasis-open.org/wss/2004/01)

ONVIF Core Specification v2.2


5.12 Security
The services defined in ONVIF shall be protected using either digest authentication according to [RFC 2617] or the WS-Security framework, depending on the security policy. The framework allows several different security models using tokens. The following tokens are currently defined:
     User name token profile [WS-UsernameToken]
     X.509 security token profile [WS-X.509Token]
    SAML token profile [WS-SAMLToken]
    Kerberos token profile [WS-KerberosToken]
    Rights Expression Language (REL) Token Profile [WS-RELToken]
A client should not simultaneously supply authentication credentials on both the HTTP level and the WS level.
If a server receives a web service request that contains authentication credentials on both the HTTP level and the WS level, it shall first validate the credentials provided on the HTTP layer. If this validation was successful, the server shall finally validate the authentication credentials provided on the WS layer.
Both digest authentication and the user name token profile give only a rudimentary level of security. In a system where security is important, it is recommended to always configure the device for TLS-based access (see 10.1). Digest authentication or the user name token message level security combined with TLS, with client and server authentication, protected transport level security give an acceptable level of security in many systems.

일차적으로 우리는 WS-Username Token만을 지원하기로 한다.

5.12.1.1 Default Access Policy
   By default, the device should enforce the following default access policy, which gives an acceptable level of security in many systems.
  Administrator Operator User Anonymous
PRE_AUTH X X X X
READ_SYSTEM X X X  
READ_SYSTEM_SECRET X      
WRITE_SYSTEM X      
UNRECOVERABLE X      
READ_MEDIA X X X  
ACTUATE X X    

5.12.2 Username token profile
   A client shall use both nonce and timestamps as defined in [WS-UsernameToken]. The server shall reject any Username Token not using both nonce and creation    timestamps.
5.12.2.1 Password derivation

Denote by UA an arbitrary user. Denote by P_UA the password value used by user UA to access the devices in the system. Furthermore, denote, by NEP, the end device service point reference value for a particular device in the system. Finally, denote by PE_UA the password equivalent used by the client to access a particular device in the system. The client should calculate the PE_UA as follows:

   PE_UA = base64(HMAC_SHA-1(UA+P_UA,NEP+”ONVIF password”)),

HMAC_SHA-1 is the algorithm specified in [RFC 2104] using SHA-1 [FIPS 180-2] as the underlying algorithm. The key value to use for the HMAC function is the user password, P_UA, directly mapped to its binary equivalent. Similar, the value PE_UA should be mapped to its ASCII equivalent before transmitting it to the device.
base64 is described in [RFC 3548], note that the result of the base64 operation is the actual password equivalent and shall be used as it is.

5.12.2.1.1 Example
Assume the following username and password is used by the client (ASCII): “user” and “VRxuNzpqrX”, i.e.,
UA = 75 73 65 72
P_UA = 56 52 78 75 4E 7A 70 71 72 58
Next, assume the device has the following device service end point reference value:
Urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6.

Then the password equivalent to be used will be then calculated as:
PE_UA = base64(HMAC_SHA-1(UA+ P_UA,NEP+”ONVIF password”)) =
base64(HMAC_SHA-1(75736572565278754E7A70717258,
F81D4fAE7DEC11D0A76500A0C91E6BF64F4E5649462070617373776F7264)) =
base64(16 E5 C5 A9 4D DE 8A 97 6D D7 2F 55 78 5F C2 D0 6B DA 53 4A)=
FuXFqU3eipdt1y9VeF/C0GvaU0o=

The resulting password equivalence “FuXFqU3eipdt1y9VeF/C0GvaU0o=” is the password that
shall be used by a client both for configuring the user credential on the particular device and
then also for accessing the device.

OASIS 200401 WSS Uername Token profile 1.0


2.2 Namespaces
Prefix NameSpace
S11 http://schemas.xmlsoap.org/soap/envelope/
S12 http://www.w3.org/2003/05/soap-envelope
wsse http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd
wsu http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd

3.1 Usernames and Passwords
Having a type of wsse:PasswordText, wsse:PasswordDigest merely implies that the information held in the password is “in the clear”, as opposed to holding a “digest” of the information.
   Password_Digest = Base64 ( SHA-1 ( nonce + created + password ) )

The following illustrates the XML syntax of this element:

  1. <wsse:UsernameToken wsu:Id="Example-1">
       <wsse:Username> ... </wsse:Username>
       <wsse:Password Type="..."> ... </wsse:Password>
       <wsse:Nonce EncodingType="..."> ... </wsse:Nonce>
       <wsu:Created> ... </wsu:Created>
    </wsse:UsernameToken>

The following describes the attributes and elements listed in the example above:

 /wsse:UsernameToken/wsse:Password
This optional element provides password information (or equivalent such as a hash). It is RECOMMENDED that this element only be passed when a secure transport (e.g.
HTTP/S) is being used or if the token itself is being encrypted.

/wsse:UsernameToken/wsse:Password/@Type
This optional URI attribute specifies the type of password being provided. The table below identifies the pre-defined types (note that the URI fragments are relative to the URI
for this specification).

         #PasswordText (default) The actual password for the username, the password hash, or derived password or S/KEY.
                                                       This type should be used when hashed password equivalents that do not rely on a nonce or creation time are used, or when a digest algorithm other than SHA1 is used.
         #PasswordDigest The digest of the password (and optionally nonce and/or creation timestame) for the username using the algorithm described above.

/wsse:UsernameToken/wsse:Password/@{any}
This is an extensibility mechanism to allow additional attributes, based on schemas, to be added to the element.

/wsse:UsernameToken/wsse:Nonce
This optional element specifies a cryptographically random nonce. Each message including a <wsse:Nonce> element MUST use a new nonce value in order for web
service producers to detect replay attacks.

/wsse:UsernameToken/wsse:Nonce/@EncodingType
This optional attribute URI specifies the encoding type of the nonce (see the definition of <wsse:BinarySecurityToken> for valid values). If this attribute isn't specified then
the default of Base64 encoding is used.

/wsse:UsernameToken/wsu:Created
The optional <wsu:Created> element specifies a timestamp used to indic


The following example illustrates the use of this element. In this example the password is sent as clear text and therefore this message should be sent over a confidential channel:

  1.    <S11:Envelope xmlns:S11="..." xmlns:wsse="...">
       <S11:Header>
       ...
       <wsse:Security>
       <wsse:UsernameToken>
       <wsse:Username>Zoe</wsse:Username>
       <wsse:Password>IloveDogs</wsse:Password>
       </wsse:UsernameToken>
       </wsse:Security>
       ...
       </S11:Header>
       ...
       </S11:Envelope>

The following example illustrates using a digest of the password along with a nonce and a creation timestamp:

  1.    <S11:Envelope xmlns:S11="..." xmlns:wsse="..." xmlns:wsu= "...">
       <S11:Header>
       ...
       <wsse:Security>
       <wsse:UsernameToken>
       <wsse:Username>NNK</wsse:Username>
       <wsse:Password Type="...#PasswordDigest">
       weYI3nXd8LjMNVksCKFV8t3rgHh3Rw==
       </wsse:Password>
       <wsse:Nonce>WScqanjCEAC4mQoBE07sAQ==</wsse:Nonce>
       <wsu:Created>2003-07-16T01:24:32Z</wsu:Created>
       </wsse:UsernameToken>
       </wsse:Security>
       ...
       </S11:Header>
       ...
       </S11:Envelope>
  2.  





RSA 및 암호화


RSA 및 암호화


RSA - http://blog.naver.com/nttkak/20130244201
Kerberos - http://blog.naver.com/nttkak/20130244201
공개키 인증서 구조 - http://blog.naver.com/nttkak/20130244201


출처: 로그님의 노트(http://hiddenviewer.springnote.com)
HMAC
송신자와 수신자가 비밀 키를 공유할 경우 서로 주고받은 메시지의 훼손여부를 확인하는데 사용하는 메시지 인증방식이다.
송신자가 원데이터의 해시값을 계산하여 원데이터와 해시값 모두 단일 메시지로 보내면, 수신자가 받은 메시지에 대해 해시값을 
다시 계산하여 계산된 HMAC과  전송된  HMAC의 일치여부를 확인한다. 


SHA-1(Secure Hash Algorithm)
 미국 정부에서 공개한 암호화 해시 알고리즘으로, 임의 길이의 문자열에서 160비트 해시값을 생성
 SHS 및 Secure Hash Standard라고도 함.


HMACSHA1
SHA1 해시함수를 사용하여, HMAC 을 구현하는 키 지정 해시 알고리즘이다. 다음과 같은 HMAC 프로세스를 따른다.  
1) 비밀 키를 메시지 데이터와 혼합한다
2) 해시 함수를 통해 결과를 해시한다
3) 해시값을 비밀키와 다시 혼합한다 
4) 그런 다음 해시함수를 다시 적용한다 


Base64 Encoding이란? 


Base64는 바이너리 데이터를  64진수 표현으로 변환하여 아스키 문자열로 인코딩하는 방법이다.
Bae64 encoding은 텍스트 데이터를 전송하기 위해 설계된 매체상에서 바이너리 데이터를 전송하거나 
저장하기 위해 사용되는 방식이다. 전송중에 데이터가 변경되지 않고, 파괴되지 않았음을 보장해준다. 
MIME를 사용하는 이메일을 포함한 많은 애플리케이션에서 사용된다.


3바이트 단위로 인코딩을 수행하며, 3으로 나누어 떨어지지 않는 데이터는 =문자로 패딩바이트를 삽입한다. 
(즉 3으로 나누어 떨어지지 않으면, =문자 1개, 또는 2개가 패딩된다.)
3바이트 데이터는 가장 상위비트부터 64진수로 표현하기 위해 6 비트씩 구분하여, 4개의 아스키 문자로 변환한다.
이 때 사용하는 64개의 문자는  A~Z (26개) , a~z(26개), 0~9(10개), +. / (2개) 이다.  0은   A로 인코딩되며,
63은 /로 인코딩이 된다. Base64Encoding 된 데이터는 원래 데이터보다 약 37% 증가한다. 

다음은 name 이라는 데이터가 Base64 Encoding 된후, 결과를 나타낸다. 

스크린샷_2010-10-04_오후_9.59.27.png
먼저 nam 이 가장 상위비트부터 6개의 비트씩 추출이 되어진다. e는 6개의 비트가 추출되어 인코딩이 되면
2개의 비트가 남게되는데, 여기에 4개의 0비트를 패딩하여 인코딩이 된다. 3바이트의 데이터는 인코딩된 
4개의 문자로 출력되는데,  위에서는 ZQ에 2개의 = 문자가 패딩이 된다. 

Base64 인코딩된 결과를 디코딩 할 때는 반대의 과정을 거치면 된다. 
인코딩 결과에서,  4개의 문자로부터 6개의 비트씩 추출하여 3바이트로 조합을 하여 한 바이트를 온전한 데이터로
읽으면 된다. 나누어 떨어지지 않는 문자는 =문자가 2개이면, 1개의 바이트(8비트)만을 추출하고 =문자가 1개이면,  
2개의 바이트(8비트씩 2개)를 추출하여 읽어내면 디코딩을 수행할 수 가 있다. 

MD5(Message-Digest algorithm 5)
임의의 길이의 메시지를 입력받아, 128비트 짜리 고정길이의 출력값을 내는 암호화 해시함수.
역함수가 존재하지 않는 함수이다. 역함수가 존재하지 않는 함수라는 것은, 동일한 키를 알지 못한다면,
해싱된 결과로 키를 유추해 낼수 없다는 의미이다.  주로 파일의 내용이 변경됐지는 여부를 검사하기 위해
사용된다고 한다.

WS-Security using gSOAP


WS-Security using gSOAP


gSOAP plug-in을 이용하여 ONVIF device service 에 WS-Security를 추가하는 방법을 설명한다.

  1. /gSOAP/bin/share/gsoap/WS/typemap.dat 에서 아래 추가 후 ONVIF-typemap.dat로 수정.
              tt = "http://www.onvif.org/ver10/schema"
                tds = "http://www.onvif.org/ver10/device/wsdl"
                trt = "http://www.onvif.org/ver10/media/wsdl"
                tev = "http://www.onvif.org/ver10/events/wsdl"
                ter = "http://www.onvif.org/ver10/error"
                dn = "http://www.onvif.org/ver10/network/wsdl"
                tptz = "http://www.onvif.org/ver20/ptz/wsdl"
                tima = "http://www.onvif.org/ver20/imaging/wsdl"
                tns1 = "http://www.onvif.org/ver10/topics"
                wsdl = "http://schemas.xmlsoap.org/wsdl/"
                wsoap12 = "http://schemas.xmlsoap.org/wsdl/soap12/"
                http = "http://schemas.xmlsoap.org/wsdl/http/"
                soapenc = "http://www.w3.org/2003/05/soap-encoding"
                soapenv = "http://www.w3.org/2003/05/soap-envelope"
                xs = "http://www.w3.org/2001/XMLSchema"
                xsi = "http://www.w3.org/2001/XMLSchema-instance"
                d = "http://schemas.xmlsoap.org/ws/2005/04/discovery"
                wsadis = "http://schemas.xmlsoap.org/ws/2004/08/addressing"
                wstop = "ttp://docs.oasis-open.org/wsn/t-1"
                wsnt = "http://docs.oasis-open.org/wsn/b-2"
                xop = "http://www.w3.org/2004/08/xop/include"
              
                wsrf_bf2 = "http://docs.oasis-open.org/wsrf/bf-2"
                wsrf_rw2 = "http://docs.oasis-open.org/wsrf/rw-2"
                wsrf_r2 = "http://docs.oasis-open.org/wsrf/r-2"
                wstop = "http://docs.oasis-open.org/wsn/t-1"
                wsnt = "http://docs.oasis-open.org/wsn/b-2"
                xop = "http://www.w3.org/2004/08/xop/include"

  2. wsdl2h -c -nonvif -Nonvif -t wsdl/ONVIF-typemap.dat -o wsdl/devicemgmt_gsoap.h wsdl/devicemgmt.wsdl

  3. devicemgmt_gsoap.h 수정
    #import "wsse.h" 추가.

  4. soapcpp2  -L -x  -S -c -I../../gSOAP/bin/share/gsoap/import/ wsdl/devicemgmt_gsoap.h

  5. 인증 처리절차 추가
    1. int security_check(struct soap *soap)
      {

          const char *username = soap_wsse_get_Username(soap);

          if(username)
          {
              sprintf(debug_buff,"request user:%s", username);
              Debug_cgi(debug_buff);
          }

        if (soap_wsse_verify_Timestamp(soap)
         || soap_wsse_verify_Password(soap, "password"))
        {
            Debug_cgi("failed to soap_wsse_verify_Password ");
            soap_wsse_delete_Security(soap);

            return soap->error;
        }


        soap_wsse_delete_Security(soap);

        Debug_cgi("success to soap_wsse_verify_Password");
        return SOAP_OK;
      }
      SOAP_FMAC5 int SOAP_FMAC6 soap_serve_request(struct soap *soap)
      {
          soap_peek_element(soap);
          // 클라이언트가 시간을 동기화할 수 있도록 허용하여 인증만료로 인한 인증실패를 피한다.
          if (soap_match_tag(soap, soap->tag, "tds:GetSystemDateAndTime"))
          {
              if ( security_check(soap) != SOAP_OK) return soap->error;
          }
         .....
         ....


  6. compile
참조 : gSOAP/gsoap-2.8/gsoap/doc/wsse/html/wsse.html
  1. include ../Rules.make

    GCC_PATH=/usr/arm/mv_pro_5.0.0/montavista/pro/devkit/arm/v5t_le/bin
    CROSS:=$(GCC_PATH)/arm_v5t_le-
    CC:=$(CROSS)gcc
    AR:=$(CROSS)ar

    RELTARGET := services
    INC_PATH= -I$(BASE_DIR)/gSOAP/bin/include -I$(LIB_PATH)/include
    CFLAGS := -Wall -g $(INC_PATH)  -DWITH_DOM -DWITH_OPENSSL

    SRC_COMMON = soapC.c soapServer.c

    SRCS    :=  $(SRC_COMMON) devicemgmt_service.c  wsaapi.c wsseapi.c threads.c dom.c smdevp.c mecevp.c
    OBJS    :=  $(SRCS:%.c=%.o)

    LIBS    =    -L$(BASE_DIR)/gSOAP/bin/lib -lgsoapssl  -lssl -lcrypto -lz -L$(LIB_PATH)/bin -lnettool

    .PHONY : clean all

    all:     release

    release:    $(RELTARGET)

    $(RELTARGET): $(OBJS)
        $(CC) $(CFLAGS) -o $@ $^ $(LIBS)

    install: release
        install $(RELTARGET) $(TARGET_CGI_PATH)

    clean:
        @rm -f $(TARGET)
        @rm -f $(OBJS)
        @rm -f $(RELTARGET)

7. 문제해결과정
            1). 문제: 인증실패시 wsseapi.c에서 soap_wsse_sender_fault_subcode() 호출하면  soap protocol error메시지가 'Plugin registry error'
               원인: 메시지 처럼 WSA plug-in 을 등록해야한다.
               해결: 플러그인 등록 함수 추가
                         soap_register_plugin(&soap, soap_wsa);
                        soap_register_plugin_arg(&soap, soap_wsse, token_handler);

            2). 문졔: CGI라 디버깅 하기가 어렵다
               해결: soap 라이브러리 컴파일시 -enalbe-debug
                    추가, 컴파일시 -DDEBUG 플래그추가 , soap_set_test_logfile() 함수 등록.

            3). 문제: __tds__GetSystemDateAndTime() 함수에서 인증이 실패된다.
               원인: 클라이언트(GMT)와 서버간(로컬시간)의 시간이 달라서 인증만료로 에러된다.
               해결: __tds__GetSystemDateAndTime() 는 인증을 하지않도록 하여 클라이언트가 시간을 동기화 하도록한다.

            4). 문제: __tds__GetHostname() 수신시 soap protocol error 메시지가 '502 bad gateway'
               원인: HostnameInformation->Extension를  초기화 하지않음.
               해결: HostnameInformation->Extension=NULL;

            5). 문제: security 인증 시퀀스를 모든 메소드에 넣으면 손이 많이 가고 지저분하다.
               해결: soap_serve_request()에서 인증을 하고 각 메소드를 처리하도록 수정.

WS-DISCOVERY스펙문서 요점

WS-DISCOVERY

출처 : http://docs.oasis-open.org/ws-dd/discovery/1.1/os/wsdd-discovery-1.1-spec-os.html
WS-Addressing 1.0 홈페이지 : http://www.w3.org/2005/08/addressing

What is WS-DISCOVERY

This specification defines a discovery protocol to locate services. The primary scenario for discovery is a client searching for one or more target services. The protocol defines two modes of operation, an ad hoc mode and a managed mode. In an ad hoc mode, to find a target service by the type of the target service, a scope in which the target service resides, or both, a client sends a probe message to a multicast group; target services that match the probe send a response directly to the client. To locate a target service by name, a client sends a resolution request message to the same multicast group, and again, the target service that matches sends a response directly to the client.


1. Operational Modes

1) Ad hoc Mode


In an ad hoc mode discovery messages are sent multicast and response messages are sent unicast. Figure 1 depicts the message exchanges between a Target Service and a Client operating in an ad hoc mode.

me

Figure 1 : Message Exchanges in an ad hoc mode.

A Target Service sends a multicast Hello message (1) when it joins a network (see Section 4.1.1 Target Service).
A Client listens for multicast Hello messages (see Section 4.1.2 Client). A Client sends a multicast Probe message (2) to locate Target Services (see Section 5.2.1 Client).
If a Target Service matches the Probe it responds with a unicast Probe Match (PM) message (3) (see Section 5.3.1 Target Service).
Other matching Target Services MAY also send unicast Probe Match. A Target Service MAY also accept and respond to unicast Probe messages sent to its transport address(es) (see Section 5.2.2 Target Service).
A Client sends a multicast Resolve message (4) to locate a particular Target Service (see Section 6.2.1 Client).
If a Target Service matches the Resolve it responds with a unicast Resolve Match (RM) message (5) (see Section 6.3.1 Target Service).
A Target Service makes an effort to send a multicast Bye message (6) when it leaves a network (see Section 4.2.1 Target Service).
A Client listens for multicast Bye messages (see 4.2.2 Client).

Figure 2 depicts the message exchanges in an ad hoc mode when a Discovery Proxy is present on the network.

vml_5.emz

Figure 2: Message exchanges in an ad hoc mode in the presence of a Discovery Proxy.

A Target Service sends multicast Hello and Bye (4) and responds to matching multicast Probe and Resolve (5,7).
A Client listens for multicast Hello and Bye (4) and sends multicast Probe and Resolve (5).

A Discovery Proxy is also a Target Service of a well known d:DiscoveryProxy type and sends a multicast Hello message annoucing its arrival on the network and a multicast Bye message annoucing its departure from the network (1).
It responds to the matching Probe and Resolve for itself (2), with a Probe Match (PM) and a Resolve Match (RM) respectively (3).
If a Discovery Proxy is configured to reduce multicast traffic on the network, it listens for multicast Hello and Bye from other Target Services (4) and store/update information for corresponding Target Services (see Section 4.1.3 Discovery Proxy and 4.2.3 Discovery Proxy).
It responds to the multicast Probe and Resolve for other Target Services (5), with a Hello message (6) (see Section 4.1.3 Discovery Proxy), indicating the Client to switch to managed mode and to send unicast Probe and Resolve (see Section 2.2.2 Managed Mode).

2) Managed Mode


In a managed mode discovery messages are sent unicast to a Discovery Proxy. Figure 3 depicts the message exchanges between a Client, a Target Service and a Discovery Proxy in a managed mode.

A Target Service sends a unicast Hello message (1) to a Discovery Proxy when it joins a network (see Section 4.1.1 Target Service).
A Client sends a unicast Probe request (2) to a Discovery Proxy to locate services (see Section 5.2.1 Client).
A Discovery Proxy responds to a unicast Probe request with a Probe Match response (3) containing matching Target Services, if any (see Section 5.3.2 Discovery Proxy).
A Client sends a unicast Resolve request (4) to a Discovery Proxy to locate a particular Target Service (see Section 6.2.1 Client).
A Discovery Proxy respond to a unicast Resolve request with a Resolve Match response (4) containing the matching Target Service, if any (see Section 6.3.2 Discovery Proxy).
A Target Service makes an effort to send a unicast Bye message (6) to a Discovery Proxy when it leaves a network (see Section 4.2.1 Target Service).

vml_3.emz

Figure 3: Message exchanges in a managed mode.

To operate in a managed mode a Target Service and a Client need an Endpoint Reference of the Discovery Proxy. A Target Service or a Client can acquire this information from a number of ways including, but not limited to explicit configuration, explicit Probe for Discovery Proxy, DNS or DHCP, specifics of which are outside the scope of this specification. One such method that reduces the traffic in an ad hoc network and allows Client to dynamically switch to managed mode is described below.

4) Dynamic Mode Switching

To limit multicast traffic, Clients MAY be configured to dynamically switch from an ad hoc mode to a managed mode and vice versa, depicted in Figure 4.


Figure 4: State transitions of a Client configured to dynamically switch operational modes.

By default, a Client assumes that no Discovery Proxy (DP) is available because a Discovery Proxy is an optional component and may not be present on the network. The Client operates in an ad hoc mode and listens for multicast Hello and Bye announcements, sends multicast Probe and/or Resolve messages, and listens for Probe Match and/or Resolve Match messages (see Section 2.2.1Ad hoc Mode).

However, if one or more DP that provide multicast suppression are available, those DP send a unicast Hello that contains information about an endpoint that implements a well-known "discovery proxy" type d:DiscoveryProxyin managed mode in response to any multicast Probe or Resolve. As depicted in Figure 4, Clients listen for this signal that one or more DP are available, and for subsequent searches switch to a managed mode and instead of multicast, send Probe and Resolve messages unicast to one or more DP they trust whilst ignoring multicast Hello and Bye from Target Services.

In a managed mode, a Client communicates with a DP as described in Section 2.2.2 Managed Mode; using the transport information contained in the DP Hello; this is typically indicated by the scheme of a transport URI, e.g., "http:" (HTTP), "soap.udp:" (UDP [SOAP/UDP]), or other.

If the DP is unresponsive after DP_MAX_TIMEOUT, or if the Client finds the responses from the DP unsatisfactory, the Client reverts to using the multicast messages specified herein.

4) Example


able 2 lists an example Probe message sent multicast by a Client searching for a printer in an ad hoc mode.
Table 2: Example Probe sent multicast in an ad hoc mode.
(01) <s:Envelope
(02)     xmlns:a="http://www.w3.org/2005/08/addressing"
(03)     xmlns:d="http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01"
(04)     xmlns:i="http://printer.example.org/2003/imaging"
(05)     xmlns:s="http://www.w3.org/2003/05/soap-envelope" >
(06)   <s:Header>
(07)     <a:Action>
(08)       http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01/Probe
(09)     </a:Action>
(10)     <a:MessageID>
(11)       urn:uuid:0a6dc791-2be6-4991-9af1-454778a1917a
(12)     </a:MessageID>
(13)     <a:To>urn:docs-oasis-open-org:ws-dd:ns:discovery:2009:01</a:To>
(14)   </s:Header>
(15)   <s:Body>
(16)     <d:Probe>
(17)       <d:Types>i:PrintBasic</d:Types>
(18)       <d:Scopes
(19)    MatchBy="http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01/ldap" >
(20)         ldap:///ou=engineering,o=examplecom,c=us
(21)       </d:Scopes>
(22)     </d:Probe>
(23)   </s:Body>
(24) </s:Envelope>
(25)  
Lines (07-09) in Table 2 indicate the message is a Probe, and Line (13) indicates it is being sent to a well-known address [RFC 2141].
Because there is no explicit ReplyTo SOAP header block [WS-Addressing], any response to this Probe message will be sent as a UDP packet to the source IP address and port of the Probe transport header [SOAP/UDP].
Lines (17-21) specify two constraints on the Probe: Line (17) constrains responses to Target Services that implement a basic print Type; Lines (18-21) constrain responses to Target Services in the Scope for an engineering department. Only Target Services that satisfy both of these constraints will respond. Though both constraints are included in this example of a Probe, they are OPTIONAL.
Table 3 lists an example Probe Match message sent in response to the Probe in Table 2.
Table 3: Example ProbeMatch sent in response to the ad hoc Probe in Table 2.
(01) <s:Envelope
(02)   xmlns:a="http://www.w3.org/2005/08/addressing"
(03)   xmlns:d="http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01"
(04)   xmlns:i="http://printer.example.org/2003/imaging"
(05)   xmlns:s="http://www.w3.org/2003/05/soap-envelope" >
(06)   <s:Header>
(07)     <a:Action>
(08)       http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01/ProbeMatches
(09)     </a:Action>
(10)     <a:MessageID>
(11)       urn:uuid:e32e6863-ea5e-4ee4-997e-69539d1ff2cc
(12)     </a:MessageID>
(13)     <a:RelatesTo>
(14)       urn:uuid:0a6dc791-2be6-4991-9af1-454778a1917a
(15)     </a:RelatesTo>
(16)     <a:To>
(17)     http://www.w3.org/2005/08/addressing/anonymous
(18)     </a:To>
(19)     <d:AppSequence InstanceId="1077004800" MessageNumber="2" />
(20)   </s:Header>
(21)   <s:Body>
(22)     <d:ProbeMatches>
(23)       <d:ProbeMatch>
(24)         <a:EndpointReference>
(25)           <a:Address>
(26)             urn:uuid:98190dc2-0890-4ef8-ac9a-5940995e6119
(27)           </a:Address>
(28)         </a:EndpointReference>
(29)         <d:Types>i:PrintBasic i:PrintAdvanced</d:Types>
(30)         <d:Scopes>
(31)           ldap:///ou=engineering,o=examplecom,c=us
(32)           ldap:///ou=floor1,ou=b42,ou=anytown,o=examplecom,c=us
(33)           http://itdept/imaging/deployment/2004-12-04
(34)         </d:Scopes>
(35)         <d:XAddrs>http://prn-example/PRN42/b42-1668-a</d:XAddrs>
(36)         <d:MetadataVersion>75965</d:MetadataVersion>
(37)       </d:ProbeMatch>
(38)     </d:ProbeMatches>
(39)   </s:Body>
(40) </s:Envelope>
(41)  
Lines (07-09) in Table 3 indicate this message is a Probe Match, and Lines (13-15) indicate that it is a response to the Probe in Table 2. Because the Probe did not have an explicit ReplyTo SOAP header block, Lines (16-18) indicate that the response was sent to the source IP address and port of the transport header of the Probe. Line (19) contains an instance identifier as well as a message number; this information allows the receiver to reorder discovery messages received from a Target Service.
Lines (23-37) describe a single Target Service.
Lines (24-28) contain the stable, unique identifier for the Target Service that is constant across network interfaces, transport addresses, and IPv4/v6. In this case, the value is a UUID based URN [RFC 4122] scheme URI, but it can be a transport URI (like the one in Line 35) if it meets stability and uniqueness requirements.
Line (29) lists the Types (see, e.g., [WSDL 1.1]) implemented by the Target Service, in this example, a basic print type that matched the Probe as well as an advanced print type.
Lines (30-34) list three administrative Scopes, one that matched the Probe (Line 31), one that is specific to a particular physical location (Line 32), and one that includes data useful when switching over to new infrastructure (Line 33). As in this case, the Scopes can be a heterogeneous collection of deployment-related information.
Line (35) indicates the transport addresses where the Target Service can be reached; in this case, a single HTTP transport address.
Line (36) contains the version of the metadata for the Target Service; as explained below, this version is incremented if there is a change in the metadata for the Target Service (including Lines 29-34).

5)Protocol Assignments


5.1) Ad hoc mode over IP multicast

If IP multicast is used to send multicast messages described herein, they MUST be sent using the following assignments:


  • DISCOVERY_PORT: port 3702 [IANA]


  • IPv4 multicast address: 239.255.255.250


  • IPv6 multicast address: FF02::C (link-local scope)

Other address bindings MAY be defined but are beyond the scope of this specification.

Messages sent over UDP MUST be sent using SOAP over UDP [SOAP/UDP]. To compensate for possible UDP unreliability, senders MUST use the example transmission algorithm in Appendix I of SOAP over UDP. In order to improve interoperability and network efficiency use of SOAP 1.2 protocol [SOAP 1.2] is RECOMMENDED.

5.2) Managed mode over HTTP

If the messages described herein are sent unicast using HTTP protocol, they MUST be sent using SOAP HTTP Binding as defined in Section 7 of SOAP 1.2 Part 2 [SOAP 1.2 Part 2].