LoginSignup
21

More than 5 years have passed since last update.

認証Proxy経由でのChocolateyの利用

Last updated at Posted at 2015-04-03

概要

Windows環境でのパッケージ管理システムChocolateyを認証つきProxy経由で導入、使用するために多少の試行錯誤をした。

  • 導入は、インストールスクリプトの取得、修正、実行の3ステップが必要になった。
  • clistの実行には、環境変数をset HTTP_PROXY=http://<USERNAME>:<PASSWORD>@<HOSTNAME>:<PORTNUMBER>のように設定が必要になった。
  • cinstの実行には、ヘルパーファイルGet-WebFile.ps1Get-WebHeaders.ps1の修正が必要になった。

詳細

Windowsアプリをコマンドラインからインストールする「Chocolatey」 | マイナビニュース』を参考に、Chocolateyの導入と、clistコマンドの実行までを、認証つきProxy内の環境で行う。

Chocolateyパッケージをインストールする。

iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))」と実行すれば、パッケージのダウンロードおよびインストールが自動的に実行されます。

もちろん失敗する。以下の2ステップで実施できた。

(1)インストールスクリプトの取得

PowerShellで以下のようにして、まずinstall.ps1を取得する。ユーザー名パスワードはそれぞれプロキシ認証で使用するユーザー名とパスワードに置き換える。

$wc = new-object System.Net.WebClient
$wc.Proxy = [System.Net.WebRequest]::GetSystemWebProxy()
$wc.Proxy.Credentials = new-object System.Net.NetworkCredential("ユーザー名","パスワード")
$wc.DownloadString('https://chocolatey.org/install.ps1') > install.ps1

これでカレントディレクトリにinstall.ps1ファイルが保存される。

(2)インストールスクリプトの修正と実行

install.ps1をエディタで開き、35行目の...

$downloader.Proxy.Credentials=[System.Net.CredentialCache]::DefaultNetworkCredentials;

...を、以下に変更する。ユーザー名パスワードはそれぞれプロキシ認証で使用するユーザー名とパスワードに置き換える。

$downloader.Proxy.Credentials = new-object System.Net.NetworkCredential("ユーザー名","パスワード")

上書き保存し、このファイルを実行する。

.\install.ps1

clistコマンドの実行

もちろん失敗する。環境変数HTTP_PROXYを以下のように設定すれば、clistでパッケージリストが出力された。

set HTTP_PROXY=http://<USERNAME>:<PASSWORD>@<HOSTNAME>:<PORTNUMBER>

なお、<...>部分は環境に合わせて適宜読み替えること。たとえば、以下のようになる。

set HTTP_PROXY=http://johndoh:jugemujugemu@proxy.example.com:8080

これに関しては、まずこのコマンドは、clist /?をすると分かるとおり、実体はNugetだと思ってよさそう。

usage: NuGet list [search terms] [options]
(略)
options:
(略)
 -ConfigFile               NuGet 構成ファイル。指定しない場合、構成ファイルとして %AppData%\NuGet\NuGet.config ファイルが使用されます。

詳細については、http://docs.nuget.org/docs/reference/command-line-reference を参照してください

NuGetのドキュメントのうち、NuGet Config Settingsを確認したところ、プロキシサーバおよびプロキシ認証情報を、NuGet.exe Config -Setコマンドか、または環境変数HTTP_PROXYで指定できそうだった。以下抜粋(和訳は筆者)。

proxy settings "http_proxy" , "http_proxy.user", "http_proxy.password" Allows you to set the proxy settings to be used while connecting to your NuGet feed. More details here. This key can be added using NuGet.exe Config -Set command.
It can also be set via environment variable "http_proxy". While setting env variable, the value should be specified in the format 'http://[username]:[password]@proxy.com'. Note, the "http_proxy.password" key value is encrypted before storing in the nuget.config file. Hence it can not be added manually by directly updating the config file.
プロキシ設定 "http_proxy" , "http_proxy.user", "http_proxy.password" NuGetフィードへの接続に使用されるプロキシ設定を指定できます。詳細はこちら。 このキーはNuGet.exe Config -Setコマンドを使用して追加できます。
環境変数"http_proxy"を使用して指定することもできます。環境変数の設定では、'http://[username]:[password]@proxy.com'の書式で指定します。注意、"http_proxy.password"キーの値は保存に先立って暗号化されます。したがって、configファイルを直接更新して追加することはできません。

前述のとおり、環境変数設定でclistが実行できた。

cinstコマンドの実行

もちろん失敗する。以下の2ファイルを書き換えることで、cinst vagrantが実行できた。

ちなみにこれを行うと、プロキシ経由でのファイル取得時には、必ずプロキシ認証入力を求めるダイアログが表示される。インストールスクリプトinstall.ps1と違い使い捨てではないので、認証情報直書きよりこちらのほうがまだ良いと思うが、もちろんスマートではない。できればclistの認証プロキシ対策とあわせて、環境変数HTTP_PROXYから取得するようにしたいところ。

(1)Get-WebFile.ps1の修正

C:\ProgramData\chocolatey\chocolateyinstall\helpers\functions\Get-WebFile.ps1の39~52行目を、以下のように修正する。42~43、46行をコメントにした(先頭に#を追加した)だけ。

  if (!$webclient.Proxy.IsBypassed($url))
  {
    $creds = [net.CredentialCache]::DefaultCredentials
    #if ($creds -eq $null) {
    #  Write-Debug "Default credentials were null. Attempting backup method"
      $cred = get-credential
      $creds = $cred.GetNetworkCredential();
    #}
    $proxyaddress = $webclient.Proxy.GetProxy($url).Authority
    Write-host "Using this proxyserver: $proxyaddress"
    $proxy = New-Object System.Net.WebProxy($proxyaddress)
    $proxy.credentials = $creds
    $req.proxy = $proxy
  }

(2)Get-WebHeaders.ps1の修正

C:\ProgramData\chocolatey\chocolateyinstall\helpers\functions\Get-WebHeaders.ps1の22~35行目を、以下のように修正する。25~26、29行をコメントにした(先頭に#を追加した)だけ。

  if (!$client.Proxy.IsBypassed($url))
  {
    $creds = [Net.CredentialCache]::DefaultCredentials
    #if ($creds -eq $null) {
    #  Write-Debug "Default credentials were null. Attempting backup method"
      $cred = Get-Credential
      $creds = $cred.GetNetworkCredential();
    #}
    $proxyAddress = $client.Proxy.GetProxy($url).Authority
    Write-Host "Using this proxyserver: $proxyAddress"
    $proxy = New-Object System.Net.WebProxy($proxyAddress)
    $proxy.credentials = $creds
    $request.proxy = $proxy
  }

0.9.83より後の版について

上述の対応策は、以下の更新日付のファイルで機能するはず。現行版でこれらのファイルが変更されているかどうかは、GitHubで更新履歴を見て、まずはこの日付より後に更新されているか確認すればいいと思う。

ファイル 0.9.83版の更新日 GitHubの更新履歴
Get-WebFile.ps1 2014年11月3日 更新履歴
Get-WebHeaders.ps1 2014年11月3日 更新履歴

参考

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21