はじめに
WSLから code . を実行した際に以下のようなエラーが発生しました。
Installing VS Code Server for Linux x64
Downloading: 100%
Failed
Unable to establish SSL connection.
このエラーを解決する過程で、プロキシ・ネットワーク・SSLの仕組みを理解しましたのでまとめます。
問題
なぜダウンロードが始まったのか
WSLから code . を実行すると、VS CodeはRemote - WSLモードで動作しようとします。
Windows側のVS Code(クライアント) ←→ WSL内のVS Code Server(サーバー)
WSL環境内に VS Code Server という小さなサーバープログラムを自動インストールする仕様になっており、これが今回ダウンロードしようとしたものです。
ネットワーク構成を理解する
ipconfigで確認できること
Windowsで ipconfig を実行すると、複数のネットワークアダプターが表示されます。
ネットワークアダプターとは、ネットワークへつながるためのインターフェース(窓口)のことです。
イーサネット アダプター イーサネット:
IPv4 アドレス: 192.168.1.100 ← 自分のPCの社内IPアドレス(物理アダプター)
イーサネット アダプター vEthernet (WSL):
IPv4 アドレス: 172.20.0.1 ← WindowsとWSLの橋渡し(仮想アダプター)
| アダプター | 役割 |
|---|---|
| イーサネット(物理) | 実際の社内LANに繋がる本物のアダプター |
| vEthernet (WSL) | WindowsとWSLの間の通信に使う仮想アダプター |
WSL自身のIPアドレス
WSL上で以下のコマンドを実行すると確認できます。
ip addr show eth0
inet 172.20.16.243/20
通信経路の全体像
WSL(172.20.16.243)
↓
Windows WSL仮想アダプター(172.20.0.1)
↓
Windows 物理アダプター(192.168.1.100)
↓
社内プロキシ(192.168.10.1:8080)
↓
Microsoftのサーバー(外部)
プロキシの仕組みを理解する
プロキシは「通信を横取りする」
プロキシは門番のように入口を塞いでいるのではなく、通信を横取りして自分を経由させる動き方をしています。
設定なしの場合:
自分のPC → Microsoftへ接続しようとする
↓
プロキシが通信を横取り(なりすまし)
↓
WSLのSSLライブラリ「証明書がMicrosoftのじゃない!不正だ!」
↓ SSLエラー
設定ありの場合:
自分のPC → プロキシに正式依頼「Microsoftへ繋いでくれ」
↓
プロキシ → Microsoftと通信
↓
プロキシ → WSLに結果を返す
「最初からプロキシと話すつもりだったのでOK!」
郵便局員のたとえで言うと:
- 設定なし:本物の郵便局員のふりをした人(プロキシ)が現れ手紙を奪う → 「身分証が本物じゃない!」と気づいてエラー
- 設定あり:最初から代理人(プロキシ)に正式依頼しているので問題なし
SSLエラーを検知するのは誰か
証明書を検証して「おかしい!」と気づくのは通信を始めた側であるWSL内のSSLライブラリです。Microsoftはこの段階ではまだ登場すらしていません。
バイパス(<local>)とは
プロキシには「経由しないアドレスの一覧(バイパス)」を設定できます。
netsh winhttp show proxy
プロキシ サーバー: 192.168.10.1:8080
バイパス一覧 : <local>
<local> は「社内アドレスへのアクセスはプロキシを経由しない」という意味です。
重要なのは行き先で判断するという点です。
自分のPC → 192.168.x.x(社内サーバー) → プロキシをバイパス(直接アクセス)
自分のPC → update.code.visualstudio.com → プロキシを経由(外部アクセス)
今回のVS Code Serverのダウンロード先はMicrosoftの外部サーバーなので、プロキシを経由する必要があります。
なぜWindowsのプロキシ設定ではだめなのか
WSLはWindowsの中で動いていますが、別のOSとして独立しています。
Windows OS
└── プロキシ設定あり(Windowsの設定)
└── WSL(別のLinux OS)
└── プロキシ設定なし ← ここが独立している
WindowsのプロキシはあくまでWindowsアプリ専用で、WSL内のLinuxプログラムには引き継がれません。
Windowsのブラウザ → Windowsのプロキシ設定を使う → OK
WSLのwgetやcurl → Windowsのプロキシ設定は見ない → 設定が必要
解決方法
.bashrcにプロキシを設定する
.bashrcとは
.bashrc はターミナルを開くたびに自動で読み込まれるBashの設定ファイルです(~/.bashrc の ~/ はホームディレクトリ)。ここにプロキシを設定しておくことで、毎回自動で環境変数がセットされます。
設定手順
1. プロキシサーバーのアドレスを確認(Windows側)
netsh winhttp show proxy
2. .bashrcを編集
nano ~/.bashrc
末尾に以下を追記します。
export http_proxy=http://192.168.10.1:8080
export https_proxy=http://192.168.10.1:8080
export no_proxy=localhost,127.0.0.1
3. 設定を即反映
source ~/.bashrc
http_proxyとhttps_proxyの2つが必要な理由
プログラムはプロトコルごとに別々の環境変数を参照するためです。
http://example.com → http_proxy を参照
https://example.com → https_proxy を参照
https_proxyにhttpを設定する理由
これはプロキシサーバー自体への接続プロトコルを指定しています。
自分のPC --http--> プロキシ(社内通信なのでhttpで十分)
プロキシ --https--> 外部サーバー(実際の通信はhttps)
アクセスしたい先がhttpsでも、プロキシへの接続は社内通信なのでhttpで問題ありません。
おわりに
今回のエラーの原因と解決策をまとめると以下のとおりです。
| 項目 | 内容 |
|---|---|
| エラーの原因 | WSLにプロキシ設定がなく、プロキシを経由できなかった |
| SSLエラーの正体 | プロキシが通信を横取りし、証明書がMicrosoftのものと一致しなかった |
| Windowsの設定で解決しない理由 | WSLはWindowsとは独立した別OSのため |
| 解決策 | WSLの.bashrcにプロキシを設定する |
WSLとWindowsは同じPCの中にいても別々のOSとして動いているため、ネットワーク設定も個別に行う必要があります。同じようなエラーで詰まっている方の参考になれば幸いです。
参考
JISOUのメンバー募集中!
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか?
興味のある方は、ぜひホームページをのぞいてみてください!