클라이언트 액세스 토큰을 교체하여 AWS IoT 보안 터널링 연결 문제 해결 - AWS IoT Core

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

클라이언트 액세스 토큰을 교체하여 AWS IoT 보안 터널링 연결 문제 해결

AWS IoT 보안 터널링을 사용하면 터널이 열려 있더라도 연결 문제가 발생할 수 있습니다. 다음 섹션에서는 발생할 수 있는 문제와 클라이언트 액세스 토큰을 교체하여 문제를 해결하는 방법을 보여줍니다. CAT (클라이언트 액세스 토큰) 를 교체하려면 RotateTunnelAccessTokenAPI 또는 를 사용하십시오. rotate-tunnel-access-token AWS CLI클라이언트를 사용하면서 오류가 발생할 때의 모드가 소스 모드인지 대상 모드인지에 따라 CAT를 소스 또는 대상 모드 또는 둘 다에서 교체할 수 있습니다.

참고
  • CAT를 소스 또는 대상 중 어디에서 교체해야 할지 확실하지 않다면 RotateTunnelAccessToken API를 사용할 때 ClientMode를 전체(ALL)로 설정하여 소스와 대상 모두에서 CAT를 교체할 수 있습니다.

  • CAT를 교체해도 터널 지속 시간은 연장되지 않습니다. 예를 들어, 터널 지속 시간이 12시간이고 터널이 이미 4시간 동안 열려 있었다고 가정합시다. 액세스 토큰을 교체할 때 생성된 새 토큰은 남은 8시간 동안만 사용할 수 있습니다.

잘못된 클라이언트 액세스 토큰 오류

AWS IoT 보안 터널링을 사용할 때 동일한 CAT (클라이언트 액세스 토큰) 를 사용하여 동일한 터널에 다시 연결할 때 연결 오류가 발생할 수 있습니다. 이 경우 로컬 프록시는 보안 터널링 프록시 서버에 연결할 수 없습니다. 소스 모드에서 클라이언트를 사용할 경우 다음 오류 메시지가 표시될 수 있습니다.

Invalid access token: The access token was previously used and cannot be used again

오류가 발생하는 이유는 클라이언트 액세스 토큰(CAT)이 로컬 프록시에 의해 한 번만 사용될 수 있고 그 후에는 무효화되기 때문입니다. 이 오류를 해결하려면 SOURCE 모드에서 클라이언트 액세스 토큰을 교체하여 소스에 대한 새로운 CAT를 생성하세요. 소스 CAT 교체 방법의 예를 보려면 소스 CAT 교체 예시 섹션을 참조하세요.

클라이언트 토큰 불일치 오류

참고

클라이언트 토큰을 사용하여 CAT를 재사용하는 것은 권장되지 않습니다. 터널에 다시 연결하기 위해 RotateTunnelAccessToken API를 사용하여 클라이언트 액세스 토큰을 교체하는 것이 좋습니다.

클라이언트 토큰을 사용하는 경우 터널에 다시 연결하기 위해 CAT를 재사용할 수 있습니다. CAT를 재사용하려면 보안 터널링에 처음 연결할 때 CAT와 클라이언트 토큰을 제공해야 합니다. 보안 터널링은 클라이언트 토큰을 저장하므로 동일한 토큰을 사용한 후속 연결을 시도할 경우 클라이언트 토큰도 제공해야 합니다. 클라이언트 토큰 사용에 대한 자세한 내용은 의 로컬 프록시 참조 구현을 참조하십시오. GitHub

클라이언트 토큰을 사용할 때 소스 모드에서 클라이언트를 사용할 경우 다음 오류 메시지가 표시될 수 있습니다.

Invalid client token: The provided client token does not match the client token that was previously set.

오류가 발생하는 이유는 제공된 클라이언트 토큰이 터널에 액세스할 때 CAT와 함께 제공된 클라이언트 토큰과 일치하지 않기 때문입니다. 이 오류를 해결하려면 SOURCE 모드에서 CAT를 교체하여 소스에 대한 새로운 CAT를 생성하세요. 다음은 그 한 예입니다:

다음 예시는 SOURCE 모드에서 RotateTunnelAccessToken API를 실행하여 소스에 대해 새로운 CAT를 생성하는 방법을 보여줍니다.

aws iotsecuretunneling rotate-tunnel-access-token \ --region <region> \ --tunnel-id <tunnel-id> \ --client-mode SOURCE

이 명령을 실행하면 새 소스 액세스 토큰이 생성되고 터널의 ARN이 반환됩니다.

{ "sourceAccessToken": "<source-access-token>", "tunnelArn": "arn:aws:iot:<region>:<account-id>:tunnel/<tunnel-id>" }

이제 새 소스 토큰을 사용하여 소스 모드에서 로컬 프록시를 연결할 수 있습니다.

export AWSIOT_TUNNEL_ACCESS_TOKEN=<source-access-token> ./localproxy -r <region> -s <port>

다음은 로컬 프록시를 실행하는 샘플 출력을 보여줍니다.

... [info] Starting proxy in source mode ... [info] Successfully established websocket connection with proxy server ... [info] Listening for new connection on port <port> ...

원격 디바이스 연결 문제

AWS IoT 보안 터널링을 사용하는 경우 터널이 열려 있더라도 장치 연결이 예기치 않게 끊길 수 있습니다. 기기가 아직 터널에 연결되어 있는지 확인하려면 API 또는 describe-tunnel을 사용할 수 있습니다. DescribeTunnel AWS CLI

여러 가지 이유로 디바이스의 연결이 끊어질 수 있습니다. 연결 문제를 해결하려면 다음과 같은 이유로 디바이스의 연결이 끊어진 경우 대상에서 CAT를 교체하면 됩니다.

  • 대상의 CAT가 무효화되었습니다.

  • 토큰이 보안 터널링 예약 MQTT 주제를 통해 디바이스에 전달되지 않았습니다.

    $aws/things/<thing-name>/tunnels/notify

다음 예에서는 이 문제를 해결하는 방법을 보여줍니다.

원격 디바이스인 <RemoteThing1>을 예로 들어보겠습니다. 이 사물에 대해 터널을 열려면 다음 명령을 사용할 수 있습니다.

aws iotsecuretunneling open-tunnel \ --region <region> \ --destination-config thingName=<RemoteThing1>,services=SSH

이 명령을 실행하면 소스 및 대상에 대한 터널 세부 정보와 CAT가 생성됩니다.

{ "sourceAccessToken": "<source-access-token>", "destinationAccessToken": "<destination-access-token>", "tunnelId": "<tunnel-id>", "tunnelArn": "arn:aws:iot:<region>:<account-id>:tunnel/tunnel-id" }

하지만 DescribeTunnelAPI를 사용하면 아래 그림과 같이 기기 연결이 끊겼다는 결과가 출력됩니다.

aws iotsecuretunneling describe-tunnel \ --tunnel-id <tunnel-id> \ --region <region>

이 명령을 실행하면 디바이스가 아직 연결되어 있지 않음을 표시합니다.

{ "tunnel": { ... "destinationConnectionState": { "status": "DISCONNECTED" }, ... } }

이 오류를 해결하려면 클라이언트는 DESTINATION 모드로 설정한 상태에서 RotateTunnelAccessToken API와 대상에 대한 구성을 실행합니다. 이 명령을 실행하면 이전 액세스 토큰이 취소되고 새 토큰이 생성되며 이 토큰을 MQTT 주제로 다시 보냅니다.

$aws/things/<thing-name>/tunnels/notify

aws iotsecuretunneling rotate-tunnel-access-token \ --tunnel-id <tunnel-id> \ --client-mode DESTINATION \ --destination-config thingName=<RemoteThing1>,services=SSH \ --region <region>

이 명령을 실행하면 아래와 같이 새 액세스 토큰이 생성됩니다. 그런 다음 디바이스 에이전트가 올바르게 설정된 경우 토큰이 디바이스에 전달되어 터널에 연결됩니다.

{ "destinationAccessToken": "destination-access-token", "tunnelArn": "arn:aws:iot:region:account-id:tunnel/tunnel-id" }