Development/Environment

HTTPS에서 경고 없이 HTTP 리소스를 호출하는 방법

고고마코드 2024. 2. 5. 15:01
반응형

인증서가 있는 사이트에서 인증서가 없는 사이트를 호출할 때 mixed content 오류가 발생합니다.
우선 인증서가 있는 사이트에서 인증서가 없는 사이트를 호출하는 것은 문제가 될 수 있으므로, 인증서를 사용하는 것이 가장 좋은 방법입니다.
그러나 내부에서만 사용하는 사이트이거나 인증서를 구매할 수 없는 환경이라면 아래와 같은 방법으로 해결할 수 있습니다.

기본적인 Nginx 설정 방법에 대한 지식이 없어도 아래 설정을 따라만 해도 가능합니다.

Nginx로 proxy_pass 설정하기

인증서가 있는 사이트라면, 해당 인증서를 사용해서 Nginx 설정을 하여 우회할 수 있습니다.
Nginx가 중개자 역할이 되어 보안 연결을 호출한 것처럼 위장할 수 있습니다.

Nginx 설정

server {
    # listen [사용할 포트] ssl
    listen 9999 ssl

    # server_name [사용중인 인증서 이름]
    server_name www.example.com

    # 인증서 경로에 맞게 설정
    ssl_certificate /etc/nginx/ssl/www.example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/www.example.com.key;

    # 중개하기 위한 주소
    location /proxy {
        # 요청하려는 주소
        proxy_pass http://1.2.3.4/$is_args$args;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        add_header Content-Security-Policy "frame-ancestors 'self';";
    }
}

location /proxy는 나의 서버에서 호출하고자 하는 url입니다.

proxy_pass http://1.2.3.4/$is_args$args; 이 부분이 중요한데,
호출하고자 하는 사이트의 도메인이 있다면 도메인을 입력하면 되고, 없다면 ip를 입력하면 됩니다.
$is_args$args 이 부분을 통해 파라미터까지 잘 전달할 수 있습니다.

만약 Nginx 설정을 정상적으로 했지만, 인증서 관련 오류가 발생한다면, 인증서 병합 과정이 필요할 수 있습니다.
이것은 인증서 체이닝 이슈 때문인데, 본 주제가 아니므로 해결 방법만 작성하겠습니다.

# cat [사이트인증서] [체인 CA 인증서] > [통합 인증서]
cat www.example.com.crt ca-bundle.crt > nginx-www.example.com.crt

ssl_certificate에 새로 병합한 nginx-www.example.com.crt 를 입력하면 됩니다.

호출부

이제 호출부 코드를 수정해야 합니다.
만약 기존에 http://1.2.3.4/abcde.asp?text=테스트 이렇게 호출했다면, 이제부터는
https://www.example.com:9999/proxy/abcde.asp?text=테스트 이런 식으로 호출하는 것입니다.

# https://[server_name]:[port]/[location 설정값]/[기존 호출 경로]

# 기존
http://1.2.3.4/abcde.asp?text=테스트

# 변경
https://www.example.com:9999/proxy/abcde.asp?text=테스트
반응형