2017-01-24 29 views
2

這是我第一次使用Java密鑰存儲,並且遇到了一些困難。我有ServerA發送日誌到ServerB。我能夠建立一個不安全的http通信來傳輸日誌。但是,將JKS合併爲使用https建立安全通信時,ServerB似乎沒有收到任何東西。兩臺服務器如何使用JKS進行安全通信?Java密鑰存儲和HTTPS服務器到服務器通信不起作用

下面是我當前如何將所有的這件事:

ServerA創建密鑰庫:

ServerA產生自簽名的密鑰庫證書

keytool -genkey \ 
     -alias jkstest \ 
     -keyalg RSA \ 
     -validity 365 \ 
     -keystore /apps/logstash/jkstest.jks 
     -keysize 2048 

ServerA提取證書

keytool -export \ 
     -rfc -alias jkstest \ 
     -keystore /apps/logstash/jkstest.jks \ 
     -file /apps/logstash/jkstest.crt 
     -storepass somepass 

ServerA密鑰存儲複製到ServerB

scp /apps/logstash/jkstest.jks [email protected]:/apps/logstash/jkstest.jks 

我使用logstash發送日誌從ServerAServerB。這是一個非常簡單直接的下載和安裝應用程序。關鍵/項重要的部分是在其中使用JKS配置:

ServerA config.conf

input { 
     file { 
       path => "/var/log/apache2/error.log" 
       start_position => beginning 
     } 
} 
output { 
     stdout { codec => rubydebug { metadata => true } } 
     http { 
       http_method => "post" 
       codec => "json_lines" 
       url => "https://serverb.com:5000/" 
       ssl_certificate_validation => true 
       cacert => "/apps/logstash/jkstest.crt" 
     } 
} 

ServerB config.conf

input { 
    http { 
     port => 5000 
     codec => json 
     ssl => true 
     keystore => "/apps/logstash/jkstest.jks" 
     keystore_password => "hardt0gu355" 
    } 
} 
output { 
     stdout { codec => rubydebug { metadata => true } } 
} 

要開始發送和接收日誌:

ServerA start logstash

bin/logstash agent -f config.conf -l logstash.log 

ServerB開始logstash

bin/logstash agent -f config.conf -l logstash.log 
+1

嘗試使用'ssl_certificate_validation => false',因爲它是自簽名證書,因此可能無法完全驗證。 – Redlab

+0

自從我完成其中一項之後已經很長時間了,但由於您使用的是自簽名證書,因此您無法將其導入爲「可信任的證書鏈」,並將其鏈接到預先打包的其中一個可信的證書頒發機那麼,對於另一臺服務器來說,它可能必須作爲兩端的可信證書手動導入? – djangofan

+0

@djangofan我不知道我是否做了類似的事情,但仍然沒有在其他服務器上收到任何東西。你可以測試你的目的,看看你做的方式仍然有效嗎? – MaryCoding

回答

1

不是100%確定,但在服務器A上,你應該configure a truststore與生成的證書作爲受信任的證書。

不是CACERT(除非你有證書頒發機構certitificate,但你似乎自簽名)

+0

好點。我在'serverA'上創建了一個'truststore'。使用我從'keystore'在'SeverB'中創建的證書。但是,沒有運氣。在'serverA'上運行以創建可信賴的'keytool -importcert -file serverB.cer -alias mycert -keystore truststore.jks'。你能夠複製或讓它通過ssl進行通信嗎? – MaryCoding

+0

我使用以下的https://www.elastic.co/guide/en/beats/filebeat/5.0/configuring-ssl-logstash.html – Redlab

+0

LogStash與節拍(例如FileBeat)一起工作。Filebeat是首選解決方案。但是,我試圖讓這從logstash工作到logstash實例。 – MaryCoding

0

你有你的情況下兩種方法:

然後,你必須ssl_certificate_validation =真正的你應該都提供信任雙方 - ServerA和ServerB。 在您的設置中,您只在ServerA上提供cacert,在ServerB上提供密鑰庫。 但是您應該在兩臺服務器上都定義一個密鑰庫和可信任。

所以,你可以做以下的事情

1)在兩臺服務器上使用相同的密鑰存儲和兩臺服務器上使用相同的信任了。這種非常不安全的方法。

2)你必須生成獨立的服務器和客戶端密鑰庫,然後交換它們的公鑰(證書)見例如http://ruchirawageesha.blogspot.com/2010/07/how-to-create-clientserver-keystores.html在這種情況下,你可以使用CACERT而不是信任的。

或者您可以生成獨立的CA並生成簽名證書(https://jamielinux.com/docs/openssl-certificate-authority/introduction.html)。 這是更好的方法,但也許它會在你的情況下一點點的開銷。

+0

我跟着第二個選項,但仍然沒有工作。 [output plugin](https://www.elastic.co/guide/en/logstash/2.2/plugins-outputs-http.html)有兩個標誌'keystore'和'truststore'。我用兩者都沒有測試過。 – MaryCoding