사용자 지정 인증을 AWS IoT Core 사용하여 연결 - AWS IoT Core

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

사용자 지정 인증을 AWS IoT Core 사용하여 연결

장치 메시징을 AWS IoT Core AWS IoT Core 지원하는 모든 프로토콜의 사용자 지정 인증을 사용하여 장치에 연결할 수 있습니다. 지원되는 통신 프로토콜에 대한 자세한 내용은 디바이스 통신 프로토콜 단원을 참조하세요.   권한 부여자 Lambda 함수에 전달하는 연결 데이터는 사용하는 프로토콜에 따라 다릅니다. 권한 부여자 Lambda 함수를 만드는 방법에 대한 자세한 내용은 Lambda 함수 정의 단원을 참조하세요. 다음 단원에서는 지원되는 각 프로토콜을 사용하여 인증에 연결하는 방법을 설명합니다.

HTTPS

HTTP Publish API를 사용하여 AWS IoT Core 데이터를 보내는 기기는 HTTP POST 요청의 요청 헤더 또는 쿼리 매개변수를 통해 자격 증명을 전달할 수 있습니다. 디바이스는 x-amz-customauthorizer-name 헤더 또는 쿼리 파라미터를 사용하여 호출할 권한 부여자를 지정할 수 있습니다. 권한 부여자에서 토큰 서명을 활성화한 경우 요청 헤더 또는 쿼리 파라미터 중 하나에서 token-key-namex-amz-customauthorizer-signature을(를) 전달해야 합니다. 단, 브라우저 내에서 사용할 JavaScript 때는 token-signature 값을 URL로 인코딩해야 합니다.

참고

HTTPS 프로토콜의 고객 권한 부여자는 게시 작업만 지원합니다. HTTPS 프로토콜에 대한 자세한 내용은 디바이스 통신 프로토콜 섹션을 참조하세요.

다음 예제 요청은 요청 헤더와 쿼리 파라미터 모두에서 이러한 파라미터를 전달하는 방법을 보여 줍니다.

//Passing credentials via headers POST /topics/topic?qos=qos HTTP/1.1 Host: your-endpoint  x-amz-customauthorizer-signature: token-signature token-key-name: token-value  x-amz-customauthorizer-name: authorizer-name //Passing credentials via query parameters POST /topics/topic?qos=qos&x-amz-customauthorizer-signature=token-signature&token-key-name=token-value HTTP/1.1

MQTT

MQTT 연결을 사용하여 연결하는 AWS IoT Core 장치는 MQTT 메시지의 usernamepassword 필드를 통해 자격 증명을 전달할 수 있습니다. username 값에는 추가 값(토큰, 서명 및 권한 부여자 이름 포함)을 권한 부여자에게 전달하는 쿼리 문자열이 선택적으로 포함될 수도 있습니다. usernamepassword 값 대신 토큰 기반 인증 체계를 사용하려는 경우 이 쿼리 문자열을 사용할 수 있습니다. 

참고

암호 필드의 데이터는 base64로 인코딩됩니다. AWS IoT Core디코딩은 Lambda 함수로 해야 합니다.

다음 예제는 토큰 및 서명을 지정하는 추가 파라미터가 포함된 username 문자열을 포함합니다. 

username?x-amz-customauthorizer-name=authorizer-name&x-amz-customauthorizer-signature=token-signature&token-key-name=token-value

권한 부여자를 호출하려면 MQTT 및 사용자 지정 인증을 사용하여 연결하는 장치를 AWS IoT Core 포트 443에서 연결해야 합니다. 또한 값이 1인 애플리케이션 계층 프로토콜 협상 (ALPN) TLS mqtt 확장과 데이터 엔드포인트의 호스트 이름이 포함된 SNI (서버 이름 표시) 확장을 전달해야 합니다. AWS IoT Core 잠재적 오류를 방지하기 위해 x-amz-customauthorizer-signature 값은 URL 인코딩을 해야 합니다. 또한 x-amz-customauthorizer-nametoken-key-name 값을 URL 인코딩하는 것을 적극 권장합니다. 이러한 값에 대한 자세한 정보는 디바이스 통신 프로토콜 섹션을 참조하세요. V2 AWS IoT 디바이스 SDK, 모바일 SDK, AWS IoT 디바이스 클라이언트는 이 두 확장을 모두 구성할 수 있습니다. 

MQTT 오버 WebSockets

MQTT AWS IoT Core over를 사용하여 연결하는 장치는 다음 두 가지 방법 중 하나로 자격 증명을 전달할 WebSockets 수 있습니다.

  • HTTP UPGRADE 요청의 요청 헤더 또는 쿼리 파라미터를 통해 연결을 설정합니다. WebSockets

  • MQTT 연결 메시지의 usernamepassword 필드를 통해.

MQTT 연결 메시지를 통해 자격 증명을 전달하면 ALPN 및 SNI TLS 확장이 필요합니다. 이러한 확장에 대한 자세한 내용은 MQTT 단원을 참조하세요. 다음 예에서는 HTTP 업그레이드 요청을 통해 자격 증명을 전달하는 방법을 보여 줍니다.

GET /mqtt HTTP/1.1 Host: your-endpoint Upgrade: WebSocket Connection: Upgrade x-amz-customauthorizer-signature: token-signature token-key-name: token-value  sec-WebSocket-Key: any random base64 value sec-websocket-protocol: mqtt sec-WebSocket-Version: websocket version

토큰에 서명하기

create-authorizer 호출에서 사용한 퍼블릭-프라이빗 키 페어의 프라이빗 키를 사용하여 토큰에 서명해야 합니다. 다음 예제는 UNIX와 유사한 명령어 및 를 사용하여 토큰 서명을 생성하는 방법을 보여줍니다. JavaScript 이들은 SHA-256 해시 알고리즘을 사용하여 서명을 인코딩합니다.

Command line
echo -n TOKEN_VALUE | openssl dgst -sha256 -sign PEM encoded RSA private key | openssl base64
JavaScript
const crypto = require('crypto') const key = "PEM encoded RSA private key" const k = crypto.createPrivateKey(key) let sign = crypto.createSign('SHA256') sign.write(t) sign.end() const s = sign.sign(k, 'base64')