java - 设置 SOLR SSL 属性

标签 java apache ssl solr properties

当我使用提供的 Apache SOLR 启动脚本(版本 6.6.0)时,该脚本创建并执行一个 java 命令行,该命令行具有两组 SSL 属性,其相关元素设置为相同的值。一组的名称类似于 javax.net.ssl.*,而另一组的名称类似于 solr.jetty.*。例如:

java -server ... 
    -Dsolr.jetty.keystore.password=secret ...
    -Djavax.net.ssl.keyStorePassword=secret ...
    ... -jar start.jar --module=https

我们的安全团队不允许在命令行或环境变量中传递密码,但允许将密码放在文件中,前提是该文件具有受限的访问权限。我注意到在 solr/server/etc 目录下有一个 jetty-ssl.xml 文件,可以用来为所有的 solr 提供默认值。 jetty.* 属性,包括 solr.jetty.keystore.password。当我从 java 命令行中删除所有 javax.net.ssl.keyStorePasswordsolr.jetty.keystore.password 属性并更新 jetty-ssl 时。使用我的 keystore 密码打开 xml 文件,SOLR 似乎以该文件中包含的默认 keystore 密码开始。然后,我可以将浏览器连接到 https://localhost:8983/solr/# 并正常访问 SOLR 管理页面。

是否在 SOLR 独立产品或 SOLR 云产品中使用了 javax.net.ssl.* 属性?它们是否在浏览器之外的幕后使用到 SOLR 服务器连接以连接到 zookeeper 等其他进程?我在源代码中看到的对它们的唯一引用是在作为 solrj 客户端一部分的 solr 嵌入式代码中。

最佳答案

是的,solr.jetty 服务器端和 javax.net.ssl.* 客户端属性都被 SOLR 使用。对于某些操作,如集合创建,SOLR 似乎连接到自身,当它这样做时,它会尝试通过 SSL 与 javax.net.ssl.* 属性值连接。

就避免在命令行或环境变量中传递属性而言,我提出的解决方案是创建一个只有 premain 方法的 javaagent 类。在这个在 start.jar 中的 main 之前运行的 premain 方法中,我读取了一个包含“ secret ”SSL 属性的属性文件,例如 javax.net.ssl.keyStorePassword。然后代理将该键/值添加到 Java 系统属性。

因此,当 main 启动时,所有 SSL 属性都是已知的,并且没有暴露给命令行或环境变量。显然,必须限制属性文件的所有权和权限以维护安全性。可以将以下内容添加到 SOLR java 命令行,以确保代理运行并可以访问属性文件作为参数:

java -javaagent:ssl-agent.jar=/path/to/ssl/properties/file ... -jar start.jar ... 

参见 here有关编写 Java 代理的信息。

关于java - 设置 SOLR SSL 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48086035/

相关文章:

java - Application Client <-> EJB calls round-trip 似乎很慢

Apache ErrorDocument 404 位于没有 .htaccess 的子目录中

java - 默认 SSL 上下文初始化失败 : null

ssl - Nginx 代理通行证不适用于 SSL

ssl - 自签名 SSL 证书时如何避免浏览器警告?

java - 绕点 java 旋转三角形

java - 如何在 JavaFX 的 TitledPane 中更改 header 组件

java - 如何更改 Jbutton 的大小而不更改其所在的 Jpanel 的大小?

apache - 如何更改 solr 中的日期格式 yyyy-mm-ddThh :mm:ssZ into "yyyy-mm-dd"?

php - 我可以像这样重写我的 URL,这是个好主意吗?