問題の整理
- 環境とエラーの概要:
- 環境: Anaconda + VSCodeでPythonを使用し、Azure OpenAI APIを介してChatCompletionのレスポンスを取得しようとしている。
- 現象: コマンドプロンプトから
curlを使用すると正常にレスポンスが得られるが、Anaconda + VSCode経由ではSSL認証エラー(SSLCertVerificationError)が発生。 - エラーの詳細: OpenAI Pythonライブラリのバージョン0.xでは動作するが、バージョン1.xではSSLエラーが発生。
- 調査結果:
curlとAnaconda + VSCodeではSSL認証の処理が異なる。- 同じPEMファイルを使用しても、OpenAIライブラリのバージョン0.xと1.xで結果が異なる。
certifiを使用したクライアント側のSSL認証設定(例:cacert.pemへの証明書追加)を試したが解決せず。- 問題がクライアント側の設定ではなく、サーバー側の設定や構成に関連している可能性を疑っている。
- 具体的な質問:
- Anaconda + VSCodeでSSL認証を行う際、サーバー側で特別な手続きが必要か?
- PEMファイルは一般ユーザーが作成可能か、それともサーバー管理者に依頼する必要があるか?
- 推測される原因:
- SSL認証の違い:
curlはシステムの証明書ストアや設定を使用し、AnacondaのPython環境はcertifiや独自の証明書ストアを参照するため、動作に差が生じている可能性。 - ライブラリのバージョン差: OpenAI Pythonライブラリ0.xと1.xでは、内部で使用するHTTPクライアント(例:
requestsvs.httpx)やSSL検証の処理が異なる。 - サーバー側の証明書: Azure OpenAI APIエンドポイントのSSL証明書が、クライアント環境(Anaconda + VSCode)の信頼済み証明書ストアに含まれていない、または自己署名証明書や中間証明書の問題がある可能性。
- ネットワーク環境: 企業ネットワークやプロキシが介在している場合、SSLトラフィックが検査され、証明書検証エラーを引き起こしている可能性(例: Zscalerや他のプロキシによる中間証明書の問題)。
解決策の提案
以下の手順で問題を解決できる可能性があります。順番に試し、状況に応じて進めてください。
1. 証明書ストアの確認と設定
AnacondaのPython環境では、certifiモジュールが提供するcacert.pemがデフォルトの証明書ストアとして使用されます。Azure OpenAI APIエンドポイントの証明書がこのストアに含まれていない場合、SSLエラーが発生します。
手順:
- 証明書の取得:
- ブラウザでAzure OpenAIエンドポイント(例:
https://<your-resource-name>.openai.azure.com)にアクセス。 - ブラウザの「ロックアイコン」→「証明書」→「詳細」→「証明書階層」を確認し、ルート証明書または中間証明書をエクスポート(
.crtまたは.pem形式)。 - 証明書をエクスポートできない場合、会社のIT部門やサーバー管理者にAzure OpenAIエンドポイントの公開証明書(または信頼されたCA証明書)を提供してもらう。
- certifiの証明書ストアに追加:
- 以下のコマンドで
certifiのcacert.pemの場所を確認:bash python -m certifi
出力例:C:\Users\<YourUser>\Anaconda3\Lib\site-packages\certifi\cacert.pem - エクスポートした証明書(
.pem形式)をテキストエディタで開き、cacert.pemの末尾に追記。text -----BEGIN CERTIFICATE----- <証明書のコンテンツ> -----END CERTIFICATE----- - ファイルを保存後、Pythonスクリプトを再実行。
- 環境変数の設定:
- 必要に応じて、環境変数
REQUESTS_CA_BUNDLEを設定してカスタム証明書を指定:python import os os.environ['REQUESTS_CA_BUNDLE'] = 'path/to/your/custom.pem'
または、Anaconda Promptで以下を実行:bash set REQUESTS_CA_BUNDLE=path/to/your/custom.pem
注意:
- 一般ユーザーは公開証明書(ルートCAや中間CA)をブラウザやIT部門から取得可能ですが、自己署名証明書や企業固有の証明書はサーバー管理者やIT部門に依頼する必要があります。
- 証明書が正しく設定されているか確認するには、以下のようなコードでテスト:
import ssl
import certifi
print(certifi.where()) # 証明書ストアの場所を確認
2. OpenAIライブラリのバージョンの違いを考慮
OpenAI Pythonライブラリ0.xはrequestsを使用し、1.xはhttpxを使用しています。この違いがSSLエラーの原因となっている可能性があります。
解決策:
- ライブラリバージョンの確認:
pip show openai
バージョン1.x(例: 1.14.3)がインストールされている場合、以下を試す。
- httpxクライアントのカスタマイズ:
バージョン1.xでは、httpx.ClientをカスタマイズしてSSL検証を調整できます。
import httpx
from openai import AzureOpenAI
# カスタム証明書を指定
http_client = httpx.Client(verify="path/to/your/custom.pem")
client = AzureOpenAI(
api_key="your-api-key",
api_version="2023-07-01-preview",
azure_endpoint="https://<your-resource-name>.openai.azure.com/",
http_client=http_client
)
response = client.chat.completions.create(
model="gpt-35-turbo",
messages=[{"role": "user", "content": "Hello!"}]
)
print(response)
または、テスト環境でのみSSL検証を無効化(非推奨):
http_client = httpx.Client(verify=False)
client = AzureOpenAI(
api_key="your-api-key",
api_version="2023-07-01-preview",
azure_endpoint="https://<your-resource-name>.openai.azure.com/",
http_client=http_client
)
警告: verify=Falseはセキュリティリスク(中間者攻撃など)を伴うため、開発環境でのみ使用し、本番環境では適切な証明書を設定してください。
3. サーバー側の設定確認
SSLエラーがクライアント側の設定で解決しない場合、Azure OpenAI APIエンドポイントのサーバー側設定に問題がある可能性があります。
確認事項:
- 証明書の有効性:
- Azure OpenAIエンドポイントの証明書が有効期限内か、信頼されたCAによって署名されているかを確認。
- 以下のコマンドで証明書情報を確認:
bash openssl s_client -showcerts -connect <your-resource-name>.openai.azure.com:443 - 出力に「self-signed certificate」や「unable to get local issuer certificate」が含まれている場合、サーバー側の証明書設定に問題がある可能性。
- IT部門への確認:
- 企業ネットワーク内でプロキシやファイアウォール(例: Zscaler)がSSLトラフィックを検査している場合、中間証明書が挿入されている可能性があります。IT部門に以下の情報を確認:
- プロキシが使用する中間証明書。
- Azure OpenAIエンドポイントに適用される特別な証明書設定。
- IT部門に中間証明書(
.pem形式)の提供を依頼し、それをcertifiのcacert.pemに追加。 - Azure管理者に依頼:
- Azure OpenAIサービスのエンドポイント設定を確認。証明書が正しく構成されているか、またはカスタム証明書が必要かを管理者に問い合わせ。
- 特に、Azure API Managementやカスタムドメインを使用している場合、証明書の設定が標準と異なる可能性があります。
4. ネットワーク環境の確認
企業ネットワークやプロキシがSSLエラーの原因である可能性があります。
手順:
- プロキシ設定の確認:
- Anaconda環境でプロキシを設定:
bash conda config --set proxy_servers.http http://your.proxy:port conda config --set proxy_servers.https http://your.proxy:port - または、Pythonスクリプト内でプロキシを指定:
python http_client = httpx.Client(proxies={"https://": "http://your.proxy:port"}) - VPNの影響:
- 企業VPN(例: Global Protect)がSSL検証を妨げている可能性。VPNを一時的に無効化してテスト。
- VPNが必要な場合、IT部門にVPNが挿入する中間証明書を提供してもらう。
5. 代替案: ライブラリのダウングレード
バージョン1.xで解決が難しい場合、一時的にバージョン0.x(例: 0.28.1)にダウングレードして動作確認する。
手順:
pip uninstall openai
pip install openai==0.28.1
その後、以下のコードでテスト:
import openai
openai.api_type = "azure"
openai.api_key = "your-api-key"
openai.api_base = "https://<your-resource-name>.openai.azure.com"
openai.api_version = "2025-05-15"
response = openai.ChatCompletion.create(
deployment_id="gpt-35-turbo",
messages=[{"role": "user", "content": "Hello!"}]
)
print(response)
6. PEMファイルの作成について
- 一般ユーザーが作成可能か?:
- 公開証明書(ルートCAや中間CA)はブラウザや
opensslコマンドで取得可能。 - 自己署名証明書や企業固有の証明書は、サーバー管理者やIT部門が発行・提供する必要があります。
- サーバー管理者に依頼する場合:
- Azure OpenAIエンドポイントの証明書(またはチェーン全体)を提供してもらう。
- 企業プロキシが使用する中間証明書が必要な場合、IT部門に連絡。
- 必要な情報: エンドポイントのURL、証明書のフォーマット(
.pem)、および証明書チェーンの詳細。
推奨アクション
- まず証明書を確認:
- ブラウザや
opensslでAzure OpenAIエンドポイントの証明書を取得し、certifiのcacert.pemに追加。
- httpxクライアントをカスタマイズ:
- OpenAIライブラリ1.xでカスタム証明書を指定してテスト。
- IT部門やAzure管理者に相談:
- 企業ネットワークのプロキシ設定やAzure OpenAIエンドポイントの証明書設定を確認。
- 一時的な回避策:
- テスト環境で
verify=Falseを使用(本番では非推奨)。 - 必要に応じてライブラリを0.xにダウングレード。
- ログの詳細確認:
- エラーメッセージやスタックトレースを詳細に確認し、具体的な証明書エラー(例: 「self-signed certificate」「unable to get local issuer certificate」)を特定。
補足
- 参考情報:
- セキュリティ警告:
- SSL検証を無効化(
verify=False)はセキュリティリスクを伴います。必ず適切な証明書を設定してください。
- SSL検証を無効化(
- 次のステップ:
- 上記手順で解決しない場合、エラーの詳細(完全なスタックトレースや使用しているコード)を共有していただければ、さらに具体的なアドバイスを提供できます。


コメント