11.

Composer「Failed to clone symfony/thanks via https, ssh protocol」の原因と対処

編集
この記事の要点
  • Composer install / update 時に symfony/thanks など GitHub からの clone が https / ssh 両方で失敗するエラー
  • 主な原因: GitHub API レート制限 / 社内プロキシ・ファイアウォール / SSH 鍵未設定 / Composer の auth.json 未設定
  • 基本対処: Personal Access Token (PAT)auth.json に登録 → API レート制限を回避
  • プロキシ環境では HTTP_PROXY / HTTPS_PROXY を設定し、composer config -g github-protocols https で SSH を回避
  • composer config --global secure-http false非推奨(中間者攻撃リスク)。社内 Satis ミラー利用を検討

このエラーの概要

composer installcomposer update を実行したときに、次のようなメッセージが出て止まることがあります:

  - Installing symfony/thanks (v1.2.10):
    Failed to download symfony/thanks from dist: ...
    Now trying to download from source

  - Syncing symfony/thanks (v1.2.10) into cache

  Failed to clone https://github.com/symfony/thanks.git via https, ssh protocols,
  aborting.

  - https://github.com/symfony/thanks.git
    Cloning into '/path/to/vendor/symfony/thanks'...
    fatal: unable to access 'https://github.com/symfony/thanks.git/':
    Failed to connect to github.com port 443: Connection timed out

  - git@github.com:symfony/thanks.git
    Cloning into '/path/to/vendor/symfony/thanks'...
    Permission denied (publickey).
    fatal: Could not read from remote repository.

Composer は まず dist (zip)、ダメなら source (git clone) を試します。両方失敗するとこのエラーになります。symfony/thanks 以外(laravel/framework 等)でも同じ原理で発生します。

原因の切り分け

症状主な原因対処
API rate limit exceededGitHub API の匿名アクセス上限 (60/h)Personal Access Token を auth.json に登録(対処1)
Connection timed out / Could not resolve host社内プロキシ / ファイアウォールHTTP_PROXY 設定(対処2)
Permission denied (publickey)SSH 鍵未登録 / ssh-agent 未起動https プロトコル強制(対処3)
SSL certificate problem古い CA 証明書 / 自己署名プロキシCA 更新(対処4)
composer 1.x で発生Composer 1 系の互換問題Composer 2 へ更新(対処5)

対処1: GitHub Personal Access Token を設定(最も効果的)

未認証だと GitHub API は 1 時間 60 リクエストまでしか受け付けません。Composer は依存解決時に API を多用するためすぐ枯渇します。

  1. GitHub → Settings → Developer settings → Personal access tokens → Tokens (classic)
  2. Generate new token → スコープは public_repo のみで OK(プライベートリポジトリ利用時は repo
  3. 生成された ghp_xxxxxxxxxxxx を控える
  4. Composer に登録
# グローバル auth.json (~/.composer/auth.json または ~/.config/composer/auth.json)
composer config -g github-oauth.github.com ghp_xxxxxxxxxxxxxxxxxxxx

# プロジェクトローカル (auth.json を .gitignore に必ず追加)
composer config github-oauth.github.com ghp_xxxxxxxxxxxxxxxxxxxx

# 確認
composer config -g --list | grep github
cat ~/.composer/auth.json

これで composer install は dist 経由(API 認証あり)で取れるようになり、source fallback まで行きません。

対処2: 社内プロキシ環境

会社の PC / サーバから直接 github.com に出られない場合、プロキシ経由が必須です。

# 環境変数(推奨)
export HTTP_PROXY=http://proxy.example.com:8080
export HTTPS_PROXY=http://proxy.example.com:8080
export NO_PROXY=localhost,127.0.0.1,.internal.example.com

# Windows
setx HTTP_PROXY "http://proxy.example.com:8080"
setx HTTPS_PROXY "http://proxy.example.com:8080"

# git にも設定
git config --global http.proxy http://proxy.example.com:8080
git config --global https.proxy http://proxy.example.com:8080

# 認証付きプロキシ
export HTTPS_PROXY=http://user:pass@proxy.example.com:8080

対処3: SSH を諦めて HTTPS 強制

SSH 鍵が無いマシンや CI 環境では、SSH を完全に無効化して HTTPS のみにします:

# Composer に "git は https しか使わない" と教える
composer config -g github-protocols https

# git レベルでも書き換え(git config)
git config --global url."https://github.com/".insteadOf git@github.com:
git config --global url."https://".insteadOf git://

# 確認
git config --global --get-regexp url
# url.https://github.com/.insteadof git@github.com:

逆に SSH 鍵を整備したい場合:

# ed25519 鍵生成
ssh-keygen -t ed25519 -C "you@example.com"

# 公開鍵を GitHub Settings → SSH keys に登録
cat ~/.ssh/id_ed25519.pub

# ssh-agent 起動と鍵追加
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519

# 疎通確認
ssh -T git@github.com
# → Hi ! You've successfully authenticated, ...

対処4: SSL / 証明書エラー

SSL certificate problem: unable to get local issuer certificate が併発する場合:

# CentOS / RHEL
sudo yum install -y ca-certificates
sudo update-ca-trust

# Ubuntu / Debian
sudo apt-get install -y ca-certificates
sudo update-ca-certificates

# Composer の CA 設定を確認
composer diagnose

# どうしても無視(非推奨)
composer config --global secure-http false
# → http:// リポジトリへの中間者攻撃を許してしまうので、
#   原則使わず、社内 CA を OS に登録するのが正解

対処5: Composer 2.x への更新

Composer 1 系は依存解決が遅く、GitHub API を叩く回数も多いため、レート制限に当たりやすいです。2.x なら数倍速く、API 呼び出しも激減します:

composer self-update --2

# 確認
composer --version
# Composer version 2.7.x ...

# プロジェクト要件を 2.x に更新
composer config platform.php 8.2
composer update

auth.json の場所と注意点

  • Linux/macOS グローバル: ~/.composer/auth.json または ~/.config/composer/auth.json
  • Windows グローバル: %APPDATA%\Composer\auth.json
  • プロジェクト直下: auth.json必ず .gitignore へ。トークン漏洩すると即悪用される)
  • CI/CD では環境変数経由: COMPOSER_AUTH='{"github-oauth":{"github.com":"ghp_xxx"}}'

FAQ

Q: PAT を作っても直らない
A: composer clear-cache でキャッシュをクリアし、~/.composer/auth.json が正しい場所にあるか composer diagnose で確認してください。

Q: 本番デプロイで毎回エラーになる
A: 本番は composer install --no-dev --prefer-dist を使い、可能なら Satis や Private Packagist で社内ミラーを建てるとレート制限と障害の両方に強くなります。

Q: Docker ビルドで失敗する
A: --build-arg GITHUB_TOKEN=$GH_TOKEN でトークンを渡し、Dockerfile 内で composer config -g github-oauth.github.com $GITHUB_TOKEN。layer に残らないよう --secret マウントが理想です。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. SQLSTATE[HY000] [1045] Access denied for user 'homestead'@'localhost'
  2. Add [~] to fillable property to allow mass assignment on [App\~].
  3. PHP Parse error: syntax error, unexpected 'class' (T_CLASS), expecting identifier (T_STRING) or variable (T_VARIABLE) or '{' or '$' in ~
  4. Changing columns for table "~" requires Doctrine DBAL; install "doctrine/dbal"
  5. MethodNotAllowedHttpException No message
  6. Class 'Doctrine\DBAL\Driver\PDOMySql\Driver' not found
  7. production.ERROR: No application encryption key has been specified.
  8. Dotenv values containing spaces must be surrounded by quotes.
  9. Laravel \ Socialite \ Two \ InvalidStateException
  10. The page has expired due to inactivity. Please refresh and try again.
  11. Failed to clone https://github.com/symfony/thanks.git via https, ssh protocol
  12. Illegal offset type
  13. Cannot access protected property Illuminate\Http\Request::$...
  14. Emitted value instead of an instance of Error
  15. 画像保存時にInternal Server Error
  16. Failed to authenticate on SMTP server with username ...
  17. PostTooLargeException
  18. Database hosts array is empty.
  19. Invalid request (Unsupported SSL request)
  20. does not comply with psr-4 autoloading standard. Skipping.
  21. MySQLのSTR_TO_DATE関数を使用するとnullが返却される問題