Solr使用自簽名證書啟啟用S??SL

2018-12-20 15:22 更新

Solr可以使用SSL對客戶端和 SolrCloud 模式下的節(jié)點之間的通信進行加密。

本節(jié)介紹如何使用自簽名證書啟用SSL。

有關SSL證書和密鑰的背景信息,請參閱http://www.tldp.org/HOWTO/SSL-Certificates-HOWTO/。

基本的SSL設置

生成自簽名證書和密鑰

要生成自簽名證書和將用于對服務器和客戶端進行身份驗證的單個密鑰,我們將使用JDK keytool命令并創(chuàng)建一個單獨的密鑰庫。這個密鑰庫也將被用作下面的信任庫。為了實現這些目的,可以使用JDK附帶的密鑰庫,并使用單獨的信任庫,但這些選項不在此處介紹。

在二進制Solr發(fā)行版的server/etc/目錄中運行以下命令。假設您的PATH中有JDK keytool實用程序,那openssl也在您的PATH中。有關Windows和Solaris的OpenSSL二進制文件,請參閱https://www.openssl.org/related/binaries.html。

該-ext SAN=…? keytool選項允許您指定在主機名驗證期間允許的使用所有DNS名稱或IP地址(但請參閱下面的內容,了解如何跳過Solr節(jié)點之間的主機名驗證,以便您不必在此指定所有主機)。

除了localhost和127.0.0.1,這個示例包括LAN IP地址192.168.1.3,用于 Solr 節(jié)點將在其上運行的計算機:

keytool -genkeypair -alias solr-ssl -keyalg RSA -keysize 2048 -keypass secret -storepass secret -validity 9999 -keystore solr-ssl.keystore.jks -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"

上面的命令將在當前目錄中創(chuàng)建一個命名為solr-ssl.keystore.jks的密鑰庫文件。

將證書和密鑰轉換為PEM格式以便與curl一起使用

curl不能使用JKS格式的密鑰庫,所以JKS密鑰庫需要轉換為curl可以理解的PEM格式。

首先使用以下keytool命令將JKS密鑰庫轉換為PKCS12格式:

keytool -importkeystore -srckeystore solr-ssl.keystore.jks -destkeystore solr-ssl.keystore.p12 -srcstoretype jks -deststoretype pkcs12

keytool應用程序將提示您創(chuàng)建目標密鑰庫密碼和創(chuàng)建密鑰庫時設置的源密鑰庫密碼(上面示例中的“secret”)。

接下來,使用以下openssl命令將PKCS12格式的密鑰庫(包括證書和密鑰)轉換為PEM格式:

openssl pkcs12 -in solr-ssl.keystore.p12 -out solr-ssl.pem

如果要在OS X Yosemite(10.10)上使用curl,則需要創(chuàng)建PEM格式的證書版本,如下所示:

openssl pkcs12 -nokeys -in solr-ssl.keystore.p12 -out solr-ssl.cacert.pem

設置常見的SSL相關系統(tǒng)屬性

Solr控制腳本已經設置為將與SSL相關的Java系統(tǒng)屬性傳遞給JVM。要激活SSL設置,請取消注釋并更新bin/solr.in.sh 中的以 SOLR_SSL_ *開始的一組屬性。(或 Windows 上的bin\solr.in.cmd)。

如果使用將Solr轉換為Production的步驟將Solr設置為Linux上的服務,請在/var/solr/solr.in.sh中改為使用這些更改。

bin / solr.in.sh示例SOLR_SSL_ *配置:

SOLR_SSL_KEY_STORE=etc/solr-ssl.keystore.jks
SOLR_SSL_KEY_STORE_PASSWORD=secret
SOLR_SSL_TRUST_STORE=etc/solr-ssl.keystore.jks
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
# Define Key Store type if necessary
SOLR_SSL_KEY_STORE_TYPE=JKS
SOLR_SSL_TRUST_STORE_TYPE=JKS

當您啟動Solr時,bin/solr腳本將包含這些設置,bin/solr.in.sh并將這些SSL相關的系統(tǒng)屬性傳遞給JVM。

客戶端驗證設置
啟用S??OLR_SSL_NEED_CLIENT_AUTH或SOLR_SSL_WANT_CLIENT_AUTH,但不能同時使用兩者。他們是相互排斥的,碼頭將選擇其中一個可能不是你所期望的。

同樣,當您在Windows上啟動Solr時,bin\solr.in.cmd中的bin\solr.cmd腳本將包含以下設置:取消注釋并更新SOLR_SSL_*以將這些SSL相關的系統(tǒng)屬性傳遞給JVM 開始的屬性集:

bin \ solr.in.cmd示例SOLR_SSL_ *配置:

set SOLR_SSL_KEY_STORE=etc/solr-ssl.keystore.jks
set SOLR_SSL_KEY_STORE_PASSWORD=secret
set SOLR_SSL_TRUST_STORE=etc/solr-ssl.keystore.jks
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

使用SSL運行單節(jié)點Solr

使用下面的命令啟動Solr; 默認情況下,客戶端不需要認證:

  • * nix 命令:
  • bin/solr -p 8984
  • Windows命令:
  • bin\solr.cmd -p 8984

SSL與SolrCloud

本節(jié)介紹如何運行沒有初始集合的雙節(jié)點SolrCloud集群以及單節(jié)點外部ZooKeeper。以下命令假定您已經創(chuàng)建了上述密鑰庫。

配置ZooKeeper


管理員不支持像 Solr 這樣的客戶進行加密通信。有幾個相關的 JIRA 門票, SSL 支持正在計劃/工作: ZOOKEEPER-235;ZOOKEEPER-236;ZOOKEEPER-1000;和 ZOOKEEPER-2120。

ZooKeeper不支持像Solr這樣的客戶端的加密通信。有幾個相關的JIRA標簽正在計劃/處理SSL支持:ZOOKEEPER-235 ; ZOOKEEPER-236 ; ZOOKEEPER-1000 ; 和ZOOKEEPER-2120。

在啟動任何SolrCloud節(jié)點之前,您必須在ZooKeeper中配置solr集群屬性,以便Solr節(jié)點知道通過SSL進行通信。

本節(jié)假設您已經在本地主機上的端口2181上創(chuàng)建并啟動了單節(jié)點外部ZooKeeper - 請參閱設置外部ZooKeeper集成。

在任何Solr節(jié)點啟動之前,都需要將urlScheme集群屬性設置為https。下面的示例使用二進制Solr發(fā)行版附帶的zkcli工具來執(zhí)行此操作:

  • * nix 命令:
  • server/scripts/cloud-scripts/zkcli.sh -zkhost localhost:2181 -cmd clusterprop -name urlScheme -val https
  • Windows 命令:
  • server\scripts\cloud-scripts\zkcli.bat -zkhost localhost:2181 -cmd clusterprop -name urlScheme -val https

如果您已經設置了您的ZooKeeper的集群使用了Solr的chroot環(huán)境,確保您使用zkcli的正確的zkhost字符串,如:-zkhost localhost:2181/solr。

使用SSL運行SolrCloud

創(chuàng)建兩個節(jié)點的Solr主目錄

為兩個SolrCloud節(jié)點中的每一個節(jié)點創(chuàng)建兩個server/solr/副本,作為Solr主目錄:

  • * nix 命令:
  • mkdir cloud
    cp -r server/solr cloud/node1
    cp -r server/solr cloud/node2
  • Windows 命令:
  • mkdir cloud
    xcopy /E server\solr cloud\node1\
    xcopy /E server\solr cloud\node2\

啟動第一個Solr節(jié)點

接下來,在端口8984上啟動第一個Solr節(jié)點。如果在通過本頁上一節(jié)的工作時啟動它,請務必先停止獨立服務器。

  • * nix 命令:
  • bin/solr -cloud -s cloud/node1 -z localhost:2181 -p 8984
  • Windows 命令:
  • bin\solr.cmd -cloud -s cloud\node1 -z localhost:2181 -p 8984

請注意, 使用-s 選項可以設置 node1 的 Solr 主目錄的位置。
如果您創(chuàng)建的 SSL 密鑰沒有所有 solr 節(jié)點將運行的 DNS 名稱/IP 地址, 則可以告訴 solr 通過將 solr.ssl.checkPeerName 系統(tǒng)屬性設置為 false 來跳過 solr 節(jié)點間通信的主機名驗證:


請注意,使用該-s選項可以設置 node1 的 Solr 主目錄的位置。

如果您創(chuàng)建了沒有運行Solr節(jié)點的所有DNS names/IP 地址的 SSL 密鑰,則可以告訴 solr 通過將solr.ssl.checkPeerName系統(tǒng)屬性設置為false來跳過Solr-node通信跳過主機名驗證。

* nix 命令:

bin/solr -cloud -s cloud/node1 -z localhost:2181 -p 8984 -Dsolr.ssl.checkPeerName=false

Windows 命令:

bin\solr.cmd -cloud -s cloud\node1 -z localhost:2181 -p 8984 -Dsolr.ssl.checkPeerName=false

啟動第二個Solr節(jié)點

最后,在端口7574上啟動第二個Solr節(jié)點 - 再次跳過主機名驗證,添加-Dsolr.ssl.checkPeerName=false;

  • * nix 命令:
  • bin/solr -cloud -s cloud/node2 -z localhost:2181 -p 7574
  • Windows 命令:
  • bin\solr.cmd -cloud -s cloud\node2 -z localhost:2181 -p 7574

客戶端操作示例


在 OS X 小牛 (10.9) 上卷曲已降級的 SSL 支持。有關允許 one-way SSL 的更多信息和變通方法, 請參見 http://curl.haxx.se/mail/archive-2013-10/0036.html。在 OS X 優(yōu)勝美地 (10.10) 被改進-2 方式 SSL 是可能的-看見 http://curl.haxx.se/mail/archive-2014-10/0053.html。


以下各節(jié)中的卷曲命令在 OS X 優(yōu)勝美地 (10.10) 上的系統(tǒng)卷曲不會工作。相反, 使用-e 參數提供的證書必須是 PKCS12 格式的, 并且提供了-cacert 參數的文件必須只包含 CA 證書, 并且沒有密鑰 (請參見上面有關創(chuàng)建此文件的說明):


在OS X Mavericks(10.9)上 curl 已經降級了SSL支持。有關允許單向SSL的更多信息和解決方法,請參閱http://curl.haxx.se/mail/archive-2013-10/0036.html。在OS X Yosemite(10.10)上 curl 得到改進 - 可以使用雙向SSL - 請參閱http://curl.haxx.se/mail/archive-2014-10/0053.html。

以下各節(jié)中的 curl 命令在OS X Yosemite(10.10)中的系統(tǒng)無法使用以下部分中的curl命令。相反。使用 -E 參數提供的證書必須是 PKCS12 格式的。并且提供了-cacert 參數的文件必須只包含 CA 證書,并且不包含任何密鑰(有關創(chuàng)建此文件的說明,請參閱上文):

curl -E solr-ssl.keystore.p12:secret --cacert solr-ssl.cacert.pem ...

如果您的操作系統(tǒng)不包含 curl,您可以在這里下載二進制文件:http ://curl.haxx.se/download.html

使用bin / solr創(chuàng)建一個SolrCloud集合

使用默認的configset(_default)創(chuàng)建名為mycollection的 2-shard,replicationFactor = 1集合:

  • * nix 命令:

  • bin/solr create -c mycollection -shards 2

  • Windows 命令:

  • bin\solr.cmd create -c mycollection -shards 2

該create操作將把您的包含文件中設置的 SOLR_SSL_ * 屬性傳遞給用于創(chuàng)建集合的 SolrJ 代碼。

使用curl檢索SolrCloud群集狀態(tài)

要獲得最終的群集狀態(tài)(再次,如果您尚未啟用客戶端身份驗證,請刪除該-E solr-ssl.pem:secret選項):

curl -E solr-ssl.pem:secret --cacert solr-ssl.pem "https://localhost: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"}}}},
        "maxShardsPerNode":"1",
        "router":{"name":"compositeId"},
        "replicationFactor":"1"}},
    "properties":{"urlScheme":"https"}}}

索引文件使用post.jar

使用post.jar索引一些示例文檔到上面創(chuàng)建的SolrCloud集合:

cd example/exampledocs

java -Djavax.net.ssl.keyStorePassword=secret -Djavax.net.ssl.keyStore=../../server/etc/solr-ssl.keystore.jks -Djavax.net.ssl.trustStore=../../server/etc/solr-ssl.keystore.jks -Djavax.net.ssl.trustStorePassword=secret -Durl=https://localhost:8984/solr/mycollection/update -jar post.jar *.xml

使用curl查詢

使用curl來查詢上面創(chuàng)建的SolrCloud集合,從包含上面創(chuàng)建的PEM格式化證書和密鑰的目錄(例如:example/etc/) - 如果您還沒有啟用客戶端身份驗證(系統(tǒng)屬性-Djetty.ssl.clientAuth=true),那么您可以刪除-E solr-ssl.pem:secret選項:

curl -E solr-ssl.pem:secret --cacert solr-ssl.pem "https://localhost:8984/solr/mycollection/select?q=*:*"

使用CloudSolrClient索引文檔

從一個使用SolrJ的java客戶端索引一個文檔。在下面的代碼中,javax.net.ssl.*系統(tǒng)屬性是以編程方式設置的,但是您可以在java命令行中指定它們,如上post.jar例所示:

System.setProperty("javax.net.ssl.keyStore", "/path/to/solr-ssl.keystore.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "secret");
System.setProperty("javax.net.ssl.trustStore", "/path/to/solr-ssl.keystore.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "secret");
String zkHost = "127.0.0.1:2181";
CloudSolrClient client = new CloudSolrClient.Builder().withZkHost(zkHost).build();
client.setDefaultCollection("mycollection");
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", "1234");
doc.addField("name", "A lovely summer holiday");
client.add(doc);
client.commit();
以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號