从证书重写代理后面使用Mercurial和Bitbucket的配置?

时间:2012-01-24 17:51:36

标签: mercurial bitbucket

我正在尝试从工作中访问BitBucket。唯一的Internet访问是通过身份验证的HTTP代理,代理端口8080上的http和端口8070上的SSL。此代理对SSL连接进行中间人攻击,浏览器能够创建到Internet的HTTPS连接只是因为在所有客户端上安装了虚假的Websense证书。

我可以使用Git连接到BitBucket,但不能使用Mercurial。我正在使用Mercurial版本2.0.2。

使用Git我在.gitconfig中使用以下配置

[user]
    name = Firstname Lastname
    email = firstname_lastname@domain.co.uk
[http]
    proxy = http://name:password@nnn.nnn.nnn.nnn:8080

可以使用以下命令克隆存储库

D:\MercurialTesting>git clone http://Firstname_Lastname@bitbucket.org/Firstname_Lastname/bb102repo.git test1
Cloning into 'test1'...
Password for 'bitbucket.org':
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.

D:\MercurialTesting>

添加此配置设置

[http]
    sslverify = false

我也可以通过https网址https://Firstname_Lastname@bitbucket.org/Firstname_Lastname/bb102repo.git

克隆存储库

使用Mercurial虽然它是一个不同的故事。在mercurial.ini中使用以下配置

[http_proxy]
host = nnn.nnn.nnn.nnn:8080
user = firstname_lastname@domain.co.uk
passwd = password

Mercurial将在家中访问我自己的Mercurial服务器没问题。

D:\MercurialTesting>hg --debug clone http://nnn.nnn.nnn.nnn/hg/Workspaces/Test1
using http://nnn.nnn.nnn.nnn/hg/Workspaces/Test1
proxying through http://nnn.nnn.nnn.nnn:8080
sending capabilities command
http authorization required
realm: Mercurial Repositories
user: username
password:
http auth: user username, password *******
destination directory: Test1
query 1; heads
sending batch command
http auth: user username, password *******
requesting all changes
sending getbundle command
http auth: user username, password *******
adding changesets
changesets: 1 chunks
add changeset 711ff2c6f5b2
changesets: 2 chunks
add changeset 9034b963b4c1
. . .

使用完全相同的配置并尝试通过Mercurial访问BitBucket只是挂起。

D:\MercurialTesting>hg --debug clone http://bitbucket.org/Firstname_Lastname/bb101repo
using http://bitbucket.org/Firstname_Lastname/bb101repo
proxying through http://nnn.nnn.nnn.nnn:8080
sending capabilities command
abort: error: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond

D:\MercurialTesting>

通过网址https://bitbucket.org/Firstname_Lastname/bb101repo使用与SSL相同的配置Mercurial以完全相同的方式挂起。在此过程中,Wireshark根本检测不到任何网络活动。

更改Mercurial.ini中的设置以匹配代理服务SSL的端口无效。设置环境变量http_proxy没有区别,但设置环境变量https_proxy会完全改变输出。设置https_proxy并将--insecure添加到hg命令调用会导致:

D:\MercurialTesting>hg --debug clone http://bitbucket.org/Firstname_Lastname/bb101repo --insecure
using http://bitbucket.org/Firstname_Lastname/bb101repo
proxying through http://nnn.nnn.nnn.nnn:8080
sending capabilities command
warning: bitbucket.org certificate with fingerprint 79:ce:0d:30:b0:17:29:6a:d1:9f:dd:d3:62:80:70:28:5e:9f:c2:e3 not verified (check hostfingerprints or web.cacerts config setting)
http authorization required
realm: Bitbucket.org HTTP
user: Firstname_Lastname
password:
http auth: user Firstname_Lastname, password ***
warning: bitbucket.org certificate with fingerprint 79:ce:0d:30:b0:17:29:6a:d1:9f:dd:d3:62:80:70:28:5e:9f:c2:e3 not verified (check hostfingerprints or web.cacerts config setting)
abort: HTTP Error 502: Success

D:\MercurialTesting>

现在,Wireshark检测到我的工作站和代理服务器之间发生了交换。我发现最令人困惑的是,它没有丝毫差别我设置https_proxy ,hg总是使用Mercurial.ini中的http代理设置并产生相同的输出,无论我是否将https_proxy设置为SSL代理的正确详细信息或完成垃圾。唯一的区别是,如果环境变量https_proxy完全没有设置,那么hg就会挂起,如上所述。

我尝试过的https_proxy格式包括以下所有变体:

https_proxy=ip.ip.ip.ip:8070
https_proxy=ip.ip.ip.ip:8080
https_proxy=username:password@ip.ip.ip.ip:8070
https_proxy=username:password@ip.ip.ip.ip:8080
https_proxy=http://ip.ip.ip.ip:8070
https_proxy=http://ip.ip.ip.ip:8080
https_proxy=http://username:password@ip.ip.ip.ip:8070
https_proxy=http://username:password@ip.ip.ip.ip:8080

无论我将其设置为什么,结果都是一样的。

所以我真正可以使用的一些问题是:

为什么我可以在家中访问我的Mercurial存储库,但不能访问BitBucket?

为什么我可以使用Git访问BitBucket,但不能使用相同的配置访问Mercurial?

有没有人知道如何让这个工作或我接下来可以测试什么?

3 个答案:

答案 0 :(得分:2)

我也通过代理连接到bitbucket。由于我的设置没有按预期工作,我找到了这个SO条目。

我注意到如果我使用命令行参数,那么一切正常。

hg --config http_proxy.host=192.168.1.1:8080 --config http_proxy.user=Vad1mo --config http_proxy.passwd=secret clone https://bitbucket.org/Vadimo/test

另一方面,Mercurial.ini中的相同条目不起作用。

[http_proxy]
host = 192.168.1.1
port = 8080
user = Vad1mo
passwd = internet 

我偶然发现了CMD和ini之间的细微差别。在CMD中,端口被后缀固定到主机。在ini文件中,这是一个新条目。

将mercurial.ini更改为在命令行上将端口作为主机后缀解决了问题。

[http_proxy]
host = 192.168.1.1:8080
;port = 8080
user = Vad1mo
passwd = internet 

也许这也会对你有所帮助。

顺便说一句。我的hg版本是2.6.3

答案 1 :(得分:1)

我遇到了与我的工作代理相似的问题 - 实际上,几乎相同。

到目前为止,我已经解决了这个问题,方法是在mercurial.ini中设置http_proxy,然后通过HTTP地址hg.io连接到BitBucket。

例如,https://bitbucket.org/mattgwagner/mattgwagner.com上的我的存储库可以通过http://hg.io/mattgwagner/mattgwagner.com访问。当然,这将以明文形式发送您的密码和连接,但至少它让我联系。

当我在BitBucket上托管开源项目供我使用时,这对我来说更有用。

<强> Mercurial.ini
[HTTP_PROXY] host = 192.168.1.155:8080
不=
user = domainUsername
passwd =传递

答案 2 :(得分:0)

你能抽出来吗? Bitbucket支持ssh访问,如果允许,你的代理不会捣乱。