graphDB用户/ PW代理设置导致状态码407

问题描述

我正在尝试在本地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版本中修复。 此问题中提到的代理配置现在可以使用。

解决方法

与代理服务器模拟问题的最接近的方案是:

  1. 下载并安装mitmproxy服务器
  2. 为所有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
  1. 使用用户名和密码启动代理服务器
# The proxy will require username and password
mitmproxy --set proxyauth=testUser:testPassword  
  1. 启动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调用。