【问题标题】:Java Key Store and HTTPS for server to server communication not working用于服务器到服务器通信的 Java 密钥库和 HTTPS 不起作用
【发布时间】:2017-01-24 15:56:47
【问题描述】:

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

以下是我目前的设置方式:

ServerA 中创建密钥库:

ServerA在Keystore中生成自签名证书

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 的配置中:

ServerAconfig.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"
        }
}

ServerBconfig.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

【问题讨论】:

  • 尝试使用ssl_certificate_validation => false,因为它是自签名证书,可能无法完全验证。
  • 我已经很久没有做这些了,但是由于您使用的是自签名证书,您将无法将其作为“受信任的证书链”导入并链接它到预先打包的受信任的证书颁发机构之一。那么,要让另一台服务器信任,它可能必须在两端手动导入为受信任的证书?
  • @djangofan 我不确定我是否做了类似的事情,但其他服务器仍然没有收到任何东西。你能测试一下你的方法是否仍然有效吗?
  • 也许这提供了另一个提示。我真的不能再添加更多了:stackoverflow.com/questions/23227849/…

标签: https logstash logstash-configuration jks


【解决方案1】:

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

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

【讨论】:

  • 好点。我在serverA 上创建了一个truststore。使用我在SeverB 中从它自己的keystore 创建的证书。然而,没有运气。在serverA 上运行这个以创建信任keytool -importcert -file serverB.cer -alias mycert -keystore truststore.jks。您是否能够复制或让它通过 ssl 进行通信?
  • 我让它使用节拍(例如 FileBeat)到 LogStash,并关注elastic.co/guide/en/beats/filebeat/5.0/…
  • Filebeat 是首选解决方案。但是,我试图让它从 logstash 到 logstash 实例工作。
【解决方案2】:

你有两种方法:

那么你有 ssl_certificate_validation=true 你应该在双方都提供信任库 - ServerA 和 ServerB。 在您的设置中,您仅在 ServerA 上提供 cacert,在 ServerB 上提供密钥库。 但是你应该在两台服务器上都定义一个 keystore 和 trustore。

所以你可以做以下事情

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)。 这是更好的方法,但在您的情况下可能会有点开销。

【讨论】:

  • 我遵循了第二个选项,但仍然没有工作。 output plugin 有两个标志 keystoretruststore。我测试了两者都没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-03
  • 2015-03-06
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多