用于服务器到服务器通信的Java密钥库和HTTPS无法正常工作

时间:2017-01-24 15:56:48

标签: https logstash logstash-configuration jks

这是我第一次使用Java Key Store,我遇到了一些困难。我ServerA将日志发送到ServerB。我能够建立一个不安全的http通信来传输日志。但是,在使用JKS合并https以建立安全通信时,ServerB似乎没有收到任何内容。两个服务器如何使用JKS安全地进行通信?

以下是我目前正在设置所有这些内容的方法:

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 username@serverb.com:/apps/logstash/jkstest.jks

我正在使用logstash将日志从ServerA发送到ServerB。这是一个非常直接的下载和安装应用程序。关键/重要部分在使用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启动logstash

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

ServerB启动logstash

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

2 个答案:

答案 0 :(得分:1)

不是100%肯定,但是,在服务器A上,您应该configure a truststore将生成的证书作为可信证书。

不是cacert(除非您还拥有证书颁发机构证书,但您的证书似乎是自签名的)

答案 1 :(得分:0)

你有两种方法:

然后你有ssl_certificate_validation = true你应该提供双方的信任库 - ServerA和ServerB。 在您的设置中,您只在ServerA上提供cacert,在ServerB上提供密钥库。 但是你应该在两台服务器上定义密钥库和信任。

所以你可以做以下事情

1)在两台服务器上使用相同的密钥库,并在两台服务器上使用相同的信任库。这种非常不安全的方法。

2)您必须生成独立的服务器和客户端密钥库,然后交换他们的公钥(证书),请参阅示例http://ruchirawageesha.blogspot.com/2010/07/how-to-create-clientserver-keystores.html,在这种情况下,您可以使用 cacert 而不是truststore。

或者您可以生成独立的CA并生成签名证书(https://jamielinux.com/docs/openssl-certificate-authority/introduction.html)。 这是更好的方法,但也许在你的情况下会有一点开销。