Linux 用 OpenSSL の構成

注意

この記事では、間もなくサポート終了 (EOL) 状態になる Linux ディストリビューションである CentOS について説明します。 適宜、使用と計画を検討してください。 詳細については、「CentOS のサポート終了に関するガイダンス」を参照してください。

Speech SDK では、OpenSSL はホストシステム バージョンに動的に構成されます。

Note

この記事は、Speech SDK が Linux でサポートされている場合にのみ適用されます。

確実に接続できるよう、OpenSSL 証明書がシステムにインストールされていることを確認します。 次のコマンドを実行します。

openssl version -d

Ubuntu ベースまたは Debian ベースのシステムでは、次のような出力が返されます。

OPENSSLDIR: "/usr/lib/ssl"

OPENSSLDIR に certs サブディレクトリが存在するかどうかを確認します。 上記の例では /usr/lib/ssl/certs です。

  • /usr/lib/ssl/certs が存在していて、そこに個別の証明書ファイル (拡張子は .crt または .pem) が多数格納されている場合、以降の操作は不要です。

  • OPENSSLDIR が /usr/lib/ssl 以外である場合、または (複数のファイルが個別に存在するのではなく) 証明書のバンドル ファイルが 1 つあるだけである場合は、証明書の場所を示す適切な SSL 環境変数を設定する必要があります。

OpenSSL ディレクトリごとに構成する環境変数の例を次に示します。

  • OPENSSLDIR は /opt/ssl です。 certs サブディレクトリが存在し、そこに .crt または .pem ファイルが多数格納されています。 Speech SDK を使用する前に、環境変数 SSL_CERT_DIR の指し示す場所を /opt/ssl/certs に設定します。 次に例を示します。
export SSL_CERT_DIR=/opt/ssl/certs
  • OPENSSLDIR は /etc/pki/tls (RHEL/CentOS ベースのシステムの場合と同様) です。 certs サブディレクトリが存在し、そこに 1 つの証明書バンドル ファイル (たとえば、ca-bundle.crt) が格納されています。 Speech SDK を使用する前に、環境変数 SSL_CERT_FILE がこのファイル指し示すように設定します。 次に例を示します。
export SSL_CERT_FILE=/etc/pki/tls/certs/ca-bundle.crt

証明書失効の確認

Speech SDK は、Speech サービスに接続するときに、トランスポート層セキュリティ (TLS/SSL) 証明書を確認します。 Speech SDK は、リモート エンドポイントによって報告された証明書が信頼されているものであり、失効していないことを確認します。 この確認により、スプーフィングや他の関連ベクトルを利用した攻撃に対する保護レイヤーが提供されます。 このチェックは、Azure によって使用される証明機関 (CA) から証明書失効リスト (CRL) を取得することで行います。 更新された TLS CR の Azure CA ダウンロード場所の一覧については、こちらのドキュメントを参照してください。

Speech サービスを装った宛先が、取得した CRL で失効した証明書を報告した場合、SDK は接続を終了し、Canceled イベントを介してエラーを報告します。 報告された証明書の信頼性は、更新された CRL なしでは確認できません。 そのため、Speech SDK は、Azure CA の場所からの CRL ダウンロードの失敗もエラーとして扱います。

警告

ソリューションでプロキシまたはファイアウォールを使用する場合は、Azure で使用されるすべての証明書失効リスト URL へのアクセスを許可するように構成する必要があります。 これらの URL の多くは microsoft.com ドメイン外であるため、*.microsoft.com へのアクセスを許可するだけでは十分ではないことに注意してください。 詳細については、こちらのドキュメントを参照してください。 例外的なケースでは、CRL エラーを無視することもできます (対応するセクションを参照してください)。ただし、このような構成は、特に運用環境のシナリオでは強く非推奨です。

大きな CRL ファイル (>10 MB)

CRL 関連の失敗の原因の 1 つに大きな CRL ファイルの使用があります。 このクラスのエラーは、通常、拡張された CA チェーンがある特別な環境にのみ該当します。 標準のパブリック エンドポイントでは、このクラスの問題は発生しません。

Speech SDK (10 MB) で使用される既定の最大 CRL サイズは、構成オブジェクトごとに調整できます。 この調整のプロパティ キーは CONFIG_MAX_CRL_SIZE_KB であり、文字列として指定される値は既定で "10000" (10 MB) です。 たとえば、(Speech サービスへの接続を管理する) SpeechRecognizer オブジェクトを作成する場合は、その SpeechConfig でこのプロパティを設定できます。 次のスニペットでは、最大 15 MB の CRL ファイル サイズが許可されるように構成が調整されています。

config.SetProperty("CONFIG_MAX_CRL_SIZE_KB"", "15000");
config->SetProperty("CONFIG_MAX_CRL_SIZE_KB"", "15000");
config.setProperty("CONFIG_MAX_CRL_SIZE_KB"", "15000");
speech_config.set_property_by_name("CONFIG_MAX_CRL_SIZE_KB"", "15000")
speechConfig.properties.SetPropertyByString("CONFIG_MAX_CRL_SIZE_KB", "15000")

CRL の失敗をバイパスまたは無視する

Azure CA の場所にアクセスするように環境を構成できない場合、Speech SDK は更新された CRL を取得できません。 処理を続行してダウンロード エラーをログに記録するか、すべての CRL チェックをバイパスするように、SDK を構成することができます。

警告

CRL チェックはセキュリティ対策であり、それらをバイパスすると、攻撃の影響を受けやすくなります。 セキュリティへの影響と、CRL チェックによって軽減される攻撃ベクトルに対する代替の保護メカニズを十分に考慮せずに、それらをバイパスすべきではありません。

CRL を取得できないときに接続を続行するには、"OPENSSL_CONTINUE_ON_CRL_DOWNLOAD_FAILURE" プロパティを "true" に設定します。 CRL の取得は引き続き試行され、エラーは引き続きログに出力されますが、接続の試行は続行できます。

config.SetProperty("OPENSSL_CONTINUE_ON_CRL_DOWNLOAD_FAILURE", "true");
config->SetProperty("OPENSSL_CONTINUE_ON_CRL_DOWNLOAD_FAILURE", "true");
config.setProperty("OPENSSL_CONTINUE_ON_CRL_DOWNLOAD_FAILURE", "true");
speech_config.set_property_by_name("OPENSSL_CONTINUE_ON_CRL_DOWNLOAD_FAILURE", "true")

speechConfig.properties.SetPropertyByString("OPENSSL_CONTINUE_ON_CRL_DOWNLOAD_FAILURE", "true")

証明書失効チェックをオフにする場合は、"OPENSSL_DISABLE_CRL_CHECK" プロパティを "true" に設定します。 その後は、Speech サービスに接続している間に、CRL の確認またはダウンロードは試行されません。また、報告された TLS/SSL 証明書の自動検証も行われません。

config.SetProperty("OPENSSL_DISABLE_CRL_CHECK", "true");
config->SetProperty("OPENSSL_DISABLE_CRL_CHECK", "true");
config.setProperty("OPENSSL_DISABLE_CRL_CHECK", "true");
speech_config.set_property_by_name("OPENSSL_DISABLE_CRL_CHECK", "true")
speechConfig.properties.SetPropertyByString("OPENSSL_DISABLE_CRL_CHECK", "true")

CRL のキャッシュとパフォーマンス

既定では、Speech SDK は、正常にダウンロードされた CRL をディスクにキャッシュして、将来の接続の初期待機時間を短縮します。 キャッシュされた CRL が存在しない場合、またはキャッシュされた CRL の有効期限が切れている場合は、新しいリストがダウンロードされます。

Linux ディストリビューションの中には、TMP または TMPDIR 環境変数が定義されていないものがあるため、ダウンロードした CRL は Speech SDK によってキャッシュされません。 TMP または TMPDIR 環境変数が定義されていない場合、Speech SDK は接続ごとに新しい CRL をダウンロードします。 この状況で初回接続のパフォーマンスを向上させるには、TMPDIR 環境変数を作成し、一時ディレクトリのアクセス可能なパスに設定します。

次のステップ