성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
Digital Stories
방명록
최근 덧글
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
[정성태] 저렇게 조각 코드 말고, 실제로 재현이 되는 예제 프로젝트를 압...
[정성태] Modules 창(Ctrl+Shift+U)을 띄워서, 해당 Op...
[정성태] 만드실 수 있습니다. 단지, Unity 엔진 내의 스크립트와 W...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
기타
생각의 전환
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>JetBrains Omea Reader에서 TLS 1.2 모드의 https 서버로부터 RSS 구독이 안 되는 경우 해결 방법</h1> <p> 언젠가부터, <a target='tab' href='https://www.jetbrains.com/omea/reader/'>Omea Reader</a>로는 구독이 안 되는 RSS들이 나오기 시작했습니다. 일례로, "https://shinyoungjin.life/rss.xml" RSS의 경우 구독을 시도하면,<br /> <br /> <img alt='https_tls12_1.png' src='/SysWebRes/bbs/https_tls12_1.png' /><br /> <br /> "The underlying connection was closed: An unexpected error occurred on a send." 오류가 발생했는데요, 예전에는 그냥... 뭔가 새로운 RSS 포맷에 대한 지원을 하지 못해서 그런가 보다 했는데요, 아래의 사건을 겪게 되면서,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C# - WebClient로 https 호출 시 "The request was aborted: Could not create SSL/TLS secure channel" 예외 발생 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/13233'>https://www.sysnet.pe.kr/2/0/13233</a> </pre> <br /> 어쩌면 Omea Reader도 내부에서 사용한 HttpWebRequest가 TLS 1.2 서버에 대한 통신 오류를 겪고 있는 것이 아닌가... 하는 의심이 들었습니다. 그리고 테스트를 해봤는데요, 방법은 간단합니다.<br /> <br /> 우선, 제 웹 사이트의 RSS는 정상적으로 Omea Reader가 읽어들이므로, sysnet.pe.kr에 페이지 하나를 추가해 다음과 같이 문제의 RSS 파일을 읽어 그대로 반환하는 코드를 작성한 후,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > string url = "https://shinyoungjin.life/rss.xml"; WebClient wc = new WebClient(); wc.Encoding = Encoding.UTF8; ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12; outputText = wc.DownloadString(url); Response.Clear(); Response.ContentType = contentType; Response.ContentEncoding = Encoding.UTF8; Response.Write(outputText); Response.End(); </pre> <br /> 저 페이지 링크를 대상으로 Omea Reader에서 구독을 시도했더니 ^^ 정상적으로 됩니다. 즉, RSS 파일 내용에는 아무런 문제가 없었으며 https 서버의 문제였던 것입니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 자, 그럼 원인을 알았으니 Omea Reader의 오류를 어떻게 고칠 수 있을까요?<br /> <br /> 우선, 해당 프로그램은 오픈 소스가 아니기 때문에 소스 코드를 수정할 수는 없습니다. 따라서 "ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12;" 코드를 적용하는 방법은 선택할 수 없습니다.<br /> <br /> 그다음, app.config에 DontEnableSchUseStrongCrypto 옵션을 설정하는 것은 소스 코드 변경 없이도 가능하지만, 아쉽게도 Omea Reader 응용 프로그램은 .NET Framework 1.1로 만들어졌기 때문에 그 옵션 자체를 지원하지 않습니다. 현재 <a target='tab' href='https://www.sysnet.pe.kr/2/0/1360'>.NET Framework 1.1은 Windows 8 / Windows Server 2012 이후부터</a> 사라졌는데요, 다행히 CLR 2.0에서 1.1에 대한 하위 호환을 유지하므로 .NET Framework 2.0 ~ 3.5가 설치된 PC에서는 여전히 Omea Reader를 실행할 수 있는 상태입니다.<br /> <br /> 그렇다면 <a target='tab' href='https://www.sysnet.pe.kr/2/0/1233'>supportedRuntime</a>을 이용해 명시적으로 .NET 4+ 런타임으로 실행하도록 만들면 어떨까요?<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <?xml version="1.0" encoding="utf-8"?> <configuration> <startup><supportedRuntime version="v4.0" /></startup> <runtime> <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchUseStrongCrypto=false" /> </runtime> </configuration> </pre> <br /> 그런 경우, Omea Reader가 참조한 DLL 중에서 (IL Only 유형이 아닌) "Mixed mode assembly"로 만들어진 것이 있어 실행 시 다음과 같은 예외가 발생합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > System.IO.FileLoadException: Mixed mode assembly is built against version 'v1.1.4322' of the runtime and cannot be loaded in the 4.0 runtime without additional configuration information. at iv.f() at JetBrains.Omea.MainFrame.u(Object A_0, EventArgs A_1) at System.Windows.Forms.Timer.OnTick(EventArgs e) at System.Windows.Forms.Timer.TimerNativeWindow.WndProc(Message& m) at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) </pre> <br /> 이로써 절망에 빠지는 순간... ^^; 오류 메시지의 "without additional configuration information." 문구가 눈에 들어왔습니다. 그렇다면, 부가 설정으로 저 상황을 해결할 수 있다는 건데요, 오호~~~ 검색으로 답을 찾았습니다. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Mixed mode assembly is built against version 'v1.1.4322' ; <a target='tab' href='https://stackoverflow.com/questions/4018924/mixed-mode-assembly-is-built-against-version-v1-1-4322'>https://stackoverflow.com/questions/4018924/mixed-mode-assembly-is-built-against-version-v1-1-4322</a> </pre> <br /> 무려 12년 전의 Q&A가 이렇게 도움이 되는군요. ^^ 그래서 OmeaReader.exe.config을 다음과 같이 바꿔서,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <?xml version="1.0" encoding="utf-8"?> <configuration> <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" /> </startup> <runtime> <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchUseStrongCrypto=false" /> </runtime> </configuration> </pre> <br /> 실행했더니 정상적으로 ^^ TLS 1.2 사이트에 대한 문제를 해결했습니다.<br /> <br /> (이 방법 외에도, <a href='https://www.sysnet.pe.kr/2/0/13233#tls12_reg'>레지스트리 설정을 통해 전역적으로 TLS 1.2(또는, 최신 버전의 보안 프로토콜)를 사용하게 만들어 해결하는 것도 가능</a>합니다.)<br /> <br /> <hr style='width: 50%' /><br /> <br /> 혹시, 또 다른 해결책이 있을까요? 재미 삼아 차선책으로 역어셈블을 고려할 수 있습니다. 그런데, OmeaReader는 전체적으로 난독화 처리가 되었기 때문에 역어셈블 후 대상 소스 코드를 찾아 다시 컴파일 시키는 것이 쉽지 않다는 문제가 있습니다.<br /> <br /> 다른 방법이 없다면 그렇게라도 해야겠지만, 다행히 우리에게는 ^^ <a target='tab' href='https://github.com/dnSpy/dnSpy'>dnSpy</a>가 있습니다. 그래서, 지난 글에 작성한 방법을 적용하면 되는데요,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > dnSpy를 이용해 소스 코드가 없는 .NET 어셈블리의 코드를 변경하는 방법 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/13234'>https://www.sysnet.pe.kr/2/0/13234</a> </pre> <br /> 위의 글에서 적용한 "System.Windows.Forms.MessageBox.Show("Loaded");" 코드 대신 이번에는 "ServicePointManager.SecurityProtocol |= (SecurityProtocolType)0xC00;" 코드를 사용하면 됩니다.<br /> <br /> 그렇게 적용한 HTMLPlugin.dll을 기존 파일에 덮어쓴 다음 실행했더니,<br /> <br /> <img alt='omea_reader_tls12_support_1.png' src='/SysWebRes/bbs/omea_reader_tls12_support_1.png' /><br /> <br /> 위와 같이 TLS 1.2가 적용된 웹 서버로부터 정상적으로 RSS 파일을 읽어와 잘 보여주고 있습니다. ^^<br /> <br /> (혹시 필요한 분들이 계실지 몰라, <a target='tab' href='https://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?fid=2014&boardid=635954948'>OmeaReader.exe.config 파일과 변경된 "HTMLPlugin.dll"을 첨부</a>합니다.)<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1808
(왼쪽의 숫자를 입력해야 합니다.)