고객사에서 웹서비스 연동 시 아래와 같이 인증서가 잘못된 경우 무시할 수 있는 방법을 요청해 공유합니다.
1, 서버 인증서 오류 내용
한글 : 이 웹 사이트의 보안 인증서에 문제가 있습니다
영문 : There is a problem with this website's security certificate - http://support.microsoft.com/kb/931850/
2, 영문으로 검색 시 아래와 같은 키워드를 찾았습니다.
WINHTTP_OPTION_SECURITY_FLAGS
SECURITY_FLAG_IGNORE_UNKNOWN_CA
SECURITY_FLAG_IGNORE_CERT_CN_INVALID
SECURITY_FLAG_IGNORE_CERT_DATE_INVALID
(https://msdn.microsoft.com/en-us/library/windows/desktop/aa384066(v=vs.85).aspx)
위의 플래그들이 잘못된 인증서를 무시하라는 옵션설정으로 보입니다.
3, 위 보안 플래그를 설정하는 데모
http://www.nldelphi.com/showthread.php?39901-Bad-cipher-melding
http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_26824117.html
위 링크를 참고해 첨부파일의 샘플을 만들어 보았습니다.
주요 코드는 아래와 같으며 WinInet을 이용하기 위해 uses 절에 "Winapi.WinInet"를 추가해야 합니다.
ReqFlags := ReqFlags or SECURITY_FLAG_IGNORE_UNKNOWN_CA or SECURITY_FLAG_IGNORE_CERT_CN_INVALID or SECURITY_FLAG_IGNORE_CERT_DATE_INVALID or SECURITY_FLAG_IGNORE_REVOCATION; // Set new flags if not(InternetSetOption(hReq, INTERNET_OPTION_SECURITY_FLAGS, @ReqFlags, dwSize)) then begin // Get error code dwError := GetLastError; // Failure MessageBox(0, PChar(IntToStr(dwError)), PChar('Confirm'), MB_OK or MB_ICONINFORMATION); end;
4, 테스트 & 결과
첫번째 버튼은 TIdHttp 컴포넌트로 https를 호출하고
두번째 버튼은 WinInet을 이용했습니다.
아쉽게도 인증서 오류가 발생한 환경이 없어 고객에게 테스트 요청했습니다. 결과가 오거나 테스트 환경을 찾게되면 테스트 후 결과를 추가하겠습니다.(기본 동작만 https를 제공하는 facebook에서 확인한 상태입니다.)
===============================
[테스트 결과 추가]
고객사에서는 Release 모드인 경우 통과 Debug 모드인 경우 3회의 통신 오류 후 응답 수신되었다는 결과를 받았습니다.
(하지만, 고객사의 내부보안이 강력해 보안 이슈도 고려해야하는 결과였습니다.)