AWS IoT Core로 JITP를 설정하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2021년 2월 15일

AWS IoT Core에 등록된 사용자 지정 루트 인증 기관(CA)이 있는 적시 프로비저닝(JITP) 환경을 설정하려고 합니다. 어떻게 해야 합니까?

간략한 설명

AWS IoT Core를 사용하여 JITP 환경을 설정하려면 먼저 CA를 AWS IoT Core에 등록한 다음 CA에 프로비저닝 템플릿을 연결합니다.

해결 방법

참고: AWS 명령줄 인터페이스(AWS CLI) 명령을 실행할 때 오류가 발생할 경우 AWS CLI의 최신 버전을 사용하고 있는지 확인하세요.

자체 서명된 루트 CA 및 확인 인증서 만들기

1.    아직 설치하지 않은 경우 OpenSSL을 설치합니다.

2.    다음 OpenSSL 명령을 실행하여 장치 루트 CA 프라이빗 키를 만듭니다.

$ openssl genrsa -out deviceRootCA.key 2048

3.    VIM 텍스트 편집기를 사용하여 다음과 같이 사용자 지정 OpenSSL.conf 파일을 만듭니다. 다음 VIM 명령을 실행하여 사용자 지정 OpenSSL.conf 파일을 만듭니다.

$ vi deviceRootCA_openssl.conf

키보드에서 i 키를 눌러 .conf 파일을 편집합니다. 그런 다음 다음을 복사하여 파일에 붙여 넣습니다.

[ req ]
distinguished_name       = req_distinguished_name
extensions               = v3_ca
req_extensions           = v3_ca

[ v3_ca ]
basicConstraints         = CA:TRUE

[ req_distinguished_name ]
countryName              = Country Name (2 letter code)
countryName_default      = IN
countryName_min          = 2
countryName_max          = 2
organizationName         = Organization Name (eg, company)
organizationName_default = AMZ

키보드에서 esc 키를 누른 다음 :wq!을 눌러 .conf 파일을 저장합니다. 그런 다음 Enter 키를 눌러 파일을 종료합니다.
참고: 다음 Linux 명령을 실행하여 OpenSSL.conf 파일이 생성되었는지 확인할 수 있습니다.

$ cat deviceRootCA_openssl.conf

4.    다음 OpenSSL 명령을 실행하여 장치 루트 CA 인증서 서명 요청(CSR)을 만듭니다.

$ openssl req -new -sha256 -key deviceRootCA.key -nodes -out deviceRootCA.csr -config deviceRootCA_openssl.conf

5.    다음 OpenSSL 명령을 실행하여 장치 루트 CA 인증서를 만듭니다.

$ openssl x509 -req -days 3650 -extfile deviceRootCA_openssl.conf -extensions v3_ca -in deviceRootCA.csr -signkey deviceRootCA.key -out deviceRootCA.pem

6.    다음 AWS CLI 명령을 실행하여 JITP를 사용할 AWS 리전의 등록 코드를 가져옵니다.

$ aws iot get-registration-code --region us-east-2

참고: us-east-2를 JITP를 사용하려는 리전으로 바꿉니다.

7.    다음 OpenSSL 명령을 실행하여 확인 키를 만듭니다.

$ openssl genrsa -out verificationCert.key 2048

8.    다음 OpenSSL 명령을 실행하여 확인 인증서 CSR을 만듭니다.

$ openssl req -new -key verificationCert.key -out verificationCert.csr

주: [공통 이름(Common Name)] 필드에 등록 코드를 입력합니다. 예: 공통 이름(서버 FQDN 또는 사용자 이름) []: xxxxxxxx8a33da. 다른 필드는 그대로 둡니다.

9.    다음 OpenSSL 명령을 실행하여 확인 인증서를 만듭니다.

$ openssl x509 -req -in verificationCert.csr -CA deviceRootCA.pem -CAkey deviceRootCA.key -CAcreateserial -out verificationCert.crt -days 500 -sha256

참고: AWS IoT Core에서 인증을 받으려면 루트 CA 리전의 등록 코드가 필요합니다.

자세한 내용은 적시 프로비저닝을 참조하세요.

JITP 템플릿 만들기

1.    AWS IoT Core 서비스에 대한 AWS Identity and Access Management(IAM) 역할을 만들고 이름을 JITPRole로 지정합니다. 자세한 단계는 로깅 역할 만들기(1단계 및 2단계)를 참조하세요.
참고: 다음 JITP 템플릿에 IAM 역할의 Amazon 리소스 이름(ARN)을 포함해야 합니다.

2.    VIM 텍스트 편집기에서 다음을 수행하여 JITP 템플릿 JSON 파일을 생성합니다.
다음 VIM 명령을 실행하여 JITP 템플릿 JSON 파일을 생성합니다.

$ vi jitp_template.json

중요: 파일 이름 jitp_template.json으로 템플릿을 저장해야 합니다.
키보드에서 i 키를 눌러 JITP 템플릿을 편집합니다. 그리고 다음 JITP 템플릿을 복사하여 파일에 붙여 넣습니다.

{
 "templateBody":"{ \"Parameters\" : { \"AWS::IoT::Certificate::CommonName\" : { \"Type\" : \"String\" },\"AWS::IoT::Certificate::Country\" : { \"Type\" : \"String\" }, \"AWS::IoT::Certificate::Id\" : { \"Type\" : \"String\" }}, \"Resources\" : { \"thing\" : { \"Type\" : \"AWS::IoT::Thing\", \"Properties\" : { \"ThingName\" : {\"Ref\" : \"AWS::IoT::Certificate::CommonName\"}, \"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:Connect\\\" ], \\\"Resource\\\": [ \\\"arn:aws:iot:us-east-2:<ACCOUNT_ID>:client\\\/${iot:Connection.Thing.ThingName}\\\" ] }, { \\\"Effect\\\": \\\"Allow\\\", \\\"Action\\\": [ \\\"iot:Publish\\\", \\\"iot:Receive\\\" ], \\\"Resource\\\": [ \\\"arn:aws:iot:us-east-2:<ACCOUNT_ID>:topic\\\/${iot:Connection.Thing.ThingName}\\\/*\\\" ] }, { \\\"Effect\\\": \\\"Allow\\\", \\\"Action\\\": [ \\\"iot:Subscribe\\\" ], \\\"Resource\\\": [ \\\"arn:aws:iot:us-east-2:<ACCOUNT_ID>:topicfilter\\\/${iot:Connection.Thing.ThingName}\\\/*\\\" ] } ] }\" } } } }",
 "roleArn":"arn:aws:iam::<ACCOUNT_ID>:role/JITPRole"
}

중요: roleArn 값을 AWS IoT Core 서비스의 IAM 역할 ARN으로 바꿉니다. <ACCOUNT_ID> 값을 AWS 계정 ID로 바꿉니다. us-east-2를 사용 중인 AWS 리전으로 바꿉니다.
키보드에서 esc 키를 누른 다음 :wq!을 눌러 JITP 템플릿 파일을 저장합니다.
Enter를 선택하여 파일을 종료합니다.

참고: 예제 JITP 템플릿에는 다음 IAM 정책이 포함되어 있습니다.
AWSIoTLogging
AWSIoTRuleActions
AWSIoTThingsRegistration

정책 링크를 보려면 AWS 계정에 로그인해야 합니다. 자세한 내용은 프로비저닝 템플릿을 참조하세요.

AWS IoT Core에 자체 서명된 루트 CA 인증서 등록

다음 register-ca-certificate 명령을 실행하여 장치 루트 CA를 AWS IoT Core에서 CA 인증서로 등록합니다.

참고: us-east-2를 JITP를 사용하려는 리전으로 바꿉니다.

$ aws iot register-ca-certificate --ca-certificate file://deviceRootCA.pem --verification-cert file://verificationCert.crt --set-as-active --allow-auto-registration --registration-config file://jitp_template.json --region us-east-2

참고: --registration-config 파라미터를 추가하면 사용자가 만든 JITP 템플릿이 CA 인증서에 첨부됩니다. 명령 응답은 CA 인증서의 ARN을 반환합니다.

자세한 내용은 CA 인증서 등록을 참조하세요.

장치 인증서 만들기 및 JITP 수행

중요: 원래 장치 루트 CA 파일을 만든 디렉터리와 동일한 디렉터리를 사용해야 합니다.

1.    RootCA1을 다운로드하고 파일 이름 awsRootCA.pem으로 저장합니다.
참고: RootCA1은 AWS IoT Core에 대한 게시 요청의 서버 측 인증에 사용됩니다. 자세한 내용은 서버 인증에 대한 CA 인증서를 참조하세요.

2.    다음 OpenSSL 명령을 실행하여 장치 프라이빗 키를 만듭니다.

$ openssl genrsa -out deviceCert.key 2048

3.    다음 OpenSSL 명령을 실행하여 장치 CSR을 만듭니다.

$ openssl req -new -key deviceCert.key -out deviceCert.csr

참고: 예제 JITP 템플릿의 경우 ThingName 값이 인증서의 CommonName 값과 같아야 합니다. 템플릿에는 CA 인증서의 Country 값과 동일한 CountryName 값도 필요합니다. 예를 들어 다음과 같습니다.

Country Name (two-letter code) []:IN
Common Name (eg. server FQDN or YOUR name) []: DemoThing

이 문서에서 제공하는 JITP 템플릿은 값을 추가해야 하는 AWS::IoT::Certificate::Country 인증서 파라미터도 사용합니다. 기타 잠재적 인증서 파라미터는 다음과 같습니다.
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

4.    다음 OpenSSL 명령을 실행하여 장치 인증서를 만듭니다.

$ openssl x509 -req -in deviceCert.csr -CA deviceRootCA.pem -CAkey deviceRootCA.key -CAcreateserial -out deviceCert.crt -days 365 -sha256

5.    루트 CA 인증서와 장치 인증서를 결합하려면 다음 명령을 실행합니다.

$ cat deviceCert.crt deviceRootCA.pem > deviceCertAndCACert.crt

6.    Eclipse Moritto 를 사용하여 AWS IoT Core에 대한 더미 게시 호출을 만들고 JITP 프로세스를 시작합니다. 명령을 실행하기 전에 다음 필드에 값을 입력해야 합니다. [ClientID](더미 텍스트 입력) [주제 이름(Topic Name)](더미 텍스트 입력) [AWS 루트 CA 1 인증서(AWS Root CA 1 Certificate)] [장치 프라이빗 키(Device private key)] [rootCA + deviceCert] [AWS IoT -ats Endpoint 엔드포인트(AWS IoT -ats Endpoint)] 참고: AWS 장치 SDK를 사용하여 AWS IoT Core에 게시 호출을 수행할 수도 있습니다.

Eclipse Mosquitto 더미 게시 호출 명령 예제

$ mosquitto_pub --cafile awsRootCA.pem --cert deviceCertAndCACert.crt --key deviceCert.key -h a27icbrpsxxx-ats.iot.us-east-2.amazonaws.com -p 8883 -q 1 -t  foo/bar -i  anyclientID --tls-version tlsv1.2 -m "Hello" -d

중요: 명령을 실행하기 전에 a27icbrpsxxx-ats.iot.us-east-2.amazonaws.com을 사용자 고유의 엔드포인트로 교체합니다. 자체 엔드포인트를 확인하려면 AWS IoT Core 콘솔을 엽니다. 그런 다음 [설정(Settings)]을 선택합니다. 엔드포인트가 [사용자 지정 엔드포인트(Custom endpoint)] 창에 나열됩니다.

Eclipse Mosquitto 더미 게시 호출 명령의 응답 예제

Client anyclientID sending CONNECT  
  Error: The connection was lost. // The error is expected for the first connect call

참고: 처음에는 더미 게시 호출이 실패합니다. AWS IoT Core가 더미 게시 호출을 받으면 인증서, 정책 및 사물을 생성합니다. 또한 정책인증서에 연결한 다음 인증서사물에 연결합니다. 다음에 JITP를 수행할 때 처음 생성된 IoT 정책이 사용될 정책입니다. 새 IoT 정책이 생성되지 않습니다.

7.    다음을 수행하여 리소스 생성을 확인합니다.
AWS IoT Core 콘솔을 엽니다.
[관리(Manage)]를 선택합니다.
[사물(Things)]을 선택합니다.
[DemoThing]를 선택합니다.
인증서가 만들어졌고 ACTIVE 상태인지 확인합니다.
그런 다음 [정책(Policies)]을 선택하고 IAM 정책이 연결되어 있는지 확인합니다.

일반 작업에서 장치 인증서 사용

참고: 게시 명령에 추가된 클라이언트 ID 값은 JITP 프로세스 중에 작성된 ThingName과 같아야 합니다. 게시 명령에 추가된 주제 이름ThingName/*형식을 따라야 합니다. 다음 게시 호출에서 deviceCertAndCACert.crt 대신 deviceCert.crt를 사용할 수 있습니다.

1.    AWS IoT Core 콘솔을 엽니다.

2.    [테스트(Test)]를 선택합니다.

3.    [구독 주제(Subscription Topic)]에 대해 DemoThing/test를 입력합니다.

4.    다음 Eclipse Mosquitto를 실행하여 AWS IoT Core에 호출 명령을 게시합니다.

$ mosquitto_pub --cafile awsRootCA.pem --cert deviceCert.crt --key deviceCert.key -h a27icbrpsxxx-ats.iot.us-east-2.amazonaws.com -p 8883 -q 1 -t  DemoThing/test -i  DemoThing --tls-version tlsv1.2 -m "Hello" -d

중요: 명령을 실행하기 전에 a27icbrpsxxx-ats.iot.us-east-2.amazonaws.com을 사용자 고유의 엔드포인트로 교체합니다. 자체 엔드포인트를 확인하려면 AWS IoT Core 콘솔을 엽니다. 그런 다음 [설정(Settings)]을 선택합니다. 엔드포인트가 [사용자 지정 엔드포인트(Custom endpoint)] 창에 나타납니다. 또한 사용자 지정 루트 CA에서 생성된 사용자 지정 장치 인증서를 사용해야 합니다.

명령을 실행하면 IoT Core 테스트 콘솔에서 메시지가 수신되는 것을 볼 수 있습니다.

추가 장치 인증서 만들기

장치 인증서를 더 생성하여 AWS IoT Core에 등록하려면 장치 인증서 만들기 및 JITP 수행 섹션에 설명된 단계를 반복합니다.

기타 JITP 템플릿

인증서의 [CommonName] 필드에서 [ThingName] 값을 가져오고 정책에서 관리자 권한을 제공하려면 다음 JITP 템플릿을 사용합니다.

{
 "templateBody":"{ \"Parameters\" : { \"AWS::IoT::Certificate::CommonName\" : { \"Type\" : \"String\" },\"AWS::IoT::Certificate::Country\" : { \"Type\" : \"String\" }, \"AWS::IoT::Certificate::Id\" : { \"Type\" : \"String\" }}, \"Resources\" : { \"thing\" : { \"Type\" : \"AWS::IoT::Thing\", \"Properties\" : { \"ThingName\" : {\"Ref\" : \"AWS::IoT::Certificate::CommonName\"}, \"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:*\\\",\\\"Resource\\\":\\\"*\\\"}]}\" } } } }",
 "roleArn":"arn:aws:iam::<ACCOUNT_ID>:role/JITPRole"
}

인증서의 [CommonName] 필드에서 [ThingName] 값을 가져오고 미리 정의된 정책 이름을 제공하려면 다음 JITP 템플릿을 사용합니다.

{
 "templateBody":"{ \"Parameters\" : { \"AWS::IoT::Certificate::CommonName\" : { \"Type\" : \"String\" },\"AWS::IoT::Certificate::Country\" : { \"Type\" : \"String\" }, \"AWS::IoT::Certificate::Id\" : { \"Type\" : \"String\" }}, \"Resources\" : { \"thing\" : { \"Type\" : \"AWS::IoT::Thing\", \"Properties\" : { \"ThingName\" : {\"Ref\" : \"AWS::IoT::Certificate::CommonName\"}, \"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\" : { \"PolicyName\" :  \"Policy_Name\"} } } }",
 "roleArn":"arn:aws:iam::<ACCOUNT_ID>:role/JITPRole"
}

중요: Policy_Name을 선택한 정책 이름으로 바꿉니다.


이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요하세요?