2019. 4. 3. 14:57

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

귀찮아서 레지스트리 키를 첨부.

Windows 2012 R2 버전인 웹서버.

 

TLS_1.2_A.reg
0.00MB
32_winhttp.reg
0.00MB
64_winhttp.reg
0.00MB

 

원본

https://namwhis.blog.me/221309891315

 

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

작년에 결제대행시스템회사로 부터 "TLS1.2로 암호화통신의 프로토콜이 업데이트되며 이를 지원하지않는...

blog.naver.com

 

작년에 결제대행시스템회사로 부터 "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서버는 서포트하지않는것으로 나옵니다.

Windows OS Version

SSL 2.0

SSL 3.0

TLS 1.0

TLS 1.1

TLS 1.2

Windows XP & Windows Server 2003

X

X

Windows Vista & Windows Server 2008

Windows 7 & Windows Server 2008 R2

Windows 8 & Windows Server 2012

Windows 8.1 & Windows Server 2012 R2

Windows 10 & Windows Server 2016

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

Support for SSL/TLS protocols on Windows

blogs.msdn.microsoft.com

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

Windows OS

SSLv2

SSLv3

TLS 1.0

TLS 1.1

TLS 1.2

Windows Server 2008

Windows 7
Windows Server 2008 R2

Windows Serer 2012

Windows 8.1
Windows Server 2012 R2

Windows 10

Windows Server 2016

×

〇 기본적으로 유효상태
△ 추가설정이 필요. 

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

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

[IT 管理者向け] TLS 1.2 への移行を推奨しています

こんにちは、垣内由梨香です   データを暗号化し安全にやり取りを行う Transport Layer Security (TLS)。TLS は利用しているが、詳細なバージョンまでは把握してない、そんな方も多いのではないでしょうか?暗号プロトコルは「使ってさえいれば安全」ではありません。現在の脅威に対応できるバージョンのみを利用しリスクを下げることが重要です。 マイクロソフトでは、より安全な TLS 1.2 へ移行していくことを推奨しています。

blogs.technet.microsoft.com

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

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

Windows Server 2008 SP、Windows Embedded POSReady 2009、および Windows Embedded Standard 2009 に TLS 1.1 および TLS 1.2 のサポートを追加する更新プログラム

概要 Windows Server 2008 Service Pack 2 (SP2)、Windows Embedded POSReady 2009、および Windows Embedded Standard 2009 に TLS 1.1 および TLS 1.2 のサポートを追加する更新プログラムがリリースされています。  この更新プログラムの入手方法 方法 1: Windows Update Windows Server 2008 SP2、Windows Embedded POSReady 2009、および Windows Embedded Standard 2009 用のこの更新

support.microsoft.com

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월은 많이 바쁠것 같습니다.

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