본문 바로가기

IT

암호화통신프로토콜 TLS1.2필수 시대의 외부연동을 위한 WinHTTP사용설정, CDO, XMLHttp 그동안 수고 많았다.

2018년6월시점의 내용입니다. ( 네이버 블로그로부터 이동 중입니다.)


작년에 결제대행시스템회사로 부터 "TLS1.2로 암호화통신의 프로토콜이 업데이트되며 이를 지원하지않는 브라우저는 결제처리를 할 수 없게 됩니다."란 연락에 유저가 결제대행시스템의 페이지로 이동해 카드정보를 입력하는 부분만 생각하고 유저에게 공지하는것으로만 대응 했었는데.. 안일했습니다.

ClassicASP(VBScript)로 매달 연장결제를 자동으로 처리하는 모듈이 있었습니다...

CDO를 이용해서 결제회사의 API에 request하고 그 결과를 response받는데 이 부분에 문제가 발생했습니다.


잠깐 CDO를 이용해서 외부연동하게 된 이유입니다.

보통 XMLHttp를 이용합니다만

--------------------

GET

set xmlhttp = Server.CreateObject("Microsoft.XMLHTTP")

xmlhttp.Open "GET", "연동할URL", False

xmlhttp.Send

result=xmlhttp.responseText

set xmlhttp=Nothing


POST

set xmlhttp = Server.CreateObject("Microsoft.XMLHTTP")

xmlhttp.Open "POST", "연동할URL", False

xmlhttp.Send "A=aaa&B=bbb"

result=xmlhttp.responseText

set xmlhttp=Nothing

--------------------

단점이 기본적으로 멀티바이트문자(한글,일본어 등)가 깨집니다.

ADODB.Stream을 이용해 Charset의 변경이 가능한 것을 나중에 알게되었습니다만..번거롭습니다.

--------------------

set xmlhttp = Server.CreateObject("Microsoft.XMLHTTP")

xmlhttp.Open "GET", "연동할URL", False

xmlhttp.Send


set as=Server.CreateObject("ADODB.Stream")

set as=Server.CreateObject("ADODB.Stream")

as.Open

as.Position=0

as.Type=1

as.Write xmlhttp.responseBody

as.Position=0

as.Type=2

as.Charset="Shift_JIS"

result=as.ReadText

as.Close

set as=Nothing


set xmlhttp=Nothing

--------------------

메일을 발송할때 CDO.Message를 이용하는데 HTML문서를 읽어서 메일에 포함시키는 CreateMHTMLBody메서드가 있습니다.

파일은 물론 URL지정도 가능합니다. 이것을 이용하면 기본적으로 HTML의 헤더정보를 읽어서 인코딩처리하는지 깨지지 않습니다.

--------------------

set objCDO = Server.CreateObject("cdo.message")

objCDO.CreateMHTMLBody "연동할URL",31

result=objCDO.HTMLBody

set objCDO = nothing

--------------------

거기에 소스도 짧고 잘 작동하는 이유로 CDO를 이용해 외부연동을 하고 있었습니다.


이것이 "지정된 리소스를 찾을 수 없습니다. (指定されたリソースは見つかりません。)"....에러를 출력합니다.

다른 URL로 테스트를 해보면 문제가 없습니다.

'아 TLS1.2..'

'백그라운드로 접속을 하지만 CDO나 XMLHttp도 역시나 클라이언트(브라우저)구나.'


CDO나 XMLHttp에 TLS관련 옵션이 있을까 조사를 해봤는데, 기본적으로 서버의 버전을 따르는것 같고,

Windows Server 2003, IIS6.0의 환경에서 ClassicASP로 TLS1.2접속을 하는 정보는 없습니다.


오래된 자료입니다만 2003서버는 서포트하지않는것으로 나옵니다.

https://blogs.msdn.microsoft.com/kaushal/2011/10/02/support-for-ssltls-protocols-on-windows/


일단 지원으로 나오는 Windows Server 2008에 매달 자동연장결제하는 모듈만 이동했습니다... 안됩니다...지원한다더니.

좀더 조사를 해봤습니다.


〇 기본적으로 유효상태

△ 추가설정이 필요.


Windows Server 2008는 2017년 여름 KB4019276 패치로 대응가능하게 되었다고합니다.

https://blogs.technet.microsoft.com/jpsecurity/2017/07/11/tlsmigration/


그런데 패치했다고 기본유효상태가 아니라 레지스트리를 갱신해야합니다.

https://support.microsoft.com/ja-jp/help/4019276/update-to-add-support-for-tls-1-1-and-tls-1-2-in-windows

TLS 1.2프로토콜등록(레지스트리등록)


1.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols의 밑에 「TLS 1.2」키 추가.

TLS와 1.2사이에 공백을 주어야합니다.


2.추가한 TLS 1.2안에 키 두개 추가

Client, Server


3.추가한 Client, Server안에 각각 DWORD(32비트) 두개 추가

DisabledByDefault 16진수 0

Enabled 16진수 1


4. 재부팅


이렇게 레지스트리를 등록해서 TLS1.2를 유효화 했습니다.

안됩니다..... 더 조사를 해봅니다.

어플리케이션에서 기본적으로 사용할 암호화통신 프로토콜을 설정해야합니다.

역시 레지스트리갱신이 필요합니다.

그런데 CDO나 XMLHttp의 설정정보가 아니고 WinHttp입니다.


WinHttp 기본 암호화통신 프로토콜설정


1. 레지스트리 키 추가

32비트

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp

64비트

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp


IIS에서 32비트 어플리케이션으로 설정에 사용중이어서 32비트만 설정했더니 작동하지 않았습니다.

서버가 64비트이니 64비트를 설정해야하는것 같습니다. 암튼 두개 다 했습니다.


2. 추가한 WinHttp 안에 DWORD(32비트) 추가

DefaultSecureProtocols 16진수 00000800


이렇게 하고 WinHTTP로 소스변경하고 나니 잘 작동합니다.. 휴우 급한 불을 껐습니다.

--------------------

GET

set winhttp = Server.CreateObject("WinHTTP.WinHTTPRequest.5.1")

winhttp.Open "GET", "연동할URL", False

winhttp.Send

result=winhttp.responseText

set winhttp=Nothing

--------------------

CDO, xmlHTTP야 수고했다..(애내들도 레지스트리로 뭔가 될것 같기도한데..재부팅해가면서..테스트하기는...)

작년부터 TLS1.2나 상시SSL의 이야기들을 많이 접했었습니다만, 그냥 흐름에 맡기면 알아서 처리되겠지하고 안일했었나 후회하고 있습니다. 아직 Windows Server 2003안에 레거시시스템들도 많이 남아있고..크롬68(Chrome 68) 브라우저 나오는게 두렵고 불안하긴 합니다만 보안을 위한 일이니 늦었지만 열심히 대응해야겠습니다. 7월은 많이 바쁠것 같습니다.

반응형