Can';无法使用Java API访问数据中心服务
我正在尝试使用JavaAPI在我的数据中心服务上执行搜索。不幸的是,服务器返回Can';无法使用Java API访问数据中心服务,java,marklogic,marklogic-dhf,Java,Marklogic,Marklogic Dhf,我正在尝试使用JavaAPI在我的数据中心服务上执行搜索。不幸的是,服务器返回未经授权的响应。 代码如下: public Object doSearch() throws NoSuchAlgorithmException, KeyManagementException { String user = *****; String password = ******; String db = "data-hub-FINAL"; String h
未经授权的响应。
代码如下:
public Object doSearch() throws NoSuchAlgorithmException, KeyManagementException {
String user = *****;
String password = ******;
String db = "data-hub-FINAL";
String host = "***********.marklogicsvc.com";
int port = 8011;
SecurityContext auth = new DatabaseClientFactory.DigestAuthContext(user, password).withSSLContext(SSLContext.getDefault());
DatabaseClient client = DatabaseClientFactory.newClient(host, port, db, auth);
try {
QueryManager qm = client.newQueryManager();
StructuredQueryBuilder qb = qm.newStructuredQueryBuilder();
qm.setPageLength(100);
var query = qb.collection("listings");
return qm.search(query, new SearchHandle());
} finally {
client.release();
}
}
我怀疑我使用了错误的凭据,但当我在Visual Studio Code Marklogic Extension中尝试它们时,效果很好,以下是我的VS代码设置和查询:
"marklogic.modulesDb": "data-hub-MODULES",
"marklogic.host": "*******.marklogicsvc.com",
"marklogic.password": *******,
"marklogic.username": *******,
"marklogic.ssl": true,
"marklogic.port": 8011
如果您告诉我我的Java代码有什么问题,我无法连接到DHS,我将非常高兴。我相信您需要使用BasicAuthContext而不是DigestAuthContext,因为DHS使用基本身份验证
我猜您的SSL配置很好,但以防万一——我知道文档只显示正在设置的SSLContext——但我通常会传入X509TrustManager,并调用“WissLHostNameVerifier(DatabaseClientFactory.SSLHostnameVerifier.ANY)”。您可以使用X509TrustManager的impl,它接受所有测试内容
但是首先尝试一下BasicAuthContext,看看这是否解决了问题。来自@rjrudin的答案是正确的,但是这里有一个完整的代码片段应该可以工作
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
X509TrustManager trustManager = new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
};
sslContext.init(null, new TrustManager[] { trustManager }, null);
return DatabaseClientFactory.newClient(
host, port,
new DatabaseClientFactory.BasicAuthContext(user, password).withSSLContext(sslContext, trustManager),
DatabaseClient.ConnectionType.GATEWAY
);
请注意DatabaseClient.ConnectionType.GATEWAY
参数,因为您是通过负载平衡器与DHS连接的
还请注意,这不是验证证书。对于生产实现,您希望信任管理器中的逻辑能够满足您的安全需求
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
X509TrustManager trustManager = new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
};
sslContext.init(null, new TrustManager[] { trustManager }, null);
return DatabaseClientFactory.newClient(
host, port,
new DatabaseClientFactory.BasicAuthContext(user, password).withSSLContext(sslContext, trustManager),
DatabaseClient.ConnectionType.GATEWAY
);