socat을 통해 홈 서버에 연결하기 위한 SSL 인증서

socat을 통해 홈 서버에 연결하기 위한 SSL 인증서

집에 있는 Raspberry Pi에서 Nextcloud를 실행하고 있습니다. DynDNS 공급자 spDYN.de의 호스트 이름에서 IPv6 주소를 업데이트합니다. 그러나 내 공급자는 IPv6 연결(IPv4용 DS-Lite 사용)만 제공하므로 다른 IPv6 연결에서만 호스트 이름에 직접 액세스할 수 있으며 IPv4 네트워크에서 호스트 이름에 연결하려면 IPv4-IPv6 포스트매퍼를 사용해야 합니다.

내 웹사이트는 IPv6 및 IPv4 연결이 모두 있는 서버에서 호스팅되므로 이는 큰 문제가 아닙니다. 따라서 다음과 같이 socat을 사용했습니다.이 튜토리얼내 웹 사이트를 호스팅하는 서버에 포트 매퍼를 설정하고 내 웹 사이트 도메인의 특정 포트를 동적 DNS 호스트 이름의 포트 443으로 라우팅합니다. 이는 완벽하게 작동하지만 SSL 인증서에 문제가 발생합니다.

RasPi에서는 certbot을 사용하여 동적 DNS 호스트 이름에 대한 "Let's encrypt" 인증서를 생성했는데, 이는 완벽하게 작동하고 연결이 보안된 것으로 표시됩니다. 또한 웹 서버에서 portmapper에 사용하고 있는 도메인에 대해 유사한 인증서를 만들었습니다. 이는 그 자체로 작동합니다. 그러나 RasPi에 액세스하기 위해 전달된 특정 포트를 사용하여 도메인에 액세스하면 브라우저는 내 도메인이 포함된 URL을 계속 표시하지만 동적 DNS 호스트 이름에 대해 발급된 RasPi로부터 인증서를 받습니다. 결과적으로 "잘못된" 도메인에 대해 인증서가 발급되므로 보안 검사가 실패합니다. 이미 내 도메인의 RasPi에서 인증서 발급을 시도했지만 "인증되지 않음"이라는 메시지가 표시되지 않습니다.

이 문제를 어떻게 해결할 수 있나요? 어떤 종류의 인증서를 어디에서 설정해야 합니까?

답변1

인증서 오류를 방지하려면 사용된 도메인과 일치하는 인증서를 보내려면 pi가 필요합니다.이에 대한 두 가지 접근 방식이 있습니다.

  1. pi와 주 서버 모두에 설치된 두 도메인에 대해 하나의 인증서를 사용하십시오. 클라이언트가 쿼리에 사용한 도메인은 중요하지 않으며 인증서가 일치합니다.
  2. 클라이언트가 기대하는 인증서를 선택하여 보냅니다.

옵션 1이 더 쉽고 일반적인 방법입니다. google.com 인증서를 보세요! pi와 기본 서버 모두 동일한 인증서(두 도메인 모두에 대해)가 설치됩니다. Let's Encrypt에서 이러한 인증서를 얻으려면 pi의 동적 도메인에 대한 웹 사이트를 실행하고 사용하기 위한 기본 서버가 필요합니다.하나certbot 명령을 사용하여 두 도메인의 제어권을 동시에 확인합니다. dyndns 이름에 대한 기본 서버 사이트는 pi의 콘텐츠를 호스팅할 필요가 없습니다. 그냥 거기에 있으므로 Let's Encrypt가 해당 사이트에 대한 제어권을 가지고 있는지 확인할 수 있습니다(갱신 사이에 해당 사이트를 끌 수도 있음).

이에 대한 샘플 Certbot 명령(기본 웹 서버에서 실행):

letsencrypt certonly --webroot --csr request.csr -w /http/pisite/www -d mypi.spdyn.de -w /http/mainwebsite/www -d maindomain.de

request.csr두 도메인 중 하나를 CN으로 사용하고 SAN 필드에 두 도메인이 모두 있는 경우 /http/pisite/wwwpi의 동적 이름에 바인딩된 현재 서버의 다른 웹 사이트에 대해 생성할 로컬 디렉터리를 나타내며 /http/mainwebsite/www기본 웹 사이트의 기존 디렉터리입니다.


옵션 2는 더 복잡하지만 '더 깔끔한' 결과를 생성합니다. 즉, 클라이언트는 입력한 도메인과 일치하는 인증서를 얻습니다. 라즈베리 파이에서 TLS 연결이 열릴 때 SNI 필드를 검사하고(TLS 연결을 수락하지 않고) 거기에 포함된 도메인을 기반으로 어떤 업스트림을 전달할지 선택하는 스트림 모듈(또는 이에 상응하는)을 사용하여 nginx를 실행합니다. 에 연결합니다. 이를 통해 라즈베리 파이로 전달되는 외부 포트의 기본 도메인 요청을 처리하는 방법을 선택할 수 있습니다. 올바른 포트에서 만들어진 것처럼 기본 웹 서버로 보낼 수 있고, pi의 다른 포트(예: Nextcloud 등)로 보낼 수 있으며, 동일한 nginx 인스턴스로 종료할 수 있습니다. 원하는 페이지를 표시하거나 연결을 닫으면 됩니다. 선택은 당신의 것입니다.

이 방법에 대한 샘플 구성은 다음과 같습니다.

stream/sni-switch.conf

# Listen on 443, and on new connection:
#   if the SNI is mapped herein, handle it on this Nginx
#   else, forward the whole session to 192.168.1.80:443 (TCP passthrough, no decryption)

upstream mainwebserver {
    server 192.168.1.80:443;
}

upstream local_https {
    server 127.0.0.1:1443;
}

map $ssl_preread_server_name $name {
    default mainwebserver;

    pisite.spdyn.de     local_https;
}

server {
    listen 443;

    ssl_preread on;
    proxy_pass $name;
}

그리고nginx.conf

load_module /usr/lib/nginx/modules/ngx_stream_module.so;

stream {
    include /etc/nginx/stream/sni-switch.conf;
}

...

Apache로 이 작업을 수행하려면 다음을 참조하세요.이것. 샘플 구성은 다음과 같습니다.

<VirtualHost *:*>
    ProxyPreserveHost On
    ProxyPass        "/" "http://192.168.1.80/"
    ProxyPassReverse "/" "http://192.168.1.80/"
    ServerName maindomain.de
</VirtualHost>

관련 정보