问题描述
我正在尝试在本地graphDB实例(Windows上为GraphDB Free 9.4.1)上执行以下SPARQL查询。
PREFIX wd: <http://www.wikidata.org/entity/>
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT * WHERE {
SERVICE <https://query.wikidata.org/sparql> {
?subj wdt:P31 wd:Q744913 ;
wdt:P625 ?coord ;
rdfs:label ?label
FILTER (lang(?label) = "en")
}
}
查询在我的个人计算机上没有问题。 但是在我的公司网络中却没有,因为我们有代理。
我使用RDF4J-Java程序检查了我的代理设置,它们工作正常。
[...]
System.setProperty("https.proxyHost","<company_proxy>");
System.setProperty("https.proxyPort","<company_proxy_port>");
System.setProperty("https.nonProxyHost","localhost|127.0.0.1|<company_list>");
System.setProperty("https.proxyUser","<user>");
System.setProperty("https.proxyPassword","<password>");
[...]
我试图通过不同的方法为GraphDB设置相同的设置
- 通过用户界面
- 通过
C:\Users\XXXX\AppData\Local\GraphDB Free\runtime\conf\net
配置文件 - 通过
C:\Users\XXXX\AppData\Roaming\GraphDB\conf\proxy.properties
配置文件 - 通过
C:\Users\XXXX\AppData\Local\GraphDB Free\app\
配置文件
所有人都对配置做一些事情,这意味着我现在看到一条错误消息,并且不再有连接超时。由于我已经使用RDF4J验证了设置,所以我猜问题是我如何应用配置,或者解析配置时出现问题。
编辑: 我收到状态码407,需要代理身份验证。 我猜,graphDB不接受属性https.proxyUser和https.proxyPassword。
有人有同样的问题并且有解决方案吗?或者我该如何进一步调试此问题?
ps。我的密码包含“!”字符。这可能是问题吗?我尝试了所有我想到的转义机制(!,^ !,^^ !,都在“”中),但都没有起作用。
编辑2.0: 来自onttext的家伙发现了一个错误,该错误已在9.5.0-TR14版本中修复。 此问题中提到的代理配置现在可以使用。
解决方法
与代理服务器模拟问题的最接近的方案是:
- 下载并安装mitmproxy服务器
- 为所有Java程序信任mitmproxy的证书,以便GraphDB可以使用HTTPS连接到代理
# ~/.mitmproxy/mitmproxy-ca-cert.cer is the certificate shipped with the proxy
sudo keytool -importcert -file ~/.mitmproxy/mitmproxy-ca-cert.cer -alias mitmproxy -keystore $JAVA_HOME/jre/lib/security/cacerts
- 使用用户名和密码启动代理服务器
# The proxy will require username and password
mitmproxy --set proxyauth=testUser:testPassword
- 启动GraphDB并将其指向本地mitmproxy服务器:
# Point the Apache HTTP Client to use the mitmproxy
./graphdb -Dhttps.proxyHost=localhost -Dhttps.proxyPort=8080 -Dhttps.proxyUser=testUser -Dhttps.proxyPassword=testPassword
这时,我能够重现HTTP 407错误,其中GraphDB的HTTPS客户端无法与代理服务器协商身份验证过程。相同的过程对于HTTP协议也可以正常工作,因此这就是我所要解决的问题,它通过同时指定https.proxyUser
及其等效的http.proxyUser
来克服此故障。该示例可与您的查询和mitmproxy服务器配合使用:
# Setup not only HTTPS but also HTTP connection
/graphdb -Dhttps.proxyHost=localhost -Dhttps.proxyPort=8080 -Dhttps.proxyUser=testUser -Dhttps.proxyPassword=testPassword -Dhttp.proxyHost=localhost -Dhttp.proxyPort=8080 -Dhttp.proxyUser=testUser -Dhttp.proxyPassword=testPassword
,
您可以尝试做的是将'graphdb.workbench.external-url'参数设置为实例应驻留的任何URL /子路径。此参数用于重写传入的请求,并且可以帮助进行API调用。