セキュアソケットライブラリ - FreeRTOS

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

セキュアソケットライブラリ

重要

このライブラリは、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、ここから始めることをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「Amazon FreeRTOS Github リポジトリ移行ガイド」を参照してください。

概要

FreeRTOS セキュアソケットライブラリを使用すると、安全に通信できる組み込みアプリケーションを作成できます。このライブラリは、さまざまなネットワークプログラミングの経歴を持つソフトウェア開発者が簡単にオンボードを行えるように設計されています。

FreeRTOS セキュアソケットライブラリは、バークレーソケットインターフェイスをベースにしています。また、TLS プロトコルによる安全な通信オプションも利用できます。FreeRTOS セキュアソケットライブラリとバークレーソケットインターフェイスの相違点の詳細については、「セキュアソケット API リファレンス」の「SOCKETS_SetSockOpt」を参照してください。

注記

現在のところ FreeRTOS セキュアソケットでサポートされているのはクライアント API に加え、サーバー側 Bind API の lightweight IP (lwIP) 実装です。

依存関係と要件

FreeRTOS セキュアソケットライブラリは、TCP/IP スタックおよび TLS 実装に依存します。FreeRTOS のポートは、次の 3 つのいずれかの方法でこれらの依存関係に対応します。

  • TCP/IP と TLS の両方のカスタム実装

  • TCP/IP のカスタム実装、および mbedTLS を使用する FreeRTOS TLS レイヤー

  • mbedTLS を使用する FreeRTOS+TCP および FreeRTOS TLS レイヤー

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

機能

FreeRTOS セキュアソケットライブラリの機能には次のものがあります。

  • 標準のバークレーソケットベースのインターフェイス

  • データの送受信のためのスレッドセーフな API

  • E asy-to-enable TLS

トラブルシューティング

エラーコード

FreeRTOS セキュアソケットライブラリが返すエラーコードは負の値です。各エラーコードの詳細については、セキュアソケット API リファレンスの「セキュアソケットのエラーコード」を参照してください。

注記

FreeRTOS セキュアソケット API がエラーコードを返した場合、FreeRTOS セキュアソケットライブラリに依存している coreMQTT ライブラリ は、AWS_IOT_MQTT_SEND_ERROR というエラーコードを返します。

開発者サポート

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

SOCKETS_inet_addr_quick

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

SOCKETS_inet_ntoa

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

使用制限

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

サーバー API は、サーバー側 Bind API の lightweight IP (lwIP) 実装を除いて FreeRTOS セキュアソケットライブラリではサポートされていません。クライアント API がサポートされています。

初期化

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

BaseType_t xResult = pdPASS; xResult = SOCKETS_Init();

依存ライブラリは個別に初期化する必要があります。たとえば、FreeRTOS+TCP が依存関係にある場合、アプリケーションで FreeRTOS_IPInit も呼び出す必要があります。

API リファレンス

完全な API リファレンスについては、「Secure Sockets API Reference」を参照してください。

使用例

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

#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 ); }

完全な例については、「セキュアソケットエコークライアントのデモ」を参照してください。

移植

FreeRTOS セキュアソケットは、TCP/IP スタックおよび TLS 実装に依存します。スタックによっては、セキュアソケットライブラリを移植するには、以下のいくつかの移植が必要になる場合があります。

移植の詳細については、FreeRTOS 移植ガイドのセキュアソケットライブラリの移植を参照してください。