logstash-integration-logstash 0.0.1-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +4 -0
  3. data/Gemfile +11 -0
  4. data/LICENSE +202 -0
  5. data/NOTICE.TXT +2 -0
  6. data/README.md +98 -0
  7. data/VERSION +1 -0
  8. data/docs/index.asciidoc +71 -0
  9. data/docs/input-logstash.asciidoc +252 -0
  10. data/docs/output-logstash.asciidoc +271 -0
  11. data/lib/logstash/inputs/logstash.rb +185 -0
  12. data/lib/logstash/outputs/logstash.rb +162 -0
  13. data/logstash-integration-logstash.gemspec +36 -0
  14. data/spec/fixtures/certs/generate.sh +69 -0
  15. data/spec/fixtures/certs/generated/README.txt +2 -0
  16. data/spec/fixtures/certs/generated/client_from_root.jks +0 -0
  17. data/spec/fixtures/certs/generated/client_from_root.key.pem +52 -0
  18. data/spec/fixtures/certs/generated/client_from_root.key.pkcs8.pem +54 -0
  19. data/spec/fixtures/certs/generated/client_from_root.p12 +0 -0
  20. data/spec/fixtures/certs/generated/client_from_root.pem +35 -0
  21. data/spec/fixtures/certs/generated/client_from_untrusted.jks +0 -0
  22. data/spec/fixtures/certs/generated/client_from_untrusted.key.pem +52 -0
  23. data/spec/fixtures/certs/generated/client_from_untrusted.key.pkcs8.pem +54 -0
  24. data/spec/fixtures/certs/generated/client_from_untrusted.p12 +0 -0
  25. data/spec/fixtures/certs/generated/client_from_untrusted.pem +35 -0
  26. data/spec/fixtures/certs/generated/client_self_signed.jks +0 -0
  27. data/spec/fixtures/certs/generated/client_self_signed.key.pem +52 -0
  28. data/spec/fixtures/certs/generated/client_self_signed.key.pkcs8.pem +54 -0
  29. data/spec/fixtures/certs/generated/client_self_signed.p12 +0 -0
  30. data/spec/fixtures/certs/generated/client_self_signed.pem +32 -0
  31. data/spec/fixtures/certs/generated/root.key.pem +52 -0
  32. data/spec/fixtures/certs/generated/root.pem +32 -0
  33. data/spec/fixtures/certs/generated/server_from_root-key-pkcs8.pem +52 -0
  34. data/spec/fixtures/certs/generated/server_from_root.jks +0 -0
  35. data/spec/fixtures/certs/generated/server_from_root.key.pem +52 -0
  36. data/spec/fixtures/certs/generated/server_from_root.key.pkcs8.pem +54 -0
  37. data/spec/fixtures/certs/generated/server_from_root.p12 +0 -0
  38. data/spec/fixtures/certs/generated/server_from_root.pem +37 -0
  39. data/spec/fixtures/certs/generated/untrusted.key.pem +52 -0
  40. data/spec/fixtures/certs/generated/untrusted.pem +32 -0
  41. data/spec/fixtures/certs/openssl.cnf +57 -0
  42. data/spec/spec_helper.rb +22 -0
  43. data/spec/unit/full_transmission_spec.rb +202 -0
  44. data/spec/unit/logstash_input_spec.rb +151 -0
  45. data/spec/unit/logstash_output_spec.rb +170 -0
  46. metadata +243 -0
@@ -0,0 +1,52 @@
1
+ -----BEGIN PRIVATE KEY-----
2
+ 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
51
+ gxbVPuFrxfd7bdsIsfJcT4AV2tRpNA==
52
+ -----END PRIVATE KEY-----
@@ -0,0 +1,52 @@
1
+ -----BEGIN PRIVATE KEY-----
2
+ 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
51
+ gxbVPuFrxfd7bdsIsfJcT4AV2tRpNA==
52
+ -----END PRIVATE KEY-----
@@ -0,0 +1,54 @@
1
+ -----BEGIN ENCRYPTED PRIVATE KEY-----
2
+ MIIJrTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIrZCP780bmmYCAggA
3
+ MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBD/HjymNKCzlOETuZ/lp2lkBIIJ
4
+ UBmMPKK0NiG2MIYj/AF7wOUNQwlnGU8LqMsTCqQ4nFkR2XRqDWSGl/JkKbPJ8zUr
5
+ 6cB2Ct2Hhg5jRwUJQX1WjXxOnTJ4wNN5Xn/j/9g8nsK/pM7HQB+QqjxmeWrJ5dmr
6
+ 4hllEibfqFMKFY4wOOtZ/w6543umsX1QUEhvLJTqaEidJJ+Xpz3RASpb0/73H3fQ
7
+ dB+gddm22e4HtFC7f5thHUYC/Z0U8sz4K7/fcL6LK3RD0qTJ4S+YoJYBgoK2a/dC
8
+ 1naSFRMromfffZZm2XMZCEpfWy9nHuVUxGnPp1t/bPt+da4XU4Z12D1RC9bo7+6a
9
+ hU+Lt6vZSP0GekSACxzsKr5jin785NNbBGGYtB1IUegFLzxmqJkh+frYzz7RR0DB
10
+ rU0znz1Z3x8+TXyxMtQtrgfgLEq6LLrO6UFeOh4wD4J6gUyQr8qunD07RwG3j7dP
11
+ kDptxMKI5KhoYBaasybtUpRRdvPLbN80B6/vvPA+4AlZhbW1g5BNGC9k2YAvnf44
12
+ h28LfA8TUXSgs+QxQe9EPHJXEjLLbFPYmEDdEThDLaUyEXsUeh/fR4hUe4n6d1ZB
13
+ NuAwBuCm9WlvZshwY2VyVH2tV9YkL8ROR+Kn/XiwcMx+Zh8OeMHzIvoR97XkXFRo
14
+ AwtB2yhbSo2ie7k5FdOpHvDOrAHrxxvhrDtry5swpsBH9T/fnCUoMijMVFqSVV3E
15
+ h9DoSD6YwNPXTTcBPBZfCKQwem67P4KvY7goJIzMhanHJtK2Ycc5qGW0GTcf/1Ag
16
+ 5mZDTIc4+MJ6WqaeTE1b+pJB/knWjseZH85a0Rij8iPwt7yZE5cL7vxQYhvZSc39
17
+ X6ubRSg0meOGUHoDN+6ywE7lkjt6Q/L+l5/kJiP80gvPaPpYtL6tYlMemLxgvnuK
18
+ PPvfGeyWf/MTA2v0a+VHysxnLhR9zoMmWzycB1yQgFdxVFjkV4/v0i9yhPsEB/Za
19
+ Bn5TiPFjVy/gwNXLPBD5J36fLtMLKbXG/X6zruShg4K++BbekEgAmZdpZHw+ULZG
20
+ 2eeOcxYcmvNTRQoMYvT8GpDWB+NNqSIqDzDLX827PaYHU3BDS8u7717adEsbx9xg
21
+ DFeVDvvGoWpMNo1K7hHCtaunn2G+sKO/rttGWZ63qRfIZeZJZLFg1PdgHqd2Hi++
22
+ jkd1qIMmBDVBANZ8BqFsiuzvYWrWDOt+zz/ofN67S2dbP3L2v9d0d5x3m4sIyDSW
23
+ U41FfWiY3SkUEBCc0dgPymSrW5th6qWSJqDLzRj92X+nRD6b9GPVVNu5D0yqiqcr
24
+ cR45ZmQ8yE7zKAainV1JDwxmtc6C5LJHrXPu+ZIo+S5PrW96xqSmj8Su/4dZWD5v
25
+ o/BKJImo0jSdp+i+8cpHMstB9esZesrezTpHOVOiGKoECIVE5oKANcHpFVPcyMk1
26
+ 0XKlYfAwWKsOugBcOTL+Wv/uJgvuYA5OR1tqDp7Q87XgsBmt/JLiB5UXbGYBv090
27
+ 8CtQXQJW9vzDwERh6zNVCFysCOBl2SSDepwSOcWffo/MFfyUkbTbLtR3hTdGkAbK
28
+ AAX9/+kNqXVY7atB3cMpXgu6ImJgmTfzbIc+UiHrJJCoEEXp5/3OZYIGsms4h1/h
29
+ NuwIzV7DCQ7vh01eZ55z2YFWd69k4VNSlWHb9QxwmhrKv/OHsurHaOMgL0oKxnx5
30
+ GsxYtMgvVExpLZPUZWwbGRXozPgA1h88o6Ew3Pgy5ChQZ92aHTGd5FYf0zsskjmr
31
+ 79fS1x2ew8mRJKzcLsQ1EllnCS6rHF3LdAsZ6E2awIHyidRoOLkKcnLYmLBbPgTf
32
+ PqTu4nvu9tORbTTGdxYL1BeTfUtFz163PPGaHnatxaz5qeqGPmjccdKs6jDISJUg
33
+ 091NJHTLRY/nsflxfWZyQoQbg7KBtS4nzPjnP9WzPrLLO/hH/Abltp5fqGmivBeZ
34
+ Wh9eaRQymBjFdBPZxttV74oaZAx3DU+QcHw4oER8Ksk5PDa8nMKhfPLIplJVmtrG
35
+ PEUcD0flXaJHXgQJDhij9rMRMrR0TBRY23peudDxV+JfA7V3TJgdX2ADJJNfJjHB
36
+ Qw47MXaeW6iJty/nhvp+DiglZKOt132yNwstR9PRoXqLQ/lsCKoBb2kIwYVV5Zok
37
+ bsOW3KgSe+sslWj1QcQsUMPWxLTbJmYPJDsc8VPkMKNnG6L2L/f5eGug3Y8lnc1i
38
+ KxJCY6LZK82PWNFSFndsKP/Kml1ywTKknNAx7IPu6qqJdTarz6UgqvV4c+B0uhZ+
39
+ VI0GSJzQCxrkateaAybhYCJMJiJHRZs/T3sphbW5Wj1rdmX/nMM96ZGVEovVNgAh
40
+ 2oCSnA6c2UFNHt4ndhhcWfwYILQTU+lJgJd7vwn9WNJrr4NT2CUG1Xg0lPIIVhtM
41
+ 28uQOiVois5TmNQ8djf0AVNoMIaiogWuy30LKQXcPtvenbRB0PVn4MfmJbnTXK1F
42
+ 117kjubWb96pLQ9QE+HPQd5EWURyhFu25LX0ZXf6gI/CV2yYsGJIMLDyv9Q/kwhJ
43
+ U1aBfZapMMmNl54KuaMffcK6iGxUU0ixNvMbxHc0V9lbenC/RT+dNPSUGUMrY7c7
44
+ h1oHW1Hoo3uALleahQgnxGFjpTTWI7pkKVBGJeVAuaCPXiClYI7TAKKG279WLj74
45
+ JltewVlns/EWagm3rCRw3myFgILseVQXt3H82Hf15mX+aZUWShslOEIkv6g1kuqw
46
+ 4GPW+rJfbBmsdFhS45gB0Vn0l+n7dqt1P5FZR2bY9PQn4lVNOxderRLGkV+tMSkt
47
+ 2wXudXiogYRc0puGZXKXApgCBfTAdRJsNyVMxlUIANbh1f4LrzqDdN0fbeIeHDAX
48
+ aXF2bDOJiXjJf2yXcUMXBXYTW6Ygf0abelgRbq2bWUTzDXolRqXoCB6b+S7WiRev
49
+ yE2qw6d2qXQNrcgjvjC0dZVBUcrmDRelZyQB1v9QL0x3SsGh25JQ3dMxTrRT/g4V
50
+ D3Gia2Ub9FHiK8kMDS8xNansTl/VccQHYvgciSVRasCi0hKHFbXZgBqAoVTUSxtG
51
+ fsdy8b83ofHFwxcgQ6yGuHT9oZxDPFMvBtIcavkIg/ci5tFjvnWlUmPVjVGaAayz
52
+ 2E1Z/uyevwEM0794p3656fb62ZyOKiVeJeo1oJtUZWVaNHdw4a6T8Y4lm25LPkIv
53
+ 0dEZF2pf+p6G2rSt+o3m3onbyuN699f3qfXoi00Vu938
54
+ -----END ENCRYPTED PRIVATE KEY-----
@@ -0,0 +1,37 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ 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
36
+ onoG0Zjb7skQttS0yA==
37
+ -----END CERTIFICATE-----
@@ -0,0 +1,52 @@
1
+ -----BEGIN PRIVATE KEY-----
2
+ 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
51
+ CJXkeVKeh5sWp0maI7gC69stR6wvhg==
52
+ -----END PRIVATE KEY-----
@@ -0,0 +1,32 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIFlTCCA32gAwIBAgIUM53MVf3RDAjoN8sN97uYGGDMN2gwDQYJKoZIhvcNAQEL
3
+ BQAwUjELMAkGA1UEBhMCTFMxCzAJBgNVBAgMAk5BMRMwEQYDVQQHDApIdHRwIElu
4
+ cHV0MREwDwYDVQQKDAhMb2dzdGFzaDEOMAwGA1UEAwwFb3RoZXIwHhcNMjMwOTI1
5
+ MTg1ODM5WhcNMjgwOTI0MTg1ODM5WjBSMQswCQYDVQQGEwJMUzELMAkGA1UECAwC
6
+ TkExEzARBgNVBAcMCkh0dHAgSW5wdXQxETAPBgNVBAoMCExvZ3N0YXNoMQ4wDAYD
7
+ VQQDDAVvdGhlcjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPbpm14F
8
+ MteWIFA+ig29PuO5oDjg5OCHZVArxgDBDzWvjceYRGTZ9+yEU/UY2AcIUd+Piics
9
+ 3e8cF2QOoTtQZvbmz2ZN3SKYVEf37UCx+uwwSbnrsQCyUlU68DoCr3hDDO5cB15f
10
+ rd++escJkM8zRNOehPVpWnOXFvYUdnL+NZ4eMLgjXNPJqx9qEwHphYLAExv5UoV8
11
+ E66wsgayfvy834KSf5goD3kV7ca+rnQwgXegzz5EybHmLysKRRM5Crq1muFLjsCY
12
+ 4VgoqHO+b+Jo9n4FDshELHImDg3PwQmCUv7kzwdkrLUwgseCd9FfoNCrfzPH4svk
13
+ i5TM/DLdCWfUwD5zBFdbv0v95tgYH81fHR/r1hwF2gdWOFBz3xsO4ehlNWXrP0TN
14
+ ubzI0wvTWh+YCr1SDfbL8r3Fyn11b4+hJB/Vq3dcqEngoYNRRz7V+ST9axAilQDI
15
+ 6Prk+lDedNp2UqHx/YgULPJrYQC3t2r+tvEDodZI4KbUlkxM7rWCvLnF78WJIJ2g
16
+ 121dj8IP5CoZkVbVu1XTA9piGCxDGbj7yRKjC9kZWmEXt3HWjAM9ihg0PWWJcAKa
17
+ /DUgsBEhXAfD1m59cQRBqLSZQWcF6Qon30FYTfT3voxMeAHPw+2Fu+ok2WF9mUgk
18
+ mip335sJTuloFW4xI1MIBfdNZzk0b2PzsY/VAgMBAAGjYzBhMB0GA1UdDgQWBBQR
19
+ 4wEgvWhKjMgZkanex9IVzG4rXjAfBgNVHSMEGDAWgBQR4wEgvWhKjMgZkanex9IV
20
+ zG4rXjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0B
21
+ AQsFAAOCAgEAR3bKDGn3vIeDQnHouNBwOwC+3hLrWOBVYbfnSYg0uQIGXXUKCQqd
22
+ 0O5r2oMHcvMfdCOB8T5ua28mH+cglKnUz9H4+KdYDIMTjixUfOJG3uFEeB2ceUmZ
23
+ NQ/lxNNy4aoPDxKi1c8nmT5t28SkRXWXlvF4dBtjEC671wnUR2JtfIBj/8/BVYTh
24
+ Q3GZ9u2XgdQRfQWuDbzBHQzQ0mY/vk9/nBv94qW0FJakOD+g9lTHv7izBY5Ep9Bg
25
+ lEHrhFwFedTN1Qr3zpmEs9HNB3nZrsZKCdVjbkNzIFv+X2CGu0v/FM57grtYxH95
26
+ JKttn07Qbq3vUwNDzZmIG4l8jjs+Ckcf7UzyqLXiYzrhvP24KAvGYEreXyzACWwW
27
+ s4vWkpWuP5aifyzNGhp+llnmMt+1YcZC3Vgw+qIjSXwo1NBQl2+FjBzuau7QP8hH
28
+ SlkqfXvOD6K5D9dp7VwIvJuRtlzInXFNYSOcAL9dqaIvt8s9G1tZ1+8z5aWMrF3K
29
+ KWS/KhqQuxl07mvjaGs4iogvlpTIyu0f6Kj0m0bNvK9M4SkZikLyMEpDxpqUBQcO
30
+ iTFdt9UvzuwIvtKMZwlXk/QgK/ulisGtvjAEm/KasZsbi0iDNf2YV/O7Zy+UYc0Q
31
+ U81gmA5KooIb4bcVXlHCC11Ekf79tOLkzYAIJeFt+o/3byvFT4TDHcE=
32
+ -----END CERTIFICATE-----
@@ -0,0 +1,57 @@
1
+ [ req ]
2
+ distinguished_name= req_distinguished_name
3
+ attributes= req_attributes
4
+
5
+ [ req_distinguished_name ]
6
+ countryName= Country Name (2 letter code)
7
+ countryName_min= 2
8
+ countryName_max= 2
9
+ stateOrProvinceName= State or Province Name (full name)
10
+ localityName= Locality Name (eg, city)
11
+ 0.organizationName= Organization Name (eg, company)
12
+ organizationalUnitName= Organizational Unit Name (eg, section)
13
+ commonName= Common Name (eg, fully qualified host name)
14
+ commonName_max= 64
15
+ emailAddress= Email Address
16
+ emailAddress_max= 64
17
+
18
+ [ req_attributes ]
19
+ challengePassword= A challenge password
20
+ challengePassword_min= 4
21
+ challengePassword_max= 20
22
+
23
+ [ ca ]
24
+ subjectKeyIdentifier = hash
25
+ authorityKeyIdentifier = keyid:always,issuer
26
+ basicConstraints = critical, CA:true
27
+ keyUsage = critical, digitalSignature, cRLSign, keyCertSign
28
+
29
+ [ client_cert ]
30
+ basicConstraints = CA:FALSE
31
+ nsCertType = client, email
32
+ nsComment = "OpenSSL Generated Client Certificate"
33
+ subjectKeyIdentifier = hash
34
+ authorityKeyIdentifier = keyid,issuer
35
+ keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment
36
+ extendedKeyUsage = clientAuth, emailProtection
37
+ subjectAltName = "DNS:localhost, IP:127.0.0.1"
38
+
39
+ [ client_cert_no_matching_subject ]
40
+ basicConstraints = CA:FALSE
41
+ nsCertType = client, email
42
+ nsComment = "OpenSSL Generated Client Certificate"
43
+ subjectKeyIdentifier = hash
44
+ authorityKeyIdentifier = keyid,issuer
45
+ keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment
46
+ extendedKeyUsage = clientAuth, emailProtection
47
+ subjectAltName = "DNS:nowhere, IP:123.45.67.89"
48
+
49
+ [ server_cert ]
50
+ basicConstraints = CA:FALSE
51
+ nsCertType = server
52
+ nsComment = "OpenSSL Generated Server Certificate"
53
+ subjectKeyIdentifier = hash
54
+ authorityKeyIdentifier = keyid,issuer:always
55
+ keyUsage = critical, digitalSignature, keyEncipherment
56
+ extendedKeyUsage = serverAuth
57
+ subjectAltName = "DNS:localhost, IP:127.0.0.1"
@@ -0,0 +1,22 @@
1
+ require "rspec"
2
+ require "rspec/mocks"
3
+ require "logstash/devutils/rspec/spec_helper"
4
+
5
+ module SpecHelper
6
+
7
+ def cert_fixture(name)
8
+ File.expand_path("fixtures/certs/generated/#{name}", __dir__)
9
+ end
10
+
11
+ def cert_fixture!(name)
12
+ cert_fixture(name).tap do |filename|
13
+ fail "MISSING: #{filename}" unless File.file?(filename)
14
+ fail "UNREADABLE: #{filename}" unless File.readable?(filename)
15
+ end
16
+ end
17
+
18
+ end
19
+
20
+ RSpec.configure do |config|
21
+ config.include SpecHelper
22
+ end
@@ -0,0 +1,202 @@
1
+ # encoding: utf-8
2
+
3
+ require_relative "../spec_helper"
4
+ require "logstash/devutils/rspec/shared_examples"
5
+ require "logstash/inputs/logstash"
6
+ require "logstash/outputs/logstash"
7
+ require "rspec/collection_matchers"
8
+ require "random-port"
9
+
10
+ describe 'Logstash Output -> Input complete transmission' do
11
+
12
+ let(:port) { @available_port }
13
+
14
+ around(:each) do |example|
15
+ RandomPort::Pool::SINGLETON.acquire do |available_port|
16
+ @available_port = available_port
17
+ example.call
18
+ end
19
+ end
20
+
21
+ # requires: input_events (an array of Events)
22
+ # requires: output_plugin (a Logstash output plugin)
23
+ # requires: input_plugin (a Logstash input plugin)
24
+ # optional: concurrency (default: 1)
25
+ # optional: batch_size (default: 125)
26
+ # provides: output_events (an array of Events)
27
+ shared_context 'transmission' do
28
+ let(:concurrency) { defined?(super) ? super() : 8 }
29
+ let(:batch_size) { defined?(super) ? super() : 125 }
30
+
31
+ let(:output_events) { [] }
32
+ let(:errors) { [] }
33
+
34
+ before(:each) do
35
+ input_plugin.register
36
+ output_plugin.register
37
+
38
+ transmit_queue = Queue.new
39
+ input_events.each_slice(batch_size) { |batch| transmit_queue << batch }
40
+
41
+ receipt_queue = Queue.new
42
+ input_thread = Thread.new(receipt_queue) { |queue| input_plugin.run(queue) }
43
+
44
+ error_queue = Queue.new
45
+
46
+ concurrency.times.map do
47
+ Thread.new(receipt_queue) do
48
+ loop do
49
+ batch = transmit_queue.pop(true) rescue break
50
+ begin
51
+ Timeout.timeout(5) do
52
+ output_plugin.multi_receive(batch)
53
+ end
54
+ rescue => e
55
+ error_queue << e
56
+ end
57
+ end
58
+ end
59
+ end.map(&:join)
60
+
61
+ output_plugin.close
62
+ input_plugin.stop
63
+ input_thread.join
64
+
65
+ receipt_queue.size.times { output_events << receipt_queue.pop }
66
+ error_queue.size.times { errors << error_queue.pop }
67
+ end
68
+ end
69
+
70
+ # provides: input_events
71
+ # depends: output_events
72
+ shared_examples "large sequence" do
73
+ let(:event_count) { 10_000 }
74
+
75
+ let(:input_events) { (0...event_count).map { |idx| LogStash::Event.new("event" => {"sequence" => idx}) } }
76
+
77
+ it 'transmits all events' do
78
+ expect(output_events).to have_exactly(event_count).items
79
+
80
+ expect(output_events.map{|e| e.get("[event][sequence]")}.uniq).to have_exactly(event_count).items
81
+ end
82
+ end
83
+
84
+ shared_examples "connection failure" do
85
+ let(:input_events) { [LogStash::Event.new("event" => {"sequence" => 999})] }
86
+
87
+ it 'fails to transmit the events' do
88
+ expect(errors).to have_exactly(1).items
89
+ expect(output_events).to be_empty
90
+ end
91
+ end
92
+
93
+ context 'basic plaintext' do
94
+ let(:output_plugin) { LogStash::Outputs::Logstash.new("host" => "127.0.0.1", "port" => port, "ssl_enabled" => false) }
95
+ let(:input_plugin) { LogStash::Inputs::Logstash.new("host" => "127.0.0.1", "port" => port, "ssl_enabled" => false) }
96
+
97
+ include_context 'transmission'
98
+ include_examples "large sequence"
99
+ end
100
+
101
+ context 'simple ssl with client authentication none' do
102
+ let(:input_plugin) {
103
+ LogStash::Inputs::Logstash.new({
104
+ "host" => "127.0.0.1", "port" => port,
105
+ "ssl_keystore_path" => cert_fixture!('server_from_root.jks'),
106
+ "ssl_keystore_password" => "12345678",
107
+ })
108
+ }
109
+
110
+ context 'output connects via ssl' do
111
+ let(:output_plugin) {
112
+ LogStash::Outputs::Logstash.new({
113
+ "host" => "127.0.0.1", "port" => port,
114
+ "ssl_certificate_authorities" => cert_fixture!('root.pem'),
115
+ })
116
+ }
117
+
118
+ include_context 'transmission'
119
+ include_examples "large sequence"
120
+ end
121
+
122
+ context 'output connects without ssl' do
123
+ let(:output_plugin) {
124
+ LogStash::Outputs::Logstash.new({
125
+ "host" => "127.0.0.1", "port" => port,
126
+ "ssl_enabled" => false,
127
+ })
128
+ }
129
+
130
+ include_context 'transmission'
131
+ include_examples "connection failure"
132
+ end
133
+
134
+ end
135
+
136
+ context 'client auth ssl' do
137
+ let(:input_plugin) {
138
+ LogStash::Inputs::Logstash.new({
139
+ "host" => "127.0.0.1", "port" => port,
140
+ "ssl_certificate" => cert_fixture!('server_from_root.pem'),
141
+ "ssl_key" => cert_fixture!('server_from_root.key.pkcs8.pem'),
142
+ "ssl_key_passphrase" => "12345678",
143
+ "ssl_certificate_authorities" => cert_fixture!('root.pem'),
144
+ "ssl_client_authentication" => "required",
145
+ })
146
+ }
147
+
148
+ context 'output presents peer certificate' do
149
+ let(:output_plugin) {
150
+ LogStash::Outputs::Logstash.new({
151
+ "host" => "127.0.0.1", "port" => port,
152
+ "ssl_certificate_authorities" => cert_fixture!('root.pem'),
153
+ "ssl_keystore_path" => cert_fixture!('client_from_root.jks'),
154
+ "ssl_keystore_password" => "12345678",
155
+ })
156
+ }
157
+
158
+ include_context 'transmission'
159
+ include_examples "large sequence"
160
+ end
161
+
162
+ context 'output presents NO certificate' do
163
+ let(:output_plugin) {
164
+ LogStash::Outputs::Logstash.new({
165
+ "host" => "127.0.0.1", "port" => port,
166
+ "ssl_certificate_authorities" => cert_fixture!('root.pem'),
167
+ })
168
+ }
169
+
170
+ include_context 'transmission'
171
+ include_examples "connection failure"
172
+ end
173
+
174
+ context 'output presents untrusted certificate' do
175
+ let(:output_plugin) {
176
+ LogStash::Outputs::Logstash.new({
177
+ "host" => "127.0.0.1", "port" => port,
178
+ "ssl_certificate_authorities" => cert_fixture!('root.pem'),
179
+ "ssl_keystore_path" => cert_fixture!('client_from_untrusted.jks'),
180
+ "ssl_keystore_password" => "12345678",
181
+ })
182
+ }
183
+
184
+ include_context 'transmission'
185
+ include_examples "connection failure"
186
+ end
187
+
188
+ context 'output presents self-signed certificate' do
189
+ let(:output_plugin) {
190
+ LogStash::Outputs::Logstash.new({
191
+ "host" => "127.0.0.1", "port" => port,
192
+ "ssl_certificate_authorities" => cert_fixture!('root.pem'),
193
+ "ssl_keystore_path" => cert_fixture!('client_self_signed.jks'),
194
+ "ssl_keystore_password" => "12345678",
195
+ })
196
+ }
197
+
198
+ include_context 'transmission'
199
+ include_examples "connection failure"
200
+ end
201
+ end
202
+ end