같은 PC, 같은 주소인데 브라우저로는 HTTPS 접속이 되고 업무용 클라이언트 프로그램(분석 도구 · 리포팅 도구 · 자체 개발 EXE)만 연결에 실패한다. 서버 쪽 리버스 프록시나 Ingress 로그에는 요청이 들어온 기록조차 없다.
프록시 · Ingress 가 접근 로그를 남기려면 최소한 TCP 연결과 TLS ClientHello 가 도착해야 한다. 로그가 한 줄도 없다면 요청은 서버에 닿기 전에 끊긴 것이다. 따라서 서버 설정이 아니라 클라이언트 구간부터 봐야 한다. 이 한 가지 사실만으로 조사 범위가 절반으로 줄어든다.
| 항목 | 브라우저(Chrome · Edge) | 네이티브 프로그램(WinHTTP · SChannel) |
|---|---|---|
| TLS 구현 | 자체 라이브러리(BoringSSL 등) | 운영체제 SChannel |
| 중간 CA 자동 확보 | AIA 로 내려받아 체인을 보완 | 하지 않는 경우가 많다 |
| 신뢰 저장소 | OS 저장소 + 자체 정책 | OS 저장소, 주로 로컬 컴퓨터 |
| 프록시 설정 | 브라우저 · 시스템 설정, PAC 해석 | WinHTTP 설정만 |
| 알고리즘 · 버전 정책 | 비교적 관대한 대체 경로 | 정책에 맞지 않으면 즉시 실패 |
| IPv6 실패 시 | IPv4 로 빠르게 대체 | 대체하지 않는 구현이 있다 |
브라우저가 된다고 해서 그 PC 의 TLS 환경이 정상이라는 뜻은 아니다.
# 1) WinHTTP 프록시 설정. 브라우저 설정과 별개다
netsh winhttp show proxy
# 브라우저(IE/Edge) 설정을 WinHTTP 로 복사해 시험
netsh winhttp import proxy source=ie
# 2) 이름이 어느 계열 주소로 풀리는지. IPv6 우선 때문에 실패하는 경우
ping <호스트>
ping -4 <호스트>
Resolve-DnsName <호스트>
# 3) TCP 도달 여부
Test-NetConnection <호스트> -Port 443
리눅스 · 서버 쪽에서는 서버가 실제로 무엇을 내려주는지 본다.
# 체인 장수와 TLS 버전
openssl s_client -connect <호스트>:443 -servername <호스트> -showcerts </dev/null 2>/dev/null \
| grep -cE 'BEGIN CERTIFICATE'
# 서버 인증서에 서버 인증 용도가 들어 있는지
openssl x509 -in tls.crt -noout -text | grep -A2 'Extended Key Usage'
TLS Web Server Authentication 이 없으면 엄격한 클라이언트는 거부한다. 사설 CA 로 급히 만든 인증서에서 빠지는 일이 잦다.netsh winhttp import proxy source=ie 후 재시도한다. 되면 WinHTTP 프록시 설정 문제다.브라우저의 HTTPS 요청은 정상 처리되지만, 동일 PC 의 WinHTTP 기반 업무 프로그램에서
같은 주소로 보낸 HTTPS 요청은 서버(Ingress) 접근 로그에 전혀 남지 않습니다.
동일 PC 를 사외망에 연결하면 정상 동작합니다.
프로그램 실행 파일과 목적지 FQDN, TCP 443 에 대한 정책 확인을 요청드립니다.
로그가 없다는 사실과 사외망에서 되는 사실을 함께 제시하면 서버 · 클라이언트 · 네트워크 중 어디를 봐야 하는지가 바로 정리된다.