Apache Solr 9.5.0健康检查返回401认证错误,求助排查
问题描述
我正在使用Apache Solr 9.5.0,执行以下健康检查命令:
solr/bib/solr run_tool healthcheck -zkHost "$ZK_HOST" -collection "$HEALTHCHECK_COLLECTION" $VERBOSE
返回错误如下:
-- RECENT {collection_name} INFO - 2024-12-18 12:32:04.867; org.apache.solr.util.configuration.SSLConfigurations; Setting javax.net.ssl.keyStorePassword INFO - 2024-12-18 12:32:04.873; org.apache.solr.util.configuration.SSLConfigurations; Setting javax.net.ssl.trustStorePassword ERROR: Error from server at https://localhost:25103/solr/dev-audit-2024_shard1_replica_n1/select?q=*%3A*&rows=0&_stateVer_=dev-audit-2024%3A111&wt=javabin&version=2: Expected mime type in [application/vnd.apache.solr.javabin, application/octet-stream] but got text/html. <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/> <title>Error 401 require authentication</title> </head> <body><h2>HTTP ERROR 401 require authentication</h2> <table> <tr><th>URI:</th><td>/solr/dev-audit-2024_shard1_replica_n1/select</td></tr> <tr><th>STATUS:</th><td>401</td></tr> <tr><th>MESSAGE:</th><td>require authentication</td></tr> <tr><th>SERVLET:</th><td>default</td></tr> </table> </body> </html>
我的配置如下:
security.json
{ "authentication":{ "class":"solr.CertAuthPlugin", "credentials":{"gmpsolr":"encrypted password"} }, "authorization":{ "class":"solr.RuleBasedAuthorizationPlugin", "user-role":{"gmpsolr":"admin"}, "permissions":[{"name":"all", "role":"admin"}] }}
启动参数
-DSTOP.KEY=solrrocks -DSTOP.PORT=24103 -DdisableAdminUI=false -Dhost=10.0.2.15 -Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager -Djavax.net.ssl.keyStore=/......../solr/server/etc/solr-ssl.keystore.jks -Djavax.net.ssl.keyStoreType=JKS -Djavax.net.ssl.trustStore=/......../solr/server/etc/solr-ssl.keystore.jks -Djavax.net.ssl.trustStoreType=JKS -Djdk.tls.ephemeralDHKeySize=2048 -Djdk.xml.xpathExprGrpLimit=0 -Djdk.xml.xpathExprOpLimit=0 -Djdk.xml.xpathTotalOpLimit=0 -Djetty.home=/......../solr-9.5.0/server -Djetty.port=25103 -Dlog4j2.formatMsgNoLookups=true -Dsolr.default.confdir=/......./solr-9.5.0/server/solr/configsets/_default/conf -Dsolr.http1=true -Dsolr.install.dir=/......./solr-9.5.0 -Dsolr.install.symDir=/......./solr -Dsolr.jetty.host=0.0.0.0 -Dsolr.jetty.https.port=25103 -Dsolr.jetty.inetaccess.excludes= -Dsolr.jetty.inetaccess.includes= -Dsolr.jetty.keystore.type=JKS -Dsolr.jetty.keystore=/......./solr/server/etc/solr-ssl.keystore.jks -Dsolr.jetty.ssl.needClientAuth=false -Dsolr.jetty.ssl.wantClientAuth=false -Dsolr.jetty.truststore.type=JKS -Dsolr.jetty.truststore=/......./solr/server/etc/solr-ssl.keystore.jks -Dsolr.keyStoreReload.enabled=true -Dsolr.log.dir=/......./log -Dsolr.log.muteconsole -Dsolr.max.booleanClauses=10000 -Dsolr.modules=scripting -Dsolr.solr.home=/......./dbs/recentNode -Dsolr.zk.embedded.host=0.0.0.0 -Duser.timezone=UTC -DzkClientTimeout=30000
同时curl命令可正常执行:
curl -u gmpsolr:password -k https://localhost:25103/solr/admin/collections?action=CLUSTERSTATUS
请问我是否遗漏了什么配置?
解决方案
问题核心是健康检查工具未携带认证信息,导致请求被Solr的认证插件拦截返回401。可以通过以下方式解决:
直接添加基本认证参数到命令
在健康检查命令中加入-basicAuth参数,指定用户名和明文密码,完整命令示例:solr/bib/solr run_tool healthcheck -zkHost "$ZK_HOST" -collection "$HEALTHCHECK_COLLECTION" $VERBOSE -basicAuth gmpsolr:your_plain_password通过配置文件传递认证信息
若不想在命令行明文暴露密码,可修改solr.in.sh(Linux)或solr.in.cmd(Windows)配置文件,添加以下环境变量:SOLR_AUTH_TYPE=basic SOLR_AUTHENTICATION_OPTS="-Dbasicauth=gmpsolr:your_plain_password"之后执行健康检查命令时,工具会自动读取该配置中的认证信息。
适配CertAuthPlugin的证书认证(可选)
你当前使用的solr.CertAuthPlugin支持证书认证,但健康检查工具默认不会自动加载客户端证书。若要使用证书认证,需在命令中添加SSL参数指定客户端证书路径,不过相比之下基本认证的方式更适配该工具的使用场景。
另外,虽然你的security.json已配置gmpsolr用户属于admin角色并拥有all权限,理论上权限无问题,但可额外验证该用户对目标集合的访问权限是否正常。
内容的提问来源于stack exchange,提问作者Aditya Mhetras
相关产品推荐
相关产品推荐

