Linux 用 OpenSSL の構成

Speech SDK のバージョン 1.19.0 以上では、OpenSSL はホストシステム バージョンに動的に構成されます。 以前のバージョンでは、OpenSSL は SDK のコア ライブラリに静的にリンクされていました。

確実に接続できるよう、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 環境変数を設定する必要があります。

  • 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 証明書バンドル ファイルが付属するサブディレクトリ (ca-bundle.crt など) が存在します。 Speech SDK を使用するプログラムを実行する前に、環境変数 SSL_CERT_FILE の指し示す場所をそのファイルに設定します。 次に例を示します。
export SSL_CERT_FILE=/etc/pki/tls/certs/ca-bundle.crt

証明書失効の確認

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

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

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

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

Speech SDK (10 MB) で使用される既定の最大 CRL サイズは、構成オブジェクトごとに調整できます。 この調整のプロパティ キーは CONFIG_MAX_CRL_SIZE_KB であり、文字列として指定された値は既定で "10000" (10 MB) です。 たとえば、(Speech Service への接続を管理する) 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")
[config setPropertyTo:@"15000" byName:"CONFIG_MAX_CRL_SIZE_KB"];

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")
[config setPropertyTo:@"true" byName:"OPENSSL_CONTINUE_ON_CRL_DOWNLOAD_FAILURE"];

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

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")
[config setPropertyTo:@"true" byName:"OPENSSL_DISABLE_CRL_CHECK"];

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

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

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

次のステップ