啟用 SSL
Solr 可以使用安全通訊端層加密 (SSL) 來加密用戶端與伺服器之間,以及 SolrCloud 模式中節點之間的通訊。
本節說明如何使用自我簽署憑證啟用 SSL。
如需 SSL 憑證和金鑰的背景資訊,請參閱 http://www.tldp.org/HOWTO/SSL-Certificates-HOWTO/。
設定 Solr 以使用 SSL
產生自我簽署憑證和金鑰
若要產生自我簽署憑證和單一金鑰 (將用於驗證伺服器和用戶端),我們將使用 JDK keytool
命令,並建立個別的金鑰儲存庫。此金鑰儲存庫也將在下方用作信任儲存庫。可以使用 JDK 隨附的金鑰儲存庫來達到這些目的,並使用個別的信任儲存庫,但這裡不會說明這些選項。
在二進位 Solr 發行版本的 server/etc/
目錄中執行下列命令。假設您的 PATH
中有 JDK keytool
公用程式,且 openssl
也在您的 PATH
中。如需 Windows 和 Solaris 的 OpenSSL 二進位檔,請參閱 https://wiki.openssl.org/index.php/Binaries。
-ext SAN=…
keytool
選項可讓您指定所有 DNS 名稱和/或 IP 位址,如果您選擇需要,將在主機名稱驗證期間允許這些名稱或位址。
除了 localhost
和 127.0.0.1
之外,此範例還包含 Solr 節點將在其中執行的機器的 LAN IP 位址 192.168.1.3
。
$ keytool -genkeypair -alias solr-ssl -keyalg RSA -keysize 2048 -keypass secret -storepass secret -validity 9999 -keystore solr-ssl.keystore.p12 -storetype PKCS12 -ext SAN=DNS:localhost,IP:192.168.1.3,IP:127.0.0.1 -dname "CN=localhost, OU=Organizational Unit, O=Organization, L=Location, ST=State, C=Country"
上述命令將在目前目錄中建立名為 solr-ssl.keystore.p12
的金鑰儲存庫檔案。
將憑證和金鑰轉換為 PEM 格式以搭配 curl 使用
使用 openssl
命令,將包含憑證和金鑰的 PKCS12 格式金鑰儲存庫轉換為 PEM 格式。
$ openssl pkcs12 -in solr-ssl.keystore.p12 -out solr-ssl.pem
如果您想在 OS X Yosemite (10.10) 上使用 curl,您需要建立一個僅包含憑證的 PEM 格式版本,如下所示:
$ openssl pkcs12 -nokeys -in solr-ssl.keystore.p12 -out solr-ssl.cacert.pem
設定常見的 SSL 相關系統屬性
Solr 控制腳本已設定為將 SSL 相關的 Java 系統屬性傳遞給 JVM。要啟用 SSL 設定,請取消註解並更新在 *nix 系統上的 bin/solr.in.sh
或 Windows 上的 bin\solr.in.cmd
中以 SOLR_SSL_*
開頭的屬性。
-
*nix
-
Windows
如果您使用將 Solr 投入生產中概述的步驟在 Linux 上將 Solr 設定為服務,則請在 /var/solr/solr.in.sh 中進行這些變更。 |
# Enables HTTPS. It is implicitly true if you set SOLR_SSL_KEY_STORE. Use this config
# to enable https module with custom jetty configuration.
SOLR_SSL_ENABLED=true
# Uncomment to set SSL-related system properties
# Be sure to update the paths to the correct keystore for your environment
SOLR_SSL_KEY_STORE=etc/solr-ssl.keystore.p12
SOLR_SSL_KEY_STORE_PASSWORD=secret
SOLR_SSL_TRUST_STORE=etc/solr-ssl.keystore.p12
SOLR_SSL_TRUST_STORE_PASSWORD=secret
# Require clients to authenticate
SOLR_SSL_NEED_CLIENT_AUTH=false
# Enable clients to authenticate (but not require)
SOLR_SSL_WANT_CLIENT_AUTH=false
# SSL Certificates contain host/ip "peer name" information that is validated by default. Setting
# this to false can be useful to disable these checks when re-using a certificate on many hosts.
# This will also be used for the default value of whether SNI Host checking should be enabled.
SOLR_SSL_CHECK_PEER_NAME=true
REM Enables HTTPS. It is implicitly true if you set SOLR_SSL_KEY_STORE. Use this config
REM to enable https module with custom jetty configuration.
set SOLR_SSL_ENABLED=true
REM Uncomment to set SSL-related system properties
REM Be sure to update the paths to the correct keystore for your environment
set SOLR_SSL_KEY_STORE=etc/solr-ssl.keystore.p12
set SOLR_SSL_KEY_STORE_PASSWORD=secret
set SOLR_SSL_TRUST_STORE=etc/solr-ssl.keystore.p12
set SOLR_SSL_TRUST_STORE_PASSWORD=secret
REM Require clients to authenticate
set SOLR_SSL_NEED_CLIENT_AUTH=false
REM Enable clients to authenticate (but not require)
set SOLR_SSL_WANT_CLIENT_AUTH=false
REM SSL Certificates contain host/ip "peer name" information that is validated by default. Setting
REM this to false can be useful to disable these checks when re-using a certificate on many hosts.
REM This will also be used for the default value of whether SNI Host checking should be enabled.
set SOLR_SSL_CHECK_PEER_NAME=true
用戶端驗證設定 啟用 SOLR_SSL_NEED_CLIENT_AUTH 或 SOLR_SSL_WANT_CLIENT_AUTH ,但不要同時啟用兩者。它們是互斥的,Jetty 會選擇其中一個,而這可能不是您所預期的。如果您想停用用戶端憑證的主機名稱驗證,則應將 SOLR_SSL_CLIENT_HOSTNAME_VERIFICATION 設定為 false。 |
當您啟動 Solr 時,bin/solr
腳本會包含這些設定,並將它們作為系統屬性傳遞給 JVM。
如果您是在使用者管理的叢集或單節點安裝中執行 Solr,您可以跳到啟動使用者管理的叢集或單節點 Solr。
但是,如果您使用 SolrCloud,則需要在啟動 Solr 之前設定 ZooKeeper。
透過 Hadoop 憑證儲存庫進行密碼發佈
Solr 支援從 Hadoop 憑證儲存庫讀取金鑰儲存庫和信任儲存庫的密碼。如果密碼輪換和發佈已由憑證儲存庫處理,則此方法可能很有益。
如果您未使用 Hadoop 憑證儲存庫,則可以跳過此步驟。
可以使用以下兩個步驟將 Hadoop 憑證儲存庫與 Solr 搭配使用。
提供 Hadoop 憑證儲存庫
建立 Hadoop 憑證儲存檔案,並使用實際的金鑰儲存庫密碼定義以下項目。
solr.jetty.keystore.password
solr.jetty.truststore.password
javax.net.ssl.keyStorePassword
javax.net.ssl.trustStorePassword
請注意,如果未設定 javax.net.ssl.*
設定,它們將回退到對應的 solr.jetty.*
設定。
設定 Solr 以使用 Hadoop 憑證儲存庫
Solr 需要設定三個參數才能使用憑證儲存檔案作為金鑰儲存庫密碼。
solr.ssl.credential.provider.chain
-
必要
預設值:無
憑證提供者鏈。應將其設定為
hadoop
。 SOLR_HADOOP_CREDENTIAL_PROVIDER_PATH
-
必要
預設值:無
憑證儲存檔案的路徑。
HADOOP_CREDSTORE_PASSWORD
-
必要
預設值:無
憑證儲存庫的密碼。
-
*nix
-
Windows
SOLR_OPTS=" -Dsolr.ssl.credential.provider.chain=hadoop"
SOLR_HADOOP_CREDENTIAL_PROVIDER_PATH=localjceks://file/home/solr/hadoop-credential-provider.jceks
HADOOP_CREDSTORE_PASSWORD="credStorePass123"
set SOLR_OPTS=" -Dsolr.ssl.credential.provider.chain=hadoop"
set SOLR_HADOOP_CREDENTIAL_PROVIDER_PATH=localjceks://file/home/solr/hadoop-credential-provider.jceks
set HADOOP_CREDSTORE_PASSWORD="credStorePass123"
設定 ZooKeeper
在建立上述金鑰儲存庫之後,以及在您啟動任何 SolrCloud 節點之前,您必須在 ZooKeeper 中設定 Solr 叢集屬性,以便 Solr 節點知道透過 SSL 進行通訊。
本節假設您已建立並啟動外部 ZooKeeper。如需更多資訊,請參閱ZooKeeper 集成設定。
在任何 Solr 節點啟動之前,需要將叢集範圍的 urlScheme
屬性設定為 https
。以下範例使用 Solr 隨附的 zkcli
工具來執行此操作。
-
*nix
-
Windows
$ bin/solr cluster --property urlSchema --value https -z server1:2181,server2:2181,server3:2181
C:\> bin/solr.cmd --property urlSchema --value https -z server1:2181,server2:2181,server3:2181
請務必為您的系統使用正確的 zkhost
值。如果您已設定 ZooKeeper 集成以使用 Solr 的 chroot,請務必將其包含在 zkHost
字串中,例如,--zk-host server1:2181,server2:2181,server3:2181/solr
。
更新現有集合的叢集屬性
如果您使用 SolrCloud 並且在啟用 SSL 之前建立了集合,則需要更新叢集屬性以使用 HTTPS。
如果您沒有現有集合或未使用 SolrCloud,則可以跳到前面並啟動 Solr。
可以使用 Collections API 的 CLUSTERPROP 命令來更新叢集屬性,如以下範例所示(請根據您的系統適當地更新主機名稱和連接埠)
$ https://127.0.0.1:8983/solr/admin/collections?action=CLUSTERPROP&name=urlScheme&val=https
此命令只需要在叢集的一個節點上執行,變更將會套用到所有節點。
完成此步驟和所有其他步驟後,您可以繼續啟動 Solr。
啟用 SSL 後啟動 Solr
啟動使用者管理的叢集或單節點 Solr
使用以下範例中所示的 Solr 控制腳本啟動 Solr。根據需要自訂顯示的參數值,並新增您在系統中使用的任何參數。
-
*nix
-
Windows
$ bin/solr start -p 8984
C:\> bin\solr.cmd -p 8984
啟動 SolrCloud
如果您在 solr.in.sh /solr.in.cmd 中定義了 ZK_HOST (請參閱更新 Solr 包含檔案),則可以從以下所有 bin/solr /bin\solr.cmd 命令中省略 -z <zk host string> 。 |
使用以下範例中所示的 Solr 控制腳本啟動每個 Solr 節點。根據需要自訂顯示的參數值,並新增您在系統中使用的任何參數。
如果您在建立 SSL 金鑰時沒有包含所有執行 Solr 節點的 DNS 名稱或 IP 位址,則可以透過設定 -Dsolr.ssl.checkPeerName=false
系統屬性來告知 Solr 跳過節點間通訊的主機名稱驗證。
-
*nix
-
Windows
$ bin/solr start --cloud -s cloud/node1 -z server1:2181,server2:2181,server3:2181 -p 8984
C:\> bin\solr.cmd --cloud -s cloud\node1 -z server1:2181,server2:2181,server3:2181
自動重新載入金鑰儲存庫/信任儲存庫
Solr 伺服器
當憑證更新時,Solr 可以自動重新載入金鑰儲存庫/信任儲存庫,而無需重新啟動。預設情況下,使用 SSL 時會啟用此功能,但可以透過將環境變數 SOLR_SSL_RELOAD_ENABLED
設定為 false
來停用此功能。預設情況下,Solr 將每 30 秒檢查金鑰儲存庫是否有更新,但可以在啟動時透過傳遞系統屬性 solr.jetty.sslContext.reload.scanInterval
並指定新的間隔(以秒為單位)來更新此間隔。請注意,不會主動監控信任儲存檔案,因此如果您需要將變更套用到信任儲存庫,則需要更新它,然後接觸金鑰儲存庫以觸發重新載入。
SolrJ 用戶端
Http2SolrClient builder 有一個方法 withKeyStoreReloadInterval(long interval, TimeUnit unit)
可初始化一個掃描器,該掃描器將監視並更新金鑰儲存庫和信任儲存庫的變更。如果您使用的是 CloudHttp2SolrClient,則可以使用 withInternalClientBuilder(Http2SolrClient.Builder internalClientBuilder)
將內部 http 用戶端設定為金鑰儲存庫重新載入間隔。最小重新載入間隔為 1 秒。如果未設定(或設定為 0 或負值),則不會在用戶端中更新金鑰儲存庫/信任儲存庫。
用戶端動作範例
OS X Mavericks (10.9) 上的 curl 降低了 SSL 支援。如需更多資訊和允許單向 SSL 的解決方法,請參閱 https://curl.se/mail/archive-2013-10/0036.html。OS X Yosemite (10.10) 上的 curl 已改進 - 可以進行雙向 SSL - 請參閱 https://curl.se/mail/archive-2014-10/0053.html。 以下各節中的 curl 命令將無法在 OS X Yosemite (10.10) 上使用系統
|
如果您的作業系統不包含 curl,您可以在此處下載二進位檔案:https://curl.se/download.html |
使用 bin/solr 建立 SolrCloud 集合
使用 _default
configset 建立名為 mycollection 的 2 個分片、replicationFactor=1 的集合
-
*nix
-
Windows
bin/solr create -c mycollection --shards 2
bin\solr.cmd create -c mycollection --shards 2
create
動作會將包含檔案中設定的 SOLR_SSL_*
屬性傳遞給用於建立集合的 SolrJ 程式碼。
使用 curl 擷取 SolrCloud 叢集狀態
要取得產生的叢集狀態(再次,如果您尚未啟用用戶端驗證,請移除 -E solr-ssl.pem:secret
選項)
$ curl -E solr-ssl.pem:secret --cacert solr-ssl.pem "https://127.0.0.1:8984/solr/admin/collections?action=CLUSTERSTATUS&indent=on"
您應該會收到如下所示的回應
{
"responseHeader":{
"status":0,
"QTime":2041},
"cluster":{
"collections":{
"mycollection":{
"shards":{
"shard1":{
"range":"80000000-ffffffff",
"state":"active",
"replicas":{"core_node1":{
"state":"active",
"base_url":"https://127.0.0.1:8984/solr",
"core":"mycollection_shard1_replica1",
"node_name":"127.0.0.1:8984_solr",
"leader":"true"}}},
"shard2":{
"range":"0-7fffffff",
"state":"active",
"replicas":{"core_node2":{
"state":"active",
"base_url":"https://127.0.0.1:7574/solr",
"core":"mycollection_shard2_replica1",
"node_name":"127.0.0.1:7574_solr",
"leader":"true"}}}},
"router":{"name":"compositeId"},
"replicationFactor":"1"}},
"properties":{"urlScheme":"https"}}}
使用 bin/solr post 索引文件
使用 bin/solr post
將一些範例文件索引到上面建立的 SolrCloud 集合
$ bin/solr post --solr-update-url https://127.0.0.1:8984/solr/mycollection/update example/exampledocs/*.xml
使用 curl 查詢
使用 curl 從包含上面建立的 PEM 格式憑證和金鑰的目錄(例如,example/etc/
)查詢上面建立的 SolrCloud 集合。如果您尚未啟用用戶端驗證(系統屬性 -Djetty.ssl.clientAuth=true
),則可以移除 -E solr-ssl.pem:secret
選項
$ curl -E solr-ssl.pem:secret --cacert solr-ssl.pem "https://127.0.0.1:8984/solr/mycollection/select?q=*:*"
使用 CloudSolrClient 索引文件
從使用 SolrJ 的 Java 用戶端索引文件。在下面的程式碼中,javax.net.ssl.*
系統屬性是以程式設計方式設定的,但您也可以在 Java 命令列上指定它們,如上面的 post.jar
範例所示
System.setProperty("javax.net.ssl.keyStore", "/path/to/solr-ssl.keystore.p12");
System.setProperty("javax.net.ssl.keyStorePassword", "secret");
System.setProperty("javax.net.ssl.keyStoreType", "pkcs12");
System.setProperty("javax.net.ssl.trustStore", "/path/to/solr-ssl.keystore.p12");
System.setProperty("javax.net.ssl.trustStorePassword", "secret");
System.setProperty("javax.net.ssl.trustStoreType", "pkcs12");
String zkHost = "127.0.0.1:2181";
CloudSolrClient client = new CloudSolrClient.Builder(Collections.singletonList(zkHost),Optional.empty()).withDefaultCollection("mycollection").build();
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", "1234");
doc.addField("name", "A lovely summer holiday");
client.add(doc);
client.commit();