BLOG
장치 인증서의 JIT (just-in-time) 등록에 관한 이전 포스팅에서, 우리는 JITR (just-in-time registration)을 사용하여 장치 인증서를 활성화하고 장치가 자동 등록 된 직후 인증서에 정책을 첨부하는 방법에 대해 설명했습니다. JITR은 등록 이벤트를 작동 시킵니다. 등록 이벤트 주제를 수신하려면 AWS IoT Core 규칙을 만들어야 하며, 등록 이벤트가 확인되면 Lambda 코드가 온보드 장치에 실행됩니다.
이번 포스팅에서는 JITP (Just-In-Time Provisioning)라는 새로운 기능을 사용하여 리소스를 프로비저닝 하는 방법을 알려 드리겠습니다. JITP를 사용하면 AWS IoT Core 규칙 및 Lambda 함수를 만들지 않고도 장치를 탑재 할 수 있습니다. 프로비저닝 템플릿을 IAM 역할과 함께 CA 인증서에 첨부해야 합니다. JITP는 프로비저닝 템플릿을 기반으로 리소스를 작성, 갱신 및 첨부 시킵니다. 해당 role은 AWS IoT로 사용자를 대신하여 프로비저닝에 필요한 API를 호출 할 수 있는 권한을 부여하기 위해 전달됩니다.
다음 그림은 JITR과 JITP의 차이점을 보여줍니다.
JITP 플로우는 JITR에 비해 적은 단계를 가집니다.
CA 인증서 만들기
JITR과 마찬가지로, CA 인증서를 만드는 것으로 시작합니다. 터미널에서 OpenSSL을 사용하여 샘플 CA 인증서를 만듭니다.
Bash
$ openssl genrsa –out rootCA.key 2048
$ openssl reg –x509 –new –nodes –key rootCA.key –sha256 –days 1024 –out rootCA.pem
이 명령을 실행하면 rootCA.key와 rootCA.pem이라는 두 개의 파일을 얻게 되며, 나중에 이 파일들을 샘플 CA 인증서로 사용할 것입니다.
서비스 역할 만들기
JITP는 AWS IoT Core API를 호출 할 수 있는 권한이 필요하기 때문에 역할을 만들어 CA 인증서와 연결해야 합니다. CLI보다 IAM 콘솔을 통해 이 역할을 만드는 것이 더 쉽습니다. JITP에 특정한 서비스 역할을 생성하는 데 사용할 수 있는 AWSIoTThingsRegistration 정책은 이미 준비되어 있습니다.
IAM 콘솔에서 ‘역할’를 선택한 다음 ‘역할 생성’을 클릭합니다.
JITP의 역할 만들기
‘역할을 사용할 서비스를 선택’에서 IoT를 선택 합니다.
IoT를 신뢰할 수 있는 서비스로 선택 합니다.
정책을 검토하고, 역할의 이름과 설명을 입력합니다.
정책을 검토 합니다.
역할의 이름과 역할 설명을 제출 합니다.
우리는 이제 CA 인증서를 등록하거나 업데이트 할 때 registrationConfig 필드에서 사용할 JITPRole이라는 역할을 갖게 됩니다.
프로비저닝 템플릿 만들기
프로비저닝 템플릿이 CA 인증서에 첨부되어야 장치가 AWS IoT 코어에 최초 연결될 때 JITP 워크플로우가 템플릿에 지정된 리소스를 프로비저닝 합니다. JITP의 경우 템플릿에 다음 매개 변수를 사용할 수 있습니다. 이러한 프로비저닝 템플릿 매개 변수의 값은 프로비저닝 중인 디바이스의 인증서에 있는 제목 필드에서 추출됩니다.
- AWS::IoT::Certificate::Country
- AWS::IoT::Certificate::Organization
- AWS::IoT::Certificate::OrganizationalUnit
- AWS::IoT::Certificate::DistinguishedNameQualifier
- AWS::IoT::Certificate::StateName
- AWS::IoT::Certificate::CommonName
- AWS::IoT::Certificate::SerialNumber
- AWS::IoT::Certificate::Id
우리는 아래의 샘플 템플릿을 사용하고 있습니다. 템플릿에서 templateBody 값의 JSON 문자열을 escape 처리해야 합니다.
{
“templateBody”:”{ \”Parameters\” : { \”AWS::IoT::Certificate::Country\” : { \”Type\” : \”String\” }, \”AWS::IoT::Certificate::Id\” : { \”Type\” : \”String\” } }, \”Resources\” : { \”thing\” : { \”Type\” : \”AWS::IoT::Thing\”, \”Properties\” : { \”ThingName\” : {\”Ref\” : \”AWS::IoT::Certificate::Id\”}, \”AttributePayload\” : { \”version\” : \”v1\”, \”country\” : {\”Ref\” : \”AWS::IoT::Certificate::Country\”}} } }, \”certificate\” : { \”Type\” : \”AWS::IoT::Certificate\”, \”Properties\” : { \”CertificateId\”: {\”Ref\” : \”AWS::IoT::Certificate::Id\”}, \”Status\” : \”ACTIVE\” } }, \”policy\” : {\”Type\” : \”AWS::IoT::Policy\”, \”Properties\” : { \”PolicyDocument\” : \”{\\\”Version\\\”: \\\”2012-10-17\\\”,\\\”Statement\\\”: [{\\\”Effect\\\”:\\\”Allow\\\”,\\\”Action\\\”: [\\\”iot:Publish\\\”],\\\”Resource\\\” : [\\\”*\\\”]}]}\” } } } }”,
“roleArn”:”arn:aws:iam::123456789012:role/JITPRole”
}
우리는 AWS :: IoT :: Certificate :: Country와 AWS :: IoT :: Certificate :: Id라는 두 개의 프로비저닝 매개 변수를 사용한다고 공개하고 이를 리소스 섹션에서 사용합니다. JITP 워크플로우는 인증서에서 추출한 값으로 참조를 대체하고 템플릿에 지정된 리소스를 프로비전합니다.
구체적으로, JITP 워크플로우는 다음을 생성합니다.
- 하나의 thing 리소스.
- 하나의 정책 리소스.
그리고 나서,
- 정책을 인증서에 첨부합니다.
- thing에 인증서를 첨부 합니다.
- 인증서 상태를 ACTIVE로 업데이트합니다.
이제 전체 템플릿을 이전 단계에서 얻은 역할 ARN과 함께 로컬 파일인 provisioning-template.json에 넣습니다.
프로비저닝 템플릿에 대한 자세한 내용은 AWS IoT 코어 개발자 가이드의 프로비저닝 템플릿을 참조하십시오.
CA 인증서 등록
만들어진 샘플 CA 인증서를 AWS IoT Core에 등록합니다. JITP를 사용하려면 템플릿과 역할을 CA 인증서에 연결해야 합니다. CA 인증서를 등록 할 때 또는, 후에 CA 인증서를 업데이트 할 때 수행 할 수 있습니다. 아래 예시에서는 CA 인증서를 템플릿과 역할 ARN에 등록합니다. 또한, UpdateCACertificate API 또는 update-ca-certificate CLI 명령을 호출하여 CA 인증서의 상태를 변경하고, 자동 등록 상태를 활성화하며 템플릿과 역할 ARN을 제공하는 방법으로 등록 구성을 설정할 수 있습니다.
다음 단계에 따라 CA 인증서를 등록 합니다.
먼저 AWS IoT Core로부터 등록 코드를 얻습니다. 이 코드는 개인 키 확인 인증서의 공통 이름으로 사용 될 것입니다.
Bash
$ aws iot get-registration-code
그런 다음 개인 키 확인 인증서의 키 한 쌍을 생성합니다. 그러면, verificationCert.key라는 파일이 생성 될 것입니다..
Bash
$ openssl genrsa -out verificationCert.key 2048
이제 다음 명령을 실행하여 개인 키 확인 인증서에 대한 CSR을 만듭니다. verificationCert.csr이라는 파일이 생성 될 것입니다.
Bash
$ openssl req -new -key verificationCert.key -out verificationCert.csr
등록 코드를 사용하여 인증서의 공통 이름 필드를 설정해야 합니다.
Country Name (2 letter code) [AU]:
State or Province Name (full name) []:
Locality Name (for example, city) []:
Organization Name (for example, company) []:
Organizational Unit Name (for example, section) []:
Common Name (e.g. server FQDN or YOUR name) []: XXXXXXXREGISTRATION-CODEXXXXXXX
Email Address []:
우리는 CSR을 사용하여 개인 키 확인 인증서를 만듭니다. 이 단계에서 얻은 verificationCert.pem 파일은 CA 인증서를 등록 할 때 사용됩니다.
Bash
$ openssl x509 -req -in verificationCert.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out verificationCert.pem -days 500 -sha256
마지막으로, register-ca-certificate CLI 명령을 호출하여 CA 인증서를 등록합니다.
Bash
$ aws iot register-ca-certificate –ca-certificate file://rootCA.pem –verification-cert file://verificationCert.pem –set-as-active –allow-auto-registration –registration-config file://provisioning-template.json
등록 된 CA certificateArn 및 certificateId를 사용하여 HTTP 200을 회신 합니다. 필요한 경우, CA 인증서를 등록한 후에도 UpdateCACertificate API 또는 update-ca-certificate CLI 명령을 호출하여 등록 된 CA 인증서를 업데이트 할 수 있습니다.
CA 인증서로 서명 된 인증서로 장치를 자동으로 프로비저닝
이제, 자동 등록 상태가 활성화 된 샘플 CA 인증서를 등록하고 프로비저닝 템플릿과 연결 했으므로, CA 인증서를 사용하여 장치 인증서를 만들 수 있습니다. 장치 인증서는 AWS IoT Core에 처음 연결될 때 자동으로 프로비저닝 됩니다.
장치 인증서를 만들려면, 터미널에서 다음 명령을 실행합니다.
Bash
$ openssl genrsa -out deviceCert.key 2048
Bash
$ openssl req -new -key deviceCert.key -out deviceCert.csr
이 명령을 실행하면 국가 이름, 공통 이름 등과 같은 인증서의 대상 필드를 설정하고 이를 JITP에 전달할 수 있습니다.
이제 장치 인증서를 사용하여 AWS IoT Core에 연결합니다. 연결 시 장치 인증서와 등록 된 CA 인증서(샘플 CA 인증서)를 보내야 합니다.
Bash
$ openssl x509 -req -in deviceCert.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out deviceCert.crt -days 365 -sha256
그런 다음 장치 인증서와, 이 인증서의 CA 인증서가 들어있는 파일을 만듭니다.
Bash
$ cat deviceCert.crt rootCA.pem > deviceCertAndCACert.crt
마지막으로, 장치 인증서를 사용하여 AWS IoT Core에 연결하고 게시하기 위해 MQTT Mosquitto 클라이언트가 필요합니다.
Bash
$ mosquitto_pub –cafile root.cert –cert deviceCertAndCACert.crt –key deviceCert.key -h <prefix>.iot.us-east-1.amazonaws.com -p 8883 -q 1 -t foo/bar -I anyclientID –tls-version tlsv1.2 -m “Hello” -d
Note: root.cert는 AWS IoT 루트 인증서입니다. 다운로드 하려면 여기를 클릭하세요. 현재 디렉토리에 “root.cert”로 저장 합니다. 엔드포인트의 <prefix>가 다양하기 때문에 이를 추출하려면 describe-endpoint 명령을 실행해야 합니다.
Bash
$ aws iot describe-endpoint
AWS IoT Core에 연결하여 게시 한 후 프로비저닝 워크플로우는 TLS 핸드셰이크 중, 템플릿에 지정된 리소스를 자동으로 프로비저닝 합니다. 예제를 보면,
- 장치에 대한 thing 리소스가 생성됩니다.
- 샘플 CA 인증서로 서명 된 인증서가 만들어지고, 상태가 ACTIVE로 설정됩니다.
- 정책 리소스가 생성되어 인증서에 첨부되고, 인증서가 thing 리소스에 첨부됩니다.
이제 장치가 완전히 프로비저닝 됬습니다. AWS IoT 콘솔을 사용하여 이러한 리소스가 정상적으로 프로비저닝 되었는지 확인할 수 있습니다.
결론
이번 포스팅에서는, JITP가 IoT 장치 프로비저닝에 필요한 작업을 어떻게 단순화 할 수 있는지 보여주었습니다. AWS IoT Core는 이제 독립 실행 형 보안 프로비저닝 시스템을 제공하여 제조 업체가 온보드 장치에서 시간을 절약 할 수 있도록 지원합니다. 이 새로운 기능을 사용해 보시기 바랍니다.
더 많은 정보 얻기
AWS IoT Core
https://aws.amazon.com/iot-core/
AWS IoT Core Features
https://aws.amazon.com/iot-core/features/
AWS IoT Device Provisioning
http://docs.aws.amazon.com/iot/latest/developerguide/iot-provision.html
원문 URL: https://aws.amazon.com/ko/blogs/iot/setting-up-just-in-time-provisioning-with-aws-iot-core/
** 메가존 TechBlog는 AWS BLOG 영문 게재글중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.