Linux 用 OpenSSL の構成
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 ベースのシステムと同様)。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
環境変数を作成し、一時ディレクトリのアクセス可能なパスに設定します。