Permalink
Browse files

Merge pull request #4 from oreoshake/easy_tls_support

Simple tis support, using EM's built in OpenSSL support
  • Loading branch information...
2 parents aa75bf1 + bfbea10 commit c31d3740d0909cf769309862f155ddb8fc38e772 @jordansissel committed Dec 28, 2011
View
BIN .DS_Store
Binary file not shown.
View
2 Guardfile
@@ -6,7 +6,7 @@ end
guard 'rspec', :version => 2, :cli => "--color --format nested" do
watch(%r{^spec/.+_spec\.rb$})
- watch(%r{^lib/passw3rd/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
+ watch(%r{^lib/syslog_shipper/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
watch('spec/spec_helper.rb') { "spec" }
end
View
32 bin/syslog-shipper
@@ -1,31 +1,5 @@
#!/usr/bin/env ruby
-# http://andyjeffries.co.uk/articles/x509-encrypted-authenticated-socket-ruby-client
-# require 'socket'
-# require 'openssl'
-#
-# socket = TCPSocket.new('my.secure.service', 443)
-# socket.puts("GET / HTTP/1.0")
-# socket.puts("")
-#
-# while line = socket.gets
-# p line
-# end
-
-#
-# socket = TCPSocket.new('my.secure.service', 443)
-# ssl_context = OpenSSL::SSL::SSLContext.new()
-# ssl_socket = OpenSSL::SSL::SSLSocket.new(socket, ssl_context)
-# ssl_socket.sync_close = true
-# ssl_socket.connect
-#
-# ssl_socket.puts("GET / HTTP/1.0")
-# ssl_socket.puts("")
-#
-# while line = ssl_socket.gets
-# p line
-# end
-
require "rubygems"
require "optparse"
require File.expand_path('../../lib/syslog_shipper', __FILE__)
@@ -66,6 +40,10 @@ def main(args)
opts.on("-v", "--verbose", "verbose (outputs each log line as seen)") do |arg|
verbose = true
end
+
+ opts.on("-c CERT_PATH", "--ca-cert CERT_PATH", "Certificate authority PEM file to use") do |arg|
+ SyslogShipper::Client.ca_cert = arg
+ end
end # OptionParser
opts.parse!(args)
@@ -86,7 +64,7 @@ def main(args)
host, port = hostarg.split(":")
port = 514 if port == nil
- connection = EventMachine.connect(host, port.to_i)
+ connection = EventMachine::connect(host, port, SyslogShipper::TlsWrapper)
args.each do |path|
if path.start_with?("+")
View
10 features/client.feature
@@ -1,3 +1,11 @@
Feature: Sends log data securely
- Scenario: Connecting to a remote syslog server with TLS
+ Scenario: When I connect to an invalid host
+ Given I have an invalid TLS endpoint
+ When I connect to that endpoint
+ Then the connection should fail due peer verification failure
+
+ Scenario: When I connect to a valid host
+ Given I have a valid TLS endpoint
+ When I connect to that endpoint
+ Then the connection should fail due peer verification failure
View
1 lib/syslog_shipper.rb
@@ -1,5 +1,6 @@
require "eventmachine"
require "eventmachine-tail"
require File.expand_path('../syslog_shipper/client.rb', __FILE__)
+require File.expand_path('../syslog_shipper/tls_wrapper.rb', __FILE__)
module SyslogShipper; end
View
31 lib/syslog_shipper/client.rb
@@ -2,6 +2,10 @@
module SyslogShipper
class Client < EventMachine::FileTail
+ class << self
+ attr_accessor :ca_cert
+ end
+
def initialize(path, startpos=-1, connection=nil, raw=false, verbose=false)
super(path, startpos)
@buffer = BufferedTokenizer.new
@@ -13,16 +17,21 @@ def initialize(path, startpos=-1, connection=nil, raw=false, verbose=false)
def receive_data(data)
@buffer.extract(data).each do |line|
- if @raw
- @connection.send_data("#{line}\n")
- puts line if @verbose
+ line = if @raw
+ "#{line}\n"
else
- timestamp = Time.now.strftime("%b %d %H:%M:%S")
- syslogline = "#{timestamp} #{@hostname} #{path}: #{line}\n"
- print syslogline if @verbose
- @connection.send_data(syslogline)
+ "#{Time.now.strftime("%b %d %H:%M:%S")} #{@hostname} #{path}: #{line}\n"
end
- end # buffer extract
- end # def receive_data
- end # class Client
-end # module SyslogShipper
+
+ print line if @verbose
+ send_data(line)
+ end
+ end
+
+ private
+
+ def send_data line
+ @connection.send_data line
+ end
+ end
+end
View
25 lib/syslog_shipper/tls_wrapper.rb
@@ -0,0 +1,25 @@
+require 'openssl'
+
+module SyslogShipper::TlsWrapper
+ def post_init
+ start_tls(:verify_peer => true)
+ end
+
+ def connection_completed
+
+ end
+
+ def ssl_verify_peer cert
+ ca_cert = OpenSSL::X509::Certificate.new File.read(SyslogShipper::Client.ca_cert)
+ server_cert = OpenSSL::X509::Certificate.new cert
+ server_cert.verify ca_cert.public_key
+ end
+
+ def ssl_handshake_completed
+ $server_handshake_completed = true
+ end
+
+ def unbind
+
+ end
+end
View
12 spec/client_spec.rb
@@ -1,5 +1,13 @@
require 'spec_helper'
-describe Client do
- it "connects to the remote syslog server over TLS"
+describe SyslogShipper::Client do
+ describe '#receive_data' do
+ before(:each) do
+
+ end
+
+ context "sending data" do
+ it "sends over TLS"
+ end
+ end
end
View
33 test_certs/ca.crt
@@ -0,0 +1,33 @@
+-----BEGIN CERTIFICATE-----
+MIIFtTCCA52gAwIBAgIJAJsiRS70idXIMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV
+BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
+aWRnaXRzIFB0eSBMdGQwHhcNMTExMjI4MDIzMjMwWhcNMTIxMjI3MDIzMjMwWjBF
+MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50
+ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
+CgKCAgEAwyEWkuvtug8YfDfZQd5g8JycDbRFHAvBQgSuUExEO0y/emUdDHFvKAm6
+Q21rw2DzQnG9gowiYylOgqi7zEtVmIS40tlxejWi8rpzVkul4AxGqh4C1xwna/5S
+fxbJE0ruCS2nQBv9ZuqJwy4VZW2lUELkii6XnNas3MWePWPhevNkTomVp5LnDh5B
+aYNAWV0zauAjqYVphkVOAnjzfkzzZlR57fxXAO02gYrEuv38I3k4TFCrtJxbAJt4
+zwWbo+Obm4L3TY/pSRDU03B7Iq7y3Y1wuvtxNQuVxMl9bcbx2kYK+sf16vFpP1mp
+BOB0V8KI4B8w4uK8YZYCvlReNH/0fcSu42n3vIv5WCs34qA8Oikb2D4/ZLhl/5at
+Qxr7NpfBNYinmSGuBKlZee7FKQb6Jvi0Xp0D6u5yBOFMe7trKFlWkOHm4LVMOF3r
+dJOTw9fvHhnks3mco36tvSWwhzQj6dAfdJX4lN9GVjPrjJSabprd/EzS5zRAZPyP
+1xfm0Qft47BxmpiHqhj3H0aa/QIikuyQvZFc2C0XaFGireRGxtS3Pn4kH9Ga5o7F
+xMxyUgLM6YCz0S6oimIineiAtfNyFCcGnJbBIyv6tgAcsjLqz4snn/GsscHvkbpN
+J2+5urG4cZ0XJgrXoXl3sWUQWnnf+g0VpJO8xG0opNmYpnXghFECAwEAAaOBpzCB
+pDAdBgNVHQ4EFgQUREmlvPH91OTtmsnLB204zDJgOg8wdQYDVR0jBG4wbIAUREml
+vPH91OTtmsnLB204zDJgOg+hSaRHMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpT
+b21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGSCCQCb
+IkUu9InVyDAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4ICAQBk/6McgNe5
+AjMaQz6Vd1oqw1Fv896XkldK1JbhUMBOzXydu7S2ZVlsNSGXRrvVJNVZo5NH+YlV
+7cKAilJFAvJwU6QPtmuabaJdGzFyl7m/oEpZEwa+9YWN7ZvkZkY/f9raUPQXCJqC
+HQ02QBNQOm4y9ppwMDZK+MTlP+xxGGN4J91c4KQbG1Kg/Ovbir7CHQitlw5qFofK
+9dlo+CYbxLYm1/X+VRSN/ZpsXgWFStoYw3UQ3B5rJbf4aWoJKY8sIQYLi9f0afGM
+4Sir/bkUStILSFR/WPA765bZYFpLSe+i1GJAE32ka6S832yqwSRoUGlaBM9//R91
+rYNhI9Tsm+EcVsm/uy8YbDKpLz9/9L+ZQo/KiaQiHMa9k1HQmO1PMZab2m6+mZCd
+WuUsiIxtdm0juMD2najyUenRiw9UStYZAI9J0TlcjXq4q16wF8SXMHxBWotF5WZH
+W7KtIo0qKcMNN8hlMGOjdIJKArRCZFmqp5Qu6q3Oxstyk9UpCo8IJof9hggJcosV
+VCQb8VGB1TAae7QovvoIcupRTnmnYIP407hsp8USGCY+H+Q/wRA5wN0toW7Pa7Ho
+QDPEE/kigDwb5w8iKyk8wTBA3fiN1blxPnbNMihqI6RV3nh2Z4xuZK3JC6JUD5ux
+PPxE/0jf3vU+sYbjGy6jzEi++kxNWixu/g==
+-----END CERTIFICATE-----
View
29 test_certs/server.crt
@@ -0,0 +1,29 @@
+-----BEGIN CERTIFICATE-----
+MIIE/jCCAuYCAQEwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQVUxEzARBgNV
+BAgTClNvbWUtU3RhdGUxITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0
+ZDAeFw0xMTEyMjgwMjMzMTNaFw0xMjEyMjcwMjMzMTNaMEUxCzAJBgNVBAYTAkFV
+MRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRz
+IFB0eSBMdGQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC8rz2Kqoy0
+DwQfsUXQgDqNC4TTU1aRPzmNl7x1K50ryQtTHsN6XcZ2camF66OM3zTnNBm/qcFL
+DXuopuDU/8nAgb7T7yO6vvhFg7g89dnt0C2sRHvcrIh12Vl75QrTlmYiiDirHl21
+G5LZ4HOsfSY2YswQoQXHEjYcAXv2goKwSaNP1us0ft8Qd1rVSOxGSh/+SDsRh+Z4
+syG2lSzGS+6CYq1cUXAbgdRGBLy51w7SX2BQtM9ZFBTgzcEGxRMtMJxtD7JV+RWf
+fD+s8DSWIZtLS6RPwkS9MwG/QB2WC7Mm8Ff6eGmfxU4M3Q3gLA0cFLzq/c3OlQXN
+lHdsRrF5sBL6iwmQmZJWv0yj3/rC/WOa0wUHJ9t/FBwLbaVL6V8mND7/DJ9Mok0n
+nKc9d8h1I+vHeNSY4WBSzlPvEKxEdTmeeL4tbcnxUF+vQ0CB++7EUW7sWU2X+Bxb
+SlsFOF+fJUEgTi/Dt0aLVLPwAXJswVd7vJeHilRbvbgtcZjHGh+5PGGjYwvvlV11
+wiPsyLpVYyguIff8s5lVC77NwCrtBl5+XHuuB3evNn0UZM7i9IATIp91kmFRZcp3
+T/LSm2hfn5uXw0bPZHj5Ig7ko1gRCSGsXI1pwm42fi3fkHMzub2DfPYvOttkE+tD
+QqCf465sL2GdJ0XtGR6LAwe36ZbJK2TvxQIDAQABMA0GCSqGSIb3DQEBBQUAA4IC
+AQC4TjY3ESxJQJNoCBs8ufhpvrADzNpXl2ANECYsq9FgNY4/kzDxHLzg6s7mE/PR
+k5uI+U2rvYZOva+h/QTvP8XlpAG+Z4pycrq7ppsv5G8tSrJt+SiSYbIHWDGEzbyG
+jbIIitLXXQo3rouA4XIFeX/2r2UD2OaGX4tzNsytPgvyInxB2/jOvomQXNjpS56R
+pN7dJGrRYMl0K05rN/wIz8YT2HQOcmoBbIEgIXwvD8Aad2CBpZaKHdf33usPQZwE
+Z9IJ0Yq63s63a3vZQWJXHWngFZrfnUcfDOjsAuiZkpuXI1RxGpTBqk0v73vdSAcJ
+wWFjk2eZWCpjkF3Hus7zBD9TQqEzhONdVz9p0SHXojudYoLP/BxENmf9xIPsrfEa
+hW+LTaPhHnGPxDJRReO4tuEJ3qk0j5tGs9oqnCyW0JInJnFfXyKSO7roSrsp6IDn
+jx9jtNRoHlZLlwZlffdZlh7KiwgFepdeLUX5JZ73dIHk4Qt8Do1RCibqB6CzKV3b
+6ZgrZSFvbvS9oKkGvycxtNrqqnn3ZSCDtd4QBUoRsIZ6IsknNOF8yx+SRnHxTucY
+V4O/RMeusezuBWhrHzEpTUtjekQbrbEyV8uKNzw1xFu88aLxWLQNU616xDHT530Y
+Bc+8hFqF0q1fB4GpiOcvNPX2LFflfiv4iHfe4bHB/3Q4hQ==
+-----END CERTIFICATE-----
View
27 test_certs/server.csr
@@ -0,0 +1,27 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIIEijCCAnICAQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUx
+ITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDCCAiIwDQYJKoZIhvcN
+AQEBBQADggIPADCCAgoCggIBALyvPYqqjLQPBB+xRdCAOo0LhNNTVpE/OY2XvHUr
+nSvJC1Mew3pdxnZxqYXro4zfNOc0Gb+pwUsNe6im4NT/ycCBvtPvI7q++EWDuDz1
+2e3QLaxEe9ysiHXZWXvlCtOWZiKIOKseXbUbktngc6x9JjZizBChBccSNhwBe/aC
+grBJo0/W6zR+3xB3WtVI7EZKH/5IOxGH5nizIbaVLMZL7oJirVxRcBuB1EYEvLnX
+DtJfYFC0z1kUFODNwQbFEy0wnG0PslX5FZ98P6zwNJYhm0tLpE/CRL0zAb9AHZYL
+sybwV/p4aZ/FTgzdDeAsDRwUvOr9zc6VBc2Ud2xGsXmwEvqLCZCZkla/TKPf+sL9
+Y5rTBQcn238UHAttpUvpXyY0Pv8Mn0yiTSecpz13yHUj68d41JjhYFLOU+8QrER1
+OZ54vi1tyfFQX69DQIH77sRRbuxZTZf4HFtKWwU4X58lQSBOL8O3RotUs/ABcmzB
+V3u8l4eKVFu9uC1xmMcaH7k8YaNjC++VXXXCI+zIulVjKC4h9/yzmVULvs3AKu0G
+Xn5ce64Hd682fRRkzuL0gBMin3WSYVFlyndP8tKbaF+fm5fDRs9kePkiDuSjWBEJ
+IaxcjWnCbjZ+Ld+QczO5vYN89i8622QT60NCoJ/jrmwvYZ0nRe0ZHosDB7fplskr
+ZO/FAgMBAAGgADANBgkqhkiG9w0BAQUFAAOCAgEAaIvEGDgkjVUxfL9A9FGl5eFq
+OPzaJyPhfylZm83Ha8jakDJ9U1dpSNMqlM5u40w4Tzc5QWNnBBpoiV5XReRhSAIz
+WiBCUUZBVnRlz3MV1j4ZstiMS2eRzS1ODzWPTVciTT1EsAi5PMoalbAVCvCmANIu
+jAuc8e+nf3oHIION84nJ9HfXaDL4ZKKzk1IkuBafdDqhjYtizSKzOtPuoM0qDSd9
+xybyZpYXPA4w18HZcm4QC0FfybFXI7VAQykP07NfjNY0a4BbzySHsfALNgMp08kN
+ib32H/LHyQYHoNPtaDMmjL8+UcktKdTsw6fQO3v7MtloyO9s+kCcScx1TJOtfTuT
+NYw9gfEYDVaPvdGJTh9ezXMMPMxPoGowf2g5dUkIf0hreiKVL1czk8eDqssDjAPB
+RxArzTTjxmg/ogwGJJ8SwTHOEojJ3aHyMtqPisVrYJwaFqECAA1Ubn0ZgvxAP09n
+lLRN4dnB1qW7Nsh/igDKk6Md/nrknFYoqzlmuFd1V8AC+YdAepVCTGx5yhB/G5dT
+nkmV5oJzOfZCCy+FJw18qUjhB1XClX9PuAd4gPtgVzEIMVIhb8RLleI418xzilr/
+8aVr6jIAM8Hdfe9DNP5NvoPEMYHnBmI3zySwG05rOMHYwHt7Ixr2lC8evO4z3wJE
+elsyMVWsixYwlahxg0A=
+-----END CERTIFICATE REQUEST-----
View
54 test_certs/server.key
@@ -0,0 +1,54 @@
+-----BEGIN RSA PRIVATE KEY-----
+Proc-Type: 4,ENCRYPTED
+DEK-Info: DES-EDE3-CBC,4CE5438A2B27C951
+
+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
+-----END RSA PRIVATE KEY-----

0 comments on commit c31d374

Please sign in to comment.