

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 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 CLI 、 AWS IoT コンソールのモノの詳細ページまたはクライアントでエンドポイントを見つけることができます。

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

   エンドポイントは次のようになります: `a3qjEXAMPLEffp-ats.iot.us-west-2.amazonaws.com` 
+ *url\$1encoded\$1topic\$1name* は、送信されるメッセージの完全な[トピック名](topics.md#topicnames)です。

## HTTPS メッセージコードの例
<a name="codeexample"></a>

 AWS IoTに HTTPS メッセージを送信する方法の例をいくつか示します。

------
#### [ 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 コンソールでクライアント (モノ) を登録したときに作成した証明書ファイルをコピーします。続行する前に、クライアントに次の 3 つの証明書ファイルがあることを確認します。
   + 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 データ。この場合、内部の引用符がバックスラッシュ文字 (\$1) でエスケープされた JSON 文字列です。  
"https://*IoT\$1data\$1endpoint*:8443/topics/*topic*?qos=1"  
この場合、クライアントの AWS IoT デバイスデータエンドポイントの URL の後に HTTPS ポート が続き`:8443`、その後にキーワード `/topics/`が続き`topic`、トピック名 が続きます。サービス品質をクエリパラメータ `?qos=1` として指定します。

1.  AWS IoT コンソールで MQTT テストクライアントを開きます。

   [MQTT クライアントで AWS IoT MQTT メッセージを表示する](view-mqtt-messages.md) の手順に従い、トピック名が **curl** コマンドで使用されている*トピック*のメッセージをサブスクライブするか、ワイルドカードトピックフィルター `#` を使用するようコンソールを設定します。

1. コマンドをテストします。

    AWS IoT コンソールのテストクライアントでトピックをモニタリングしながらクライアントに移動し、ステップ 3 で作成した curl コマンドラインを発行します。コンソールにクライアントのメッセージが表示されます。

------