신뢰할 수 없는 호스트를 사용하여 방화벽에서 보안 연결을 중개하는 방법은 무엇입니까? (How to broker secure connection across firewalls using untrusted host?)


문제 설명

신뢰할 수 없는 호스트를 사용하여 방화벽에서 보안 연결을 중개하는 방법은 무엇입니까? (How to broker secure connection across firewalls using untrusted host?)

최상의 공격 방법을 알 수 없는 흥미로운 네트워크 보안 문제가 있습니다.

방화벽 뒤에 있는 두 대의 컴퓨터(A와 B)가 인터넷에서 신뢰할 수 없는 공통 "브로커" 서버(RackSpace와 같은 곳)만 사용하여 서로 안전하게 연결합니다. (방화벽 뒤에 있는 고객이 이 서버를 신뢰하지 않기 때문에 서버는 신뢰할 수 없는 것으로 간주됩니다. 서버가 개방형 서버에 있기 때문입니다.) 먼저 연결이 알려져 있지 않기 때문에 네트워크가 서로 직접 연결할 수 있도록 방화벽 설정을 조정할 수 없습니다. time.

이것은 원격 데스크톱 도움말 도구(crossloop, copilot 등)에서 처리되는 NAT 대 NAT 연결 문제와 매우 유사합니다.

내가 정말로 찾고 싶은 것은 두 호스트 사이의 SSL 연결을 열고 공용 서버가 연결을 중개하도록 하는 방법입니다. 가급적이면 호스트 A가 호스트 B에 연결을 시도할 때 브로커가 연결을 설정하기 전에 호스트 B와 확인할 수 있는 토큰을 제공해야 합니다.

여기에 또 다른 주름을 추가하려면 연결 메커니즘이 두 가지 유형의 통신을 지원합니다. 첫째, REST 웹 서비스에 대한 HTTP 요청/응답 및 실시간 메시지 전달을 허용하는 두 번째 영구 소켓 연결입니다.

인증서, OAuth를 사용하는 OpenSSL과 같이 내가 알고 있는 기술을 살펴보았습니다. , 등등, 하지만 내가 필요로 하는 것을 아주 잘 하는 것을 보지 못했습니다.

다른 사람이 전에 이와 같은 것을 처리한 적이 있습니까? 포인터가 있습니까?

브로커가 연결을 설정하기 전에 호스트 B와 확인할 수 있는 토큰을 제공해야 합니다.

여기에 또 다른 주름을 추가하려면 연결 메커니즘이 두 가지 유형의 통신을 지원해야 합니다. 첫째, REST 웹 서비스에 대한 HTTP 요청/응답 및 실시간 메시지 전달을 허용하는 두 번째 영구 소켓 연결입니다.

인증서, OAuth를 사용하는 OpenSSL과 같이 내가 알고 있는 기술을 살펴보았습니다. , 등등, 하지만 내가 필요로 하는 것을 아주 잘 하는 것을 보지 못했습니다.

다른 사람이 전에 이와 같은 것을 처리한 적이 있습니까? 포인터가 있습니까?

브로커가 연결을 설정하기 전에 호스트 B와 확인할 수 있는 토큰을 제공해야 합니다.

여기에 또 다른 주름을 추가하려면 연결 메커니즘이 두 가지 유형의 통신을 지원해야 합니다. 첫째, REST 웹 서비스에 대한 HTTP 요청/응답 및 실시간 메시지 전달을 허용하는 두 번째 영구 소켓 연결입니다.

인증서, OAuth를 사용하는 OpenSSL과 같이 내가 알고 있는 기술을 살펴보았습니다. , 등등, 하지만 내가 필요로 하는 것을 아주 잘 하는 것을 보지 못했습니다.

다른 사람이 전에 이와 같은 것을 처리한 적이 있습니까? 포인터가 있습니까?

첫째, REST 웹 서비스에 대한 HTTP 요청/응답 및 실시간 메시지 전달을 허용하는 두 번째 영구 소켓 연결입니다.

인증서, OAuth를 사용하는 OpenSSL과 같이 내가 알고 있는 기술을 살펴보았습니다. , 등등, 하지만 내가 필요로 하는 것을 아주 잘 하는 것을 보지 못했습니다.

다른 사람이 전에 이와 같은 것을 처리한 적이 있습니까? 포인터가 있습니까?

첫째, REST 웹 서비스에 대한 HTTP 요청/응답 및 실시간 메시지 전달을 허용하는 두 번째 영구 소켓 연결입니다.

인증서, OAuth를 사용하는 OpenSSL과 같이 내가 알고 있는 기술을 살펴보았습니다. , 등등, 하지만 내가 필요로 하는 것을 아주 잘 하는 것을 보지 못했습니다.

다른 사람이 전에 이와 같은 것을 처리한 적이 있습니까? 포인터가 있습니까?


참조 솔루션

방법 1:

You can solve your problem with plain SSL.

Just have the untrusted server forward connections between the client hosts as opaque TCP connections. The clients then establish an end‑to‑end SSL connection over that forwarded TCP tunnel ‑ with OpenSSL, one client calls SSL_accept() and the other calls SSL_connect().

Use certificates, probably including client certificates, to verify that the other end of the SSL connection is who you expect it to be.

(This is conceptually similar to the way that HTTPS connections work over web proxies ‑ the browser just says "connect me to this destination", and establishes an SSL connection with the desired endpoint. The proxy just forwards encrypted SSL data backwards and forwards, and since it doesn't have the private key for the right certificate, it can't impersonate the desired endpoint).

방법 2:

In general, SSL is packet‑based protocol (for the purpose of solving your task). If you can have the host forward the packets back and forth, you can easily have SSL‑secured communication channel. One thing you need is something like our SSL/TLS components, which allow any transport and not just sockets. I.e. the component tells your code "send this packet to the other side" or "do you have anything for me to receive?" and your code communicates with your intermediate server.

(by AllencafEugene Mayevski 'Callback)

참조 문서

  1. How to broker secure connection across firewalls using untrusted host? (CC BY‑SA 3.0/4.0)

#OAuth #networking #Security #openssl #SSL






관련 질문

포도 API 및 OAuth (Grape API and OAuth)

단일 사용자 계정에 대해 동일한 타사 애플리케이션을 여러 번 승인하는 방법은 무엇입니까? (How to handle authorizing the same third-party application multiple times for a single user account?)

Google OAuth의 액세스 토큰 만료 시간대 (Google OAuth's access token's expiry timezone)

Facebook에서 앱 ID를 얻는 방법 (How to get app id on Facebook)

새로 고침 토큰을 사용하여 백그라운드에서 인증을 받고 액세스 토큰을 얻는 방법은 무엇입니까? (How to use refresh token to get authorized in background and getting access token?)

JSON 웹 토큰을 사용하여 Chrome 확장 프로그램에서 내 앱으로 POST 요청을 인증하는 방법은 무엇입니까? (How to authenticate a POST request from a chrome extension to my app with JSON web tokens?)

LAN 내부에 인증 자동 기능이 있는 Grails 애플리케이션을 테스트할 수 없습니다. (Cannot test Grails application which has oauth autontication inside LAN)

신뢰할 수 없는 호스트를 사용하여 방화벽에서 보안 연결을 중개하는 방법은 무엇입니까? (How to broker secure connection across firewalls using untrusted host?)

로컬 HTML 파일에서 oAuth 흐름을 처리합니까? (Handling an oAuth flow from local HTML files?)

Twitter4J로 인증하는 방법은 무엇입니까? (how to authenticate with Twitter4J?)

IdentityServer4를 사용할 때 "코드 챌린지 필요" 메시지가 나타납니다. (I am getting "code challenge required" when using IdentityServer4)

Apache Superset 및 Auth0은 "브라우저(또는 프록시)가 이 서버가 이해할 수 없는 요청을 보냈습니다."를 반환합니다. (Apache Superset and Auth0 returns "The browser (or proxy) sent a request that this server could not understand.")







코멘트