

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

# HTTPS 게시
<a name="http"></a>

클라이언트는 HTTP 1.0 또는 1.1 프로토콜을 사용하여 REST API에 요청하여 메시지를 게시할 수 있습니다. HTTP 요청에 사용되는 인증 및 포트 매핑에 대해서는 [프로토콜, 포트 매핑 및 인증](protocols.md#protocol-mapping) 단원을 참조하세요.

**참고**  
HTTPS는 MQTT와 같이 `clientId` 값을 지원하지 않습니다. `clientId`는 MQTT를 사용할 때 이용할 수 있지만 HTTPS를 사용할 때는 이용할 수 없습니다.

## HTTPS 메시지 URL
<a name="httpurl"></a>

디바이스와 클라이언트는 클라이언트별 엔드포인트 및 주제별 URL에 대한 POST 요청을 함으로서 메시지를 게시합니다.

```
https://IoT_data_endpoint/topics/url_encoded_topic_name?qos=1
```
+  *IoT\$1data\$1endpoint*는 [AWS IoT 디바이스 데이터 엔드포인트](iot-connect-devices.md#iot-connect-device-endpoints)입니다. 콘솔의 AWS IoT 사물 세부 정보 페이지 또는 클라이언트에서 명령을 사용하여 엔드포인트를 찾을 수 있습니다 AWS CLI .

  ```
  aws iot describe-endpoint --endpoint-type iot:Data-ATS
  ```

   엔드포인트는 `a3qjEXAMPLEffp-ats.iot.us-west-2.amazonaws.com`과 같아야 합니다.
+ *url\$1encoded\$1topic\$1name*은 전송되는 메시지의 전체 [topic name](topics.md#topicnames)입니다.

## HTTPS 메시지 코드 예제
<a name="codeexample"></a>

다음은 HTTPS 메시지를 AWS IoT에 전송하는 방법에 대한 몇 가지 예입니다.

------
#### [ Python (port 8443) ]

```
import requests
import argparse

# define command-line parameters
parser = argparse.ArgumentParser(description="Send messages through an HTTPS connection.")
parser.add_argument('--endpoint', required=True, help="Your AWS IoT data custom endpoint, not including a port. " +
                                                      "Ex: \"abcdEXAMPLExyz-ats.iot.us-east-1.amazonaws.com\"")
parser.add_argument('--cert', required=True, help="File path to your client certificate, in PEM format.")
parser.add_argument('--key', required=True, help="File path to your private key, in PEM format.")
parser.add_argument('--topic', required=True, default="test/topic", help="Topic to publish messages to.")
parser.add_argument('--message', default="Hello World!", help="Message to publish. " +
                                                      "Specify empty string to publish nothing.")

# parse and load command-line parameter values
args = parser.parse_args()

# create and format values for HTTPS request
publish_url = 'https://' + args.endpoint + ':8443/topics/' + args.topic + '?qos=1'
publish_msg = args.message.encode('utf-8')

# make request
publish = requests.request('POST',
            publish_url,
            data=publish_msg,
            cert=[args.cert, args.key])

# print results
print("Response status: ", str(publish.status_code))
if publish.status_code == 200:
        print("Response body:", publish.text)
```

------
#### [ Python (port 443) ]

```
import requests
import http.client
import json
import ssl

ssl_context = ssl.SSLContext(protocol=ssl.PROTOCOL_TLS_CLIENT)
ssl_context.minimum_version = ssl.TLSVersion.TLSv1_2

# note the use of ALPN
ssl_context.set_alpn_protocols(["x-amzn-http-ca"])
ssl_context.load_verify_locations(cafile="./<root_certificate>")

# update the certificate and the AWS endpoint
ssl_context.load_cert_chain("./<certificate_in_PEM_Format>", "<private_key_in_PEM_format>")
connection = http.client.HTTPSConnection('<the ats IoT endpoint>', 443, context=ssl_context)
message = {'data': 'Hello, I'm using TLS Client authentication!'}
json_data = json.dumps(message)
connection.request('POST', '/topics/device%2Fmessage?qos=1', json_data)

# make request
response = connection.getresponse()

# print results
print(response.read().decode())
```

------
#### [ CURL ]

클라이언트 또는 디바이스의 [curl](https://curl.haxx.se)을 사용하여 AWS IoT에 메시지를 전송할 수 있습니다.

**curl을 사용하여 AWS IoT 클라이언트 디바이스에서 메시지를 보내려면**

1. **curl** 버전을 확인합니다.

   1. 클라이언트의 명령 프롬프트에서 이 명령을 실행합니다.

      **curl --help**

      도움말 텍스트에서 TLS 옵션을 찾습니다. `--tlsv1.2` 옵션이 표시됩니다.

   1. `--tlsv1.2` 옵션이 표시되면 계속합니다.

   1. `--tlsv1.2` 옵션이 표시되지 않거나 `command not found` 오류가 발생하면 계속하기 전에 클라이언트에서 curl을 업데이트 또는 설치하거나 `openssl`을(를) 설치합니다.

1. 클라이언트에 인증서를 설치합니다.

    AWS IoT 콘솔에 클라이언트(사물)를 등록할 때 생성한 인증서 파일을 복사합니다. 계속하기 전에 클라이언트에 이 세 가지 인증서 파일이 있는지 확인합니다.
   + CA 인증서 파일(이 예에서는 *Amazon-root-CA-1.pem*).
   + 클라이언트의 인증서 파일(이 예에서는 *device.pem.crt*).
   + 클라이언트의 프라이빗 키 파일(이 예에서는 *private.pem.key*).

1. **curl** 명령줄을 생성하여 계정 및 시스템의 대체 가능한 값을 바꿉니다.

   ```
   curl --tlsv1.2 \
       --cacert Amazon-root-CA-1.pem \
       --cert device.pem.crt \
       --key private.pem.key \
       --request POST \
       --data "{ \"message\": \"Hello, world\" }" \
       "https://IoT_data_endpoint:8443/topics/topic?qos=1"
   ```  
--tlsv1.2  
TLS 1.2(SSL)를 사용합니다.  
--cacert *Amazon-root-CA-1.pem*  
피어를 확인하는 데 필요한 경우 CA 인증서의 파일 이름과 경로입니다.  
--cert *device.pem.crt*  
필요한 경우 클라이언트의 인증서 파일 이름과 경로입니다.  
--key *private.pem.key*  
필요한 경우 클라이언트의 프라이빗 키 파일 이름과 경로입니다.  
--request POST  
HTTP 요청의 유형입니다(이 경우 POST).  
--data "*\$1 \$1"message\$1": \$1"Hello, world\$1" \$1*"  
게시할 HTTP POST 데이터입니다. 이 경우 JSON 문자열이며 내부 인용 부호는 백슬래시 문자(\$1)로 이스케이프됩니다.  
"https://*IoT\$1data\$1endpoint*:8443/topics/*topic*?qos=1"  
클라이언트 디바이스 AWS IoT 데이터 엔드포인트의 URL, HTTPS 포트 , 키워드 `:8443`, `topic`이 경우 `/topics/` 주제 이름 입니다. 쿼리 파라미터 `?qos=1`로 서비스 품질을 지정합니다.

1.  AWS IoT 콘솔에서 MQTT 테스트 클라이언트를 엽니다.

   [MQTT 클라이언트를 사용하여 AWS IoT MQTT 메시지 보기](view-mqtt-messages.md)의 지침에 따라 **curl** 명령에 사용된 *주제(topic)*의 주제 이름으로 메시지를 구독하도록 콘솔을 구성하거나 `#`의 와일드카드 주제 필터를 사용합니다.

1. 명령을 테스트합니다.

    AWS IoT 콘솔의 테스트 클라이언트에서 주제를 모니터링하는 동안 클라이언트로 이동하여 3단계에서 만든 curl 명령줄을 실행합니다. 콘솔에 클라이언트의 메시지가 표시되어야 합니다.

------