AWS re:Post을(를) 사용하면 다음에 동의하게 됩니다. AWS re:Post 이용 약관

AWS IoT Core에서 JITP를 사용하려면 어떻게 해야 합니까?

8분 분량
0

AWS IoT Core에 사용자 지정 루트 인증 기관(CA)이 등록된 Just-in-Time 프로비저닝(JITP) 환경을 설정하려고 합니다.

간략한 설명

AWS IoT Core를 사용하여 JITP 환경을 설정하려면 먼저 AWS IoT Core에 CA 인증서를 등록하십시오. 이후 ](https://docs.aws.amazon.com/iot/latest/developerguide/jit-provisioning.html#jit-provisioning-registerCA-template)CA에 프로비저닝 템플릿을 연결[하십시오.

해결 방법

참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.

자체 서명된 루트 CA 및 확인 인증서 생성

전제 조건:

OpenSSL을 설치합니다.

자체 서명된 루트 CA 및 확인 인증서를 생성하려면 다음 단계를 따르십시오.

  1. 디바이스 루트 CA 프라이빗 키를 생성하고 다음 OpenSSL 명령을 실행합니다.

    $ openssl genrsa -out deviceRootCA.key 2048
  2. VIM 텍스트 편집기를 열고, 사용자 지정 OpenSSL.conf 파일을 생성합니다. VIM 텍스트 편집기에 대한 자세한 내용은 Vim Tips Wiki 웹사이트의 자습서를 참조하십시오.

  3. 사용자 지정 OpenSSL.conf 파일을 생성하려면 다음 VIM 명령을 실행합니다.

    $ vi deviceRootCA_openssl.conf
  4. .conf 파일을 편집하려면 키보드에서 i 키를 누릅니다. 이후 다음을 복사하여 파일에 붙여넣습니다.

    [ 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 (e.g., company)
    organizationName_default = AMZ
  5. .conf 파일을 저장하려면 키보드에서 Esc 키를 누른 다음 **:wq!**를 누릅니다. 파일을 종료하려면 Enter 키를 누릅니다.

  6. OpenSSL.conf 파일이 생성되었는지 확인하려면 다음 Linux 명령을 실행합니다.

    $ cat deviceRootCA_openssl.conf
  7. 디바이스 루트 CA 인증서 서명 요청(CSR)을 생성합니다. 다음 OpenSSL 명령을 실행합니다.

    $ openssl req -new -sha256 -key deviceRootCA.key -nodes -out deviceRootCA.csr -config deviceRootCA_openssl.conf
  8. 디바이스 루트 CA 인증서를 생성합니다. 다음 OpenSSL 명령을 실행합니다.

    $ openssl x509 -req -days 3650 -extfile deviceRootCA_openssl.conf -extensions v3_ca -in deviceRootCA.csr -signkey deviceRootCA.key -out deviceRootCA.pem
  9. JITP를 사용하려는 AWS 리전의 등록 코드를 검색합니다. 이후 다음 AWS CLI 명령을 실행합니다.

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

    참고: us-east-2를 JITP를 사용하려는 리전으로 바꾸십시오.

  10. 확인 키를 생성합니다. 다음 OpenSSL 명령을 실행합니다.

$ openssl genrsa -out verificationCert.key 2048
  1. 확인 인증서 CSR을 생성합니다. 다음 OpenSSL 명령을 실행합니다.
$ openssl req -new -key verificationCert.key -out verificationCert.csr

그런 다음 Common Name(일반 이름) 필드에 등록 코드를 입력합니다. 예를 들면 다음과 같습니다. 일반 이름(서버 FQDN 또는 사용자 이름) []: xxxxxxxx8a33da.

다른 필드는 비워 두십시오.

  1. 확인 인증서를 생성합니다. 다음 OpenSSL 명령을 실행합니다.
$ openssl x509 -req -in verificationCert.csr -CA deviceRootCA.pem -CAkey deviceRootCA.key -CAcreateserial -out verificationCert.crt -days 500 -sha256

중요: AWS IoT Core에서 확인 인증서를 인증할 때 루트 CA 리전의 등록 코드가 필요합니다.

자세한 내용은 Just-in-Time 프로비저닝을 참조하십시오.

JITP 템플릿 생성

  1. AWS IoT Core에 대한 AWS Identity and Access Management(IAM) 역할을 생성합니다. 이름을 JITPRole로 지정합니다. 지침은 로깅 역할 생성을 참조하십시오.

    중요: 다음 JITP 템플릿에서 IAM 역할의 Amazon 리소스 이름(ARN)을 포함해야 합니다.

  2. VIM 텍스트 편집기를 사용하여 JITP 템플릿 JSON 파일을 생성합니다. 다음 단계를 완료합니다.

  3. JITP 템플릿 JSON 파일을 생성합니다. 다음 VIM 명령을 실행합니다.

    $ vi jitp_template.json

    참고: jitp_template.json이라는 파일 이름으로 템플릿을 저장해야 합니다.

  4. JITP 템플릿을 편집하려면 키보드에서 i 키를 누릅니다. 이후 다음 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으로 바꾸십시오. 값을 AWS 계정 ID로 바꾸십시오. us-east-2를 자신의 AWS 리전으로 바꾸십시오.

  5. JITP 템플릿 파일을 저장하려면 키보드에서 Esc 키를 누르고 **:wq!**를 누릅니다.

  6. Enter 키를 눌러 파일을 종료합니다.

참고: 다음 IAM 정책은 예제 JITP 템플릿에 포함되어 있습니다.

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

AWS IoT Core에 자체 서명된 루트 CA 인증서를 등록합니다.

  1. 디바이스 루트 CA를 AWS IoT Core에 CA 인증서로 등록합니다.

  2. 다음 register-ca-certificate AWS CLI 명령을 실행합니다.

    $ 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

    참고: us-east-2를 JITP를 사용하려는 리전으로 바꾸십시오.

참고: --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. CSR 디바이스를 생성합니다. 다음 OpenSSL 명령을 실행합니다.

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

    중요: 예제 JITP 템플릿에서는 ThingName 값이 인증서의 CommonName 값과 같아야 합니다. 또한 CountryName 값이 CA 인증서의 Country 값과 같아야 합니다. 예를 들면 다음과 같습니다.

    Country Name (two-letter code) []:IN
    Common Name (e.g. 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 Mosquitto를 사용하여 AWS IoT Core에 테스트 게시 호출을 수행하고 JITP 프로세스를 시작합니다.

    참고: 또한 AWS Device SDK를 사용하여 AWS IoT Core에 대한 게시 호출을 수행할 수 있습니다.

    Eclipse Mosquitto 테스트 게시 호출 명령 예제

    중요: 명령을 실행하기 전에 a27icbrpsxxx-ats.iot.us-east-2.amazonaws.com을 자체 엔드포인트로 바꾸십시오. 자체 엔드포인트를 확인하려면 AWS IoT Core 콘솔을 엽니다. 그럼 다음 **Settings(설정)**를 선택합니다. Custom endpoint(사용자 지정 엔드포인트) 창에 엔드포인트가 표시됩니다.

    $ 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

    Eclipse Mosquitto 테스트 게시 호출 명령 응답 예제

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

    참고: 처음에는 테스트 게시 호출이 실패합니다. AWS IoT Core가 테스트 게시 호출을 수신하면 인증서, 정책 및 사물을 생성합니다. 또한 정책인증서에 연결하고, 인증서사물에 연결합니다. 다음 번에 JITP를 수행할 때는 처음 생성된 AWS IoT Core 정책이 사용됩니다. 새 AWS IoT Core 정책은 생성되지 않습니다.

  7. 다음을 수행하여 필요한 리소스가 생성되었는지 확인합니다.
    AWS IoT Core 콘솔을 엽니다.
    **Manage(관리)**를 선택합니다.
    **Things(사물)**를 선택합니다.
    DemoThing을 선택합니다.

  8. 인증서가 생성되었고 ACTIVE 상태인지 확인합니다. 그런 다음 **Policies(정책)**를 선택하고 IAM 정책이 연결되어 있는지 확인합니다.

일반 작업에 디바이스 인증서 사용

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

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

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

  3. **Subscription Topic(구독 주제)**에서 DemoThing/test를 선택합니다.

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

    중요: 명령을 실행하기 전에 a27icbrpsxxx-ats.iot.us-east-2.amazonaws.com을 자체 엔드포인트로 바꾸십시오. 자체 엔드포인트를 확인하려면 AWS IoT Core 콘솔을 엽니다. 그럼 다음 **Settings(설정)**를 선택합니다. Custom endpoint(사용자 지정 엔드포인트) 창에 엔드포인트가 표시됩니다. 또한 사용자 지정 루트 CA에서 생성한 사용자 지정 디바이스 인증서를 사용해야 합니다.

    $ 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

    명령을 실행하면 AWS 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을 사용하려는 정책 이름으로 바꾸십시오.

AWS 공식
AWS 공식업데이트됨 한 달 전