問題の整理
現在の状況と問題を整理すると以下のようになります。
- Curlでの成功、Anaconda+VS Codeでの失敗:
- コマンドプロンプトで
curlコマンドを使ってAzure OpenAI APIにリクエストを送ると、正常にレスポンスが得られる。 - しかし、Anaconda環境のVS Code上でPythonスクリプトから同じAPIにアクセスしようとすると、SSL認証エラーが発生する。
- このことから、
curlとPython(特にrequestsライブラリなど、内部でSSLを扱う部分)でのSSL認証の仕組みが異なっている可能性が示唆される。
- コマンドプロンプトで
- OpenAI Pythonライブラリのバージョンによる挙動の違い:
openaiライブラリのバージョン0.x系ではChatCompletionのレスポンスが得られるが、バージョン1.x系ではSSLエラーになる。- 同じPEMファイルを使用しているにも関わらず、バージョンによって挙動が異なるため、ライブラリ内部でのSSL認証の処理方法に違いがある可能性が高い。
- SSL認証に関する試行錯誤と推測:
certifiなどのSSL関連の対策を試みたが解決に至らず。- ユーザー側での設定では解決が難しいと感じており、サーバー側での何らかの作業が必要ではないかと推測している。
- Anaconda+VS CodeでのSSL認証とPEMファイル:
- Anaconda+VS Code環境でSSL認証を行う際に、サーバー側で何らかの手続きが必要か疑問に感じている。
- PEMファイルの作成・入手について、一般ユーザーが作成できるのか、サーバー管理者に依頼する必要があるのか不明。
想定される原因と解決策
これらの問題を踏まえ、考えられる原因と解決策を以下に示します。
1. CurlとPythonのSSL認証の違い
- 原因:
curlはOSや環境にインストールされているSSL証明書ストアを参照するか、明示的に指定された証明書を使用します。一方、Pythonのrequestsライブラリやopenaiライブラリは、デフォルトでcertifiなどのPythonパッケージで提供される信頼されたCA証明書バンドルを使用します。Azure OpenAI APIのエンドポイントのSSL証明書が、Python環境のデフォルトの信頼されたCA証明書バンドアにない場合にSSLエラーが発生する可能性があります。 - 解決策:
- 信頼できるCA証明書の追加: Azure OpenAI APIのSSL証明書が、Python環境が参照するCA証明書ストアにない場合に、その証明書(または発行元のCA証明書)を追加する必要があります。
- Python環境の特定: Anaconda環境の場合、
conda環境に特化したSSL設定がある場合があります。 requestsのverifyオプション:openaiライブラリは内部でrequestsを使用している可能性があります。requests.get(..., verify='path/to/your/certificate.pem')のように、明示的に証明書ファイルを指定することで解決できる場合があります。openaiライブラリで直接指定できるか確認が必要です。- 環境変数
REQUESTS_CA_BUNDLE: 環境変数REQUESTS_CA_BUNDLEに信頼するCA証明書へのパスを設定することで、requestsライブラリがそのバンドルを使用するようになります。VS Codeのターミナルや、スクリプト実行前にこの環境変数を設定してみてください。
- Python環境の特定: Anaconda環境の場合、
- 信頼できるCA証明書の追加: Azure OpenAI APIのSSL証明書が、Python環境が参照するCA証明書ストアにない場合に、その証明書(または発行元のCA証明書)を追加する必要があります。
2. OpenAI Pythonライブラリのバージョンによる挙動の違い
- 原因:
- SSLライブラリの変更:
openaiライブラリのバージョン1.x系では、内部で使用しているHTTPクライアントやSSL/TLSライブラリが変更された可能性があります。それに伴い、SSL証明書の検証方法やデフォルトで信頼するCA証明書のセットが変更されたのかもしれません。 httpxへの移行:openaiライブラリv1.xはhttpxを内部で利用している可能性が高いです。httpxはrequestsとは異なるSSL/TLS処理を行うため、その違いがエラーの原因となっている可能性があります。
- SSLライブラリの変更:
- 解決策:
openai.base_urlとopenai.api_versionの確認: v1.x系では、OpenAI()クラスの初期化時にbase_urlやapi_versionを明示的に指定する必要があります。これらが正しく設定されていないと、予期せぬエラーが発生することがあります。verify_sslオプションの利用(推奨はしないが一時的なデバッグ目的):openaiライブラリのコンストラクタやクライアント設定で、SSL証明書の検証を一時的に無効にするオプション(例:verify_ssl=Falseのようなもの)があるかもしれません。ただし、これはセキュリティリスクを伴うため、デバッグ目的以外での本番環境での使用は推奨されません。httpxのSSL設定を調査:openaiライブラリがhttpxを使用している場合、httpxのSSLに関する設定オプションを調査し、適用できるものがないか確認してください。
3. サーバー側での手続きとPEMファイル
- サーバー側での手続き:
- 基本的には不要: 通常、クライアント側がAPIにアクセスする際に、サーバー側で特別な手続きは不要です。サーバーは公開されているSSL証明書を提供し、クライアントはその証明書を検証します。
- 特殊なケース(自己署名証明書など): ただし、もしAzure OpenAI APIのエンドポイントが、一般的なCA(Comodo, DigiCert, Let’s Encryptなど)によって署名されたものではなく、自己署名証明書や企業内で発行されたプライベートなCA証明書を使用している場合は、そのCA証明書をクライアント側で信頼するように設定する必要があります。
- PEMファイルの作成・入手:
- 一般ユーザーが作成できるPEM: 自己署名証明書や、既存の証明書から公開鍵部分だけを抽出するPEMファイルであれば、OpenSSLなどのツールを使って一般ユーザーでも作成できます。しかし、これはCAによって署名された信頼性の高い証明書とは異なります。
- サーバー管理者に依頼するPEM: もしAzure OpenAI APIのエンドポイントが、社内独自の認証局 (CA) から発行された証明書を使用している場合、そのCAのルート証明書(または中間証明書)のPEMファイルは、サーバー管理者やシステム管理者から提供してもらう必要があります。Azure OpenAIのパブリックなエンドポイントであれば、通常は信頼されたCAから発行されているはずなので、このケースは稀です。
- 何が必要か: 必要なのは、APIサーバーが提示するSSL証明書が「信頼できる」とPython環境に認識させるための、その証明書の発行元であるCAのルート証明書や中間証明書のPEMファイルです。APIサーバー自体の秘密鍵を含むPEMファイルではありません。
解決への具体的なステップ
- Azure OpenAI APIのエンドポイントのSSL証明書情報の確認:
curlで成功しているコマンドで、--verboseオプションを追加して詳細なSSL情報を表示させます。- 表示されるSSL証明書の**発行元(Issuer)**を確認し、どのようなCAから発行されているかを確認します。
- (例:
curl -v "https://YOUR_AZURE_OPENAI_ENDPOINT/..." -H "api-key:...")
- OpenAIライブラリのバージョン1.x系のSSL設定を確認:
openaiライブラリの公式ドキュメントやGitHubリポジトリで、バージョン1.x系でのSSL/TLSに関する設定オプションを確認します。特に、OpenAI()クラスの初期化時に、CA証明書を指定する引数がないか、またはhttpxクライアントのSSL設定をカスタマイズする方法がないかを探します。
- 環境変数
REQUESTS_CA_BUNDLEの設定:- もし、Azure OpenAI APIの証明書が、Python環境のデフォルトのCA証明書バンドルに含まれていない場合、信頼すべきCA証明書をPEM形式で用意し、そのパスを
REQUESTS_CA_BUNDLE環境変数に設定してみます。 - 例: Bash
# VS Codeのターミナルで実行、またはスクリプト実行前に設定 export REQUESTS_CA_BUNDLE="/path/to/your/ca_bundle.pem" python your_script.py - この
ca_bundle.pemには、Azure OpenAI APIのエンドポイント証明書の発行元CAのルート証明書(または中間証明書)を含めます。
- もし、Azure OpenAI APIの証明書が、Python環境のデフォルトのCA証明書バンドルに含まれていない場合、信頼すべきCA証明書をPEM形式で用意し、そのパスを
pip install --upgrade certifi:- 念のため、Python環境の
certifiパッケージを最新に更新しておきます。古いバージョンだと、最近のCA証明書が含まれていない可能性があります。
- 念のため、Python環境の
- プロキシやネットワーク環境の確認:
- もし社内ネットワークやプロキシ環境を利用している場合、プロキシがSSLインスペクションを行っており、独自の証明書を挿入している可能性があります。この場合、プロキシが使用するCA証明書を信頼するようにPython環境を設定する必要があります。ネットワーク管理者に確認してください。
- 簡略化したPythonスクリプトでのテスト:
openaiライブラリではなく、requestsライブラリを直接使って、最もシンプルな形でAzure OpenAI APIにアクセスし、SSL認証エラーが発生するかどうかをテストします。requestsでSSL認証エラーが発生した場合、verify=Falseで一時的に無効にして、接続自体はできるか確認します(ただし、本番での使用は避ける)。requests.get("https://your_azure_openai_endpoint", verify="/path/to/your/ca_bundle.pem")のように、明示的に証明書ファイルを指定してテストします。
まとめ
Anaconda+VS Code環境でSSL認証エラーが発生し、Curlでは成功するという状況は、Python環境が参照するSSL証明書ストアと、Curlが参照するストアとの違いが主な原因と考えられます。特に、openaiライブラリのバージョン1.x系への移行が、この問題を引き起こしている可能性が高いです。
解決の鍵は、Azure OpenAI APIのエンドポイントのSSL証明書の発行元CAのルート証明書(または中間証明書)を、Python環境が信頼するように設定することです。これは、REQUESTS_CA_BUNDLE環境変数の設定や、openaiライブラリのSSL関連オプションの利用を通じて行うことになります。
サーバー側での特別な手続きは、通常、パブリックなAzure OpenAI APIにアクセスする際には必要ありませんが、もし特殊なネットワーク環境(自己署名証明書やプロキシによるSSLインスペクションなど)がある場合は、その限りではありません。


コメント