
我已經在工作中安裝了 ActivePerl 和 include PPM,但無法透過代理將其連接到模組儲存庫。我已經設定了環境變量
HTTP_PROXY = http://user:[email protected]:port
但PPM仍顯示407錯誤需要代理身份驗證。我認為這是一個 NTLM 代理,但我不確定。
做完之後這,我得到一個錯誤 500:主機名稱錯誤為了ppm4.activestate.com。結果 PPM 要求我的 DNS 伺服器解析該名稱,但我的本機 DNS 伺服器無法解析此類外部網域名稱。只有代理才會做這樣的事情,並且只針對 HTTP 流量...
以下是 Wireshark(在同一個 Windows XP 機器上的 BackTrack VM 上執行)所顯示的螢幕截圖:
我的 Windows 盒子是10.75.82.221 DNS 伺服器是10.7.3.110
這是 TraceRoute 從 Windows 顯示的內容:
G:\>tracert ppm4.activestate.com
No se puede resolver el nombre de destino ppm4.activestate.com.
意思是:
無法解析 ppm4.activestate.com
正如預期的那樣。
正如我在評論中所說,瀏覽器似乎沒有啟動任何 DNS 查詢。下面是 Wireshark 螢幕截圖(來自 BT),顯示了從 Firefox(來自 WXP)對 www.google.es 的存取:
我的 Windows 盒子是10.75.82.221 代理是10.7.8.46
正如你所看到的,透過瀏覽器存取時沒有任何 DNS 查詢...
對我來說,這似乎是一項安全功能,我必須請求許可才能使用 ActiveState 的 PPM 工具...這是不合理的,即使我在這裡製作的大多數(99%)腳本都是為了加速工作。
答案1
perl.org 中描述了解決錯誤 407問題與解答:
問:即使 http_proxy 設定為具有正確憑證的正確伺服器(使用約定使用者名稱:[電子郵件受保護]:port) 我仍然無法透過 cpan 安裝軟體包。 “LWP 失敗,代碼為 [407] 訊息[需要代理身份驗證(ISA 伺服器需要授權才能完成請求。對 Web 代理服務的存取被拒絕。)]”
A:CPAN 不支援 NTLM 身份驗證,並且很難讓 Authen::NTLM 與 CPAN 配合使用。我最終使用 ntlmaps 作為 NTLM 驗證的本機代理程式。
您需要做的第一件事是從他們的 svn 儲存庫中取得最新版本的 NTLMAPS,並將其提取到某個地方。接下來,您需要取得最新版本的 python 並安裝它。開啟 NTLMAPS 的 server.cfg,將 PARENT_PROXY 設定為代理程式的位址或 IP,將 PARENT_PROXY_PORT 設為代理執行的連接埠(通常為 80 或 8080),將 NT_DOMAIN 設為您的網域,將 USER 設為您的使用者名稱。
運行runserver.bat。它將詢問您的密碼,輸入密碼並按 Enter 鍵。接下來,您必須配置 cpan 以使用 NTLMAPS 作為代理。前往strawberry\perl\lib\CPAN 並開啟Config.pm。將 http_proxy 設定為 http://本地主機:5865。運行 CPAN 並像平常一樣使用它。現在您只需在執行 CPAN 之前啟動 NTLMAPS 即可使其正常運作。
請注意,您可能需要強制 LM + NT 驗證而不是 LM;為此,請開啟 NTLMAPS server.cfg,將 NT_PART 設為 1,將 NTLM_FLAGS 設為 07820000。
依照所述刪除 HTTP_PROXY 並修改 CPAN/Config.pm 可能會解決該問題。
以下評論摘要:
對wireshark轉儲的研究表明,ActivePerl發出DNS請求,這些請求被DNS伺服器傳回為未知。可能的解決方案只有:
- 重新配置DNS伺服器(對於發布者來說是不可能的)
- 發起請求ActiveState 社群網站停止這些徒勞的請求(不保證任何迅速的緩解)
- 手動下載並安裝模組(只剩下實用的解決方案)。
答案2
如果是 NTLM,則需要NTLM
Perl 模組。 ActiveState PPM 文件說您可以ppmx
從儲存庫,但我找不到任何這樣的連結。但是,您仍然可以下載ppd
和tar.gz
文件並安裝它們:
wget http://ppm4.activestate.com/MSWin32-x86/5.12/1205/N/NB/NBEBOUT/NTLM-1.09.ppd
wget http://ppm4.activestate.com/MSWin32-x86/5.12/1205/N/NB/NBEBOUT/NTLM-1.09.tar.gz
ppm install NTLM-1.09.ppd
另請注意,如果您的電腦屬於 Windows 網域,則不需要明確提供憑證 -http://proxy.full.name:port
除了更安全之外,對於 NTLM/Kerberos 來說應該足夠了。
最近,Microsoft 軟體已從 NTLM 切換到 Kerberos – 儘管通常代理程式都支援這兩種協議,但它能發生 NTLM 將在您的系統中被停用。關於使用 PPM 的 Kerberos 代理程式的文檔並不多,但HTTP-Negotiate
如果您無法使 NTLM 工作,則可能值得嘗試。
答案3
這是一次黑暗中的嘗試......沒有人提到嘗試這個,但聽起來每個人都沒有想法......如果這是真的:
"Turns out PPM asks my DNS server to resolve that name, but my local DNS server cannot resolve such external domain names."
然後編輯:
C:\Windows\System32\Drivers\etc\hosts
新增行:
204.244.102.19 ppm4.activestate.com
看看是否有什麼不同。
對於 ntlmaps 故障排除:
server.cfg 中有兩個選項 DEBUG 和 BIN_DEBUG,如果您的伺服器出現問題,請在請求問題頁面(或資源)之前將這些選項設為 DEBUG:1 和 BIN_DEBUG:1。您必須重新啟動代理伺服器才能重新讀取 server.cfg。這將為每個 http 請求提供 3 個日誌檔案(確切地說是每個連線),例如 127.0.0.1-1048、127.0.0.1-1048.bin.client 和 127.0.0.1-1048.bin.rserver。第一個包含有關 APS 所做操作的信息,另外兩個包含來自客戶端和代理的原始流量。
答案4
而不是設定 http_proxy =http://用戶:[電子郵件受保護]:港口,只需嘗試設定代理程式而不使用使用者名稱和密碼。
做就是了:
設定 http_proxy =http://proxy.full.name:端口
原因:我在某處讀到,對於最新版本的 Perl 5.22,不需要代理身份驗證。它對我來說就像魔法一樣有效。
希望它能解決您的問題。