

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

# セキュアソケットライブラリ
<a name="secure-sockets"></a>

**重要**  <a name="deprecation-message-library"></a>
このライブラリは、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、[ここから始める](freertos-getting-started-modular.md)ことをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「[Amazon FreeRTOS Github リポジトリ移行ガイド](github-repo-migration.md)」を参照してください。

## 概要:
<a name="freertos-secure-sockets-overview"></a>

FreeRTOS [セキュアソケット](https://docs.aws.amazon.com/freertos/latest/lib-ref/html2/secure_sockets/index.html)ライブラリを使用すると、安全に通信できる組み込みアプリケーションを作成できます。このライブラリは、さまざまなネットワークプログラミングの経歴を持つソフトウェア開発者が簡単にオンボードを行えるように設計されています。

FreeRTOS セキュアソケットライブラリは、バークレーソケットインターフェイスをベースにしています。また、TLS プロトコルによる安全な通信オプションも利用できます。FreeRTOS セキュアソケットライブラリとバークレーソケットインターフェイスの相違点の詳細については、「[セキュアソケット API リファレンス](https://docs.aws.amazon.com/freertos/latest/lib-ref/html2/secure_sockets/index.html)」の「`SOCKETS_SetSockOpt`」を参照してください。

**注記**  
現在のところ FreeRTOS セキュアソケットでサポートされているのはクライアント API に加え、サーバー側 `Bind` API の [lightweight IP (lwIP)](https://savannah.nongnu.org/projects/lwip/) 実装です。

## 依存関係と要件
<a name="freertos-secure-sockets-dependencies"></a>

FreeRTOS セキュアソケットライブラリは、TCP/IP スタックおよび TLS 実装に依存します。FreeRTOS のポートは、次の 3 つのいずれかの方法でこれらの依存関係に対応します。
+ TCP/IP と TLS の両方のカスタム実装
+ TCP/IP のカスタム実装、および [mbedTLS](https://en.wikipedia.org/wiki/Mbed_TLS) を使用する FreeRTOS TLS レイヤー
+ [mbedTLS](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/index.html) を使用する [FreeRTOS\$1TCP](https://en.wikipedia.org/wiki/Mbed_TLS) および FreeRTOS TLS レイヤー

以下の依存関係の図は、FreeRTOS セキュアソケットライブラリに含まれるリファレンス実装を示しています。このリファレンス実装では、依存関係がある FreeRTOS\$1TCP および mbedTLS を使用して、TLS と TCP/IP over Ethernet および Wi-Fi がサポートされています。FreeRTOS TLS レイヤーの詳細については、「[Transport Layer Security](security-tls.md)」を参照してください。

![\[FreeRTOS+TCP、TLS レイヤー、TLS コンポーネントを使用したセキュアソケットライブラリアーキテクチャ。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/sockets-dependencies.png)


## 機能
<a name="freertos-secure-sockets-features"></a>

FreeRTOS セキュアソケットライブラリの機能には次のものがあります。
+ 標準のバークレーソケットベースのインターフェイス
+ データの送受信のためのスレッドセーフな API
+ TLS を簡単に有効化できる

## トラブルシューティング
<a name="freertos-secure-sockets-troubleshooting"></a>

### エラーコード
<a name="w2aac31b9c13c45c15b5"></a>

FreeRTOS セキュアソケットライブラリが返すエラーコードは負の値です。各エラーコードの詳細については、[セキュアソケット API リファレンス](https://docs.aws.amazon.com/freertos/latest/lib-ref/html2/secure_sockets/index.html)の「セキュアソケットのエラーコード」を参照してください。

**注記**  
FreeRTOS セキュアソケット API がエラーコードを返した場合、FreeRTOS セキュアソケットライブラリに依存している [coreMQTT ライブラリ](coremqtt.md) は、`AWS_IOT_MQTT_SEND_ERROR` というエラーコードを返します。

## 開発者サポート
<a name="freertos-secure-sockets-support"></a>

FreeRTOS セキュアソケットライブラリには、IP アドレス処理用の 2 つのヘルパーマクロが含まれています。

**`SOCKETS_inet_addr_quick`**  
このマクロは、4 つの別個のオクテットで表現された IP アドレスを、ネットワークバイト順に 32 ビットの数値で表現された IP アドレスに変換します。

**`SOCKETS_inet_ntoa`**  
このマクロは、ネットワークバイト順に 32 ビットの数値で表現された IP アドレスを、ドット区切りの 10 進数表記の文字列に変換します。

## 使用制限
<a name="freertos-secure-sockets-restrictions"></a>

FreeRTOS セキュアソケットライブラリによってサポートされているのは TCP ソケットのみです。UDP ソケットはサポートされていません。

サーバー API は、サーバー側 `Bind` API の [lightweight IP (lwIP)](https://savannah.nongnu.org/projects/lwip/) 実装を除いて FreeRTOS セキュアソケットライブラリではサポートされていません。クライアント API がサポートされています。

## 初期化
<a name="freertos-secure-sockets-initialization"></a>

FreeRTOS セキュアソケットライブラリを使用するには、ライブラリおよびその依存関係を初期化する必要があります。セキュアソケットライブラリを初期化するには、アプリケーションで以下のコードを使用します。

```
BaseType_t xResult = pdPASS;
xResult = SOCKETS_Init();
```

依存ライブラリは個別に初期化する必要があります。たとえば、FreeRTOS\$1TCP が依存関係にある場合、アプリケーションで [https://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/API/FreeRTOS_IPInit.html](https://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/API/FreeRTOS_IPInit.html) も呼び出す必要があります。

## API リファレンス
<a name="freertos-secure-sockets-api"></a>

完全な API リファレンスについては、「[Secure Sockets API Reference](https://docs.aws.amazon.com/freertos/latest/lib-ref/html2/secure_sockets/index.html)」を参照してください。

## 使用例
<a name="freertos-secure-sockets-example"></a>

以下のコードは、クライアントをサーバーに接続します。

```
#include "aws_secure_sockets.h"

#define configSERVER_ADDR0                     127
#define configSERVER_ADDR1                     0
#define configSERVER_ADDR2                     0
#define configSERVER_ADDR3                     1
#define configCLIENT_PORT                      443

/* Rx and Tx timeouts are used to ensure the sockets do not wait too long for
 * missing data. */
static const TickType_t xReceiveTimeOut = pdMS_TO_TICKS( 2000 );
static const TickType_t xSendTimeOut = pdMS_TO_TICKS( 2000 );

/* PEM-encoded server certificate */
/* The certificate used below is one of the Amazon Root CAs.\
Change this to the certificate of your choice. */
static const char cTlsECHO_SERVER_CERTIFICATE_PEM[] =
"-----BEGIN CERTIFICATE-----\n"
"MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5\n"
"MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g\n"
"Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG\n"
"A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg\n"
"Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl\n"
"ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j\n"
"QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr\n"
"ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr\n"
"BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM\n"
"YyRIHN8wfdVoOw==\n"
"-----END CERTIFICATE-----\n";

static const uint32_t ulTlsECHO_SERVER_CERTIFICATE_LENGTH = sizeof( cTlsECHO_SERVER_CERTIFICATE_PEM );

void vConnectToServerWithSecureSocket( void )
{
    Socket_t xSocket;
    SocketsSockaddr_t xEchoServerAddress;
    BaseType_t xTransmitted, lStringLength;

    xEchoServerAddress.usPort = SOCKETS_htons( configCLIENT_PORT );
    xEchoServerAddress.ulAddress = SOCKETS_inet_addr_quick( configSERVER_ADDR0,
                                                            configSERVER_ADDR1,
                                                            configSERVER_ADDR2,
                                                            configSERVER_ADDR3 );
                                                            
    /* Create a TCP socket. */
    xSocket = SOCKETS_Socket( SOCKETS_AF_INET, SOCKETS_SOCK_STREAM, SOCKETS_IPPROTO_TCP );
    configASSERT( xSocket != SOCKETS_INVALID_SOCKET );
    
    /* Set a timeout so a missing reply does not cause the task to block indefinitely. */
    SOCKETS_SetSockOpt( xSocket, 0, SOCKETS_SO_RCVTIMEO, &xReceiveTimeOut, sizeof( xReceiveTimeOut ) );
    SOCKETS_SetSockOpt( xSocket, 0, SOCKETS_SO_SNDTIMEO, &xSendTimeOut, sizeof( xSendTimeOut ) );

    /* Set the socket to use TLS. */
    SOCKETS_SetSockOpt( xSocket, 0, SOCKETS_SO_REQUIRE_TLS, NULL, ( size_t ) 0 );
    SOCKETS_SetSockOpt( xSocket, 0, SOCKETS_SO_TRUSTED_SERVER_CERTIFICATE, cTlsECHO_SERVER_CERTIFICATE_PEM, ulTlsECHO_SERVER_CERTIFICATE_LENGTH );

    if( SOCKETS_Connect( xSocket, &xEchoServerAddress, sizeof( xEchoServerAddress ) ) == 0 )
    {
        /* Send the string to the socket. */
        xTransmitted = SOCKETS_Send( xSocket,                         /* The socket receiving. */
                                     ( void * )"some message",        /* The data being sent. */
                                     12,                              /* The length of the data being sent. */
                                     0 );                             /* No flags. */

        if( xTransmitted < 0 )
        {
            /* Error while sending data */
            return;
        }

        SOCKETS_Shutdown( xSocket, SOCKETS_SHUT_RDWR );
    }
    else
    {
        //failed to connect to server
    }

    SOCKETS_Close( xSocket );
}
```

完全な例については、「[セキュアソケットエコークライアントのデモ](secure-sockets-demo.md)」を参照してください。

## 移植
<a name="freertos-secure-sockets-porting"></a>

FreeRTOS セキュアソケットは、TCP/IP スタックおよび TLS 実装に依存します。スタックによっては、セキュアソケットライブラリを移植するには、以下のいくつかの移植が必要になる場合があります。
+ [FreeRTOS\$1TCP](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/index.html) TCP/IP スタック
+ [corePKCS11 ライブラリ](security-pkcs.md)
+ [Transport Layer Security](security-tls.md)

移植の詳細については、FreeRTOS 移植ガイドの[セキュアソケットライブラリの移植](https://docs.aws.amazon.com/freertos/latest/portingguide/afr-porting-ss.html)を参照してください。