プログラマ38の日記

主にプログラムメモです。

雑記: 個人環境でhttpプロキシを使いたい時はSquidを使おう

Excel VBAでプログラムを書いておきたいなと思い、今までにいくつかExcel VBAのプログラムを書いてきました。

せっかくなのでSalesforceAPIを操作して楽ができるツールがいいなと思い書いてきたのですが、通信制御のところで不具合があることがわかりました。もう今は全て修正したのですが、不具合は次のものです。

 

エラー内容

「httpプロキシで、Basic認証をしている環境で、システムエラーが発生する。」

 

具体的には次のコードが駄目です。(少しシンプルにしています)

    Set http = CreateObject("WinHttp.WinHttpRequest.5.1")

    http.setProxy 2, proxyhost & ":" & proxyport, ""

    http.setCredentials proxyusername, proxypassword, 1

    http.Open "POST", sfendpoint, False

上の「setCredentials 」で、httpプロキシのBasic認証のためのユーザ、パスワードを指定しているのですが、この関数は「Open」関数の後に呼び出しをしないとエラーとなります。なので、正しくは、次のようになります。

    Set http = CreateObject("WinHttp.WinHttpRequest.5.1")

    http.setProxy 2, proxyhost & ":" & proxyport, ""

    http.Open "POST", sfendpoint, False

    http.setCredentials proxyusername, proxypassword, 1

いつもhttpプロキシを使わずに通信する環境で作っているためhttpプロキシを経由して通信するテストができていなかったことが原因です。

なので環境を用意してテストできるようにしたいと思いました。

 

 

ローカル環境のhttpプロキシ

ローカルにhttpプロキシを立てるには「Squid」というツールが便利で、情報も揃っています。(ただバージョンの違いで設定も多少違うようです)

インターネットにアクセスするプログラムをローカルで開発する際に、httpプロキシ経由、そしてBasic認証のテストをする時にとても便利です。

使い方は検索すればたくさん出てくると思いますが、Windows10でインストールした時のメモです。

  • Squid.msiをダウンロード(Squid-3.5 64bit)してインストール
  • インストール後、[インストールフォルダ]etcsquidsquid.conf を変更(※1)
  • ユーザ/パスワード用のファイルを用意(※2)
  • インストール後、タスクトレイから「Start Squid Service」 (既にStartしていた場合は、StopしてからStart)
    f:id:crmprogrammer38:20180105194310p:plain
  • ブラウザのプロキシ設定をしてインターネットアクセス時にユーザ/パスワードを求められればOK

※1  とりあえずこれで動いている詳細を把握して設定していないです。

#

# Recommended minimum configuration:

#



auth_param basic program /lib/squid/basic_ncsa_auth /etc/squid/.htpasswd

auth_param basic children 5

auth_param basic realm Squid proxy-caching web server

auth_param basic credentialsttl 2 hours

auth_param basic casesensitive off





# Example rule allowing access from your local networks.

# Adapt to list your (internal) IP networks from where browsing

# should be allowed



acl localnet src 10.0.0.0/8	# RFC1918 possible internal network

acl localnet src 172.16.0.0/12	# RFC1918 possible internal network

acl localnet src 192.168.0.0/16	# RFC1918 possible internal network

acl localnet src fc00::/7       # RFC 4193 local private network range

acl localnet src fe80::/10      # RFC 4291 link-local (directly plugged) machines

acl localnet src 192.168.1.0/255.255.255.0



acl SSL_ports port 443

acl Safe_ports port 80		# http

acl Safe_ports port 21		# ftp

acl Safe_ports port 443		# https

acl Safe_ports port 70		# gopher

acl Safe_ports port 210		# wais

acl Safe_ports port 1025-65535	# unregistered ports

acl Safe_ports port 280		# http-mgmt

acl Safe_ports port 488		# gss-http

acl Safe_ports port 591		# filemaker

acl Safe_ports port 777		# multiling http

acl CONNECT method CONNECT

acl password proxy_auth REQUIRED





visible_hostname PCNAME



#

# Recommended minimum Access Permission configuration:

#



# Only allow cachemgr access from localhost

http_access allow localhost manager

http_access deny manager

http_access allow localnet

http_access allow password



# Deny requests to certain unsafe ports

http_access deny !Safe_ports



# Deny CONNECT to other than secure SSL ports

http_access deny CONNECT !SSL_ports



# We strongly recommend the following be uncommented to protect innocent

# web applications running on the proxy server who think the only

# one who can access services on "localhost" is a local user

#http_access deny to_localhost



#

# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS

#



# Example rule allowing access from your local networks.

# Adapt localnet in the ACL section to list your (internal) IP networks

# from where browsing should be allowed

http_access allow localnet

http_access allow localhost



# And finally deny all other access to this proxy

http_access deny all



# Squid normally listens to port 3128

http_port 3128



# Uncomment the line below to enable disk caching - path format is /cygdrive/, i.e.

#cache_dir aufs /cygdrive/d/squid/cache 3000 16 256





# Leave coredumps in the first cache dir

coredump_dir /var/cache/squid



# Add any of your own refresh_pattern entries above these.

refresh_pattern ^ftp:		1440	20%	10080

refresh_pattern ^gopher:	1440	0%	1440

refresh_pattern -i (/cgi-bin/|?) 0	0%	0

refresh_pattern .		0	20%	4320



dns_nameservers 8.8.8.8 208.67.222.222



max_filedescriptors 3200



 ※2 ユーザ/パスワードをroot/rootとした時のBasic認証のファイル(.htpasswd)の中身

root:/0ZQd5ttqDR8w

 

最後に

ローカルにhttpプロキシの環境が作成できてとても有難いなと思いました。

本番の通信環境とは異なる環境で開発することの方が多いので本番の通信環境に近い形でテストができるのはとても助かります。