openssl-extensions 0.0.9 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. data/CHANGELOG.md +6 -0
  2. data/LICENSE +21 -0
  3. data/README.md +50 -0
  4. data/lib/openssl-extensions/version.rb +1 -1
  5. data/lib/openssl-extensions/x509/certificate.rb +17 -0
  6. data/spec/fixtures/certificate_requests/1024.csr +12 -0
  7. data/spec/fixtures/certificate_requests/challenge.csr +14 -0
  8. data/spec/fixtures/certificate_requests/envylabs.csr +19 -0
  9. data/spec/fixtures/certificate_requests/geocerts.csr +17 -0
  10. data/spec/fixtures/certificate_requests/geocerts.key +27 -0
  11. data/spec/fixtures/certificate_requests/geocerts_1024.key +15 -0
  12. data/spec/fixtures/certificate_requests/sans.csr +30 -0
  13. data/spec/fixtures/certificates/app1.hongkongpost.com.pem +26 -0
  14. data/spec/fixtures/certificates/equifax-secure-ca.pem +20 -0
  15. data/spec/fixtures/certificates/geotrust-extended-validation-ssl-ca.pem +28 -0
  16. data/spec/fixtures/certificates/geotrust-primary-certification-authority.pem +22 -0
  17. data/spec/fixtures/certificates/globalsign-root-ca.pem +22 -0
  18. data/spec/fixtures/certificates/hongkong-post-e-cert-ca-1.pem +21 -0
  19. data/spec/fixtures/certificates/hongkong-post-e-cert-ca.pem +21 -0
  20. data/spec/fixtures/certificates/hongkong-post-root-ca-1.pem +21 -0
  21. data/spec/fixtures/certificates/hongkong-post-root-ca.pem +20 -0
  22. data/spec/fixtures/certificates/www.geocerts.com.pem +31 -0
  23. data/spec/fixtures/certificates/www.twongo.com.pem +22 -0
  24. data/spec/integration/openssl/ssl/ssl_socket_spec.rb +7 -0
  25. data/spec/integration/openssl/x509/certificate_spec.rb +9 -0
  26. data/spec/integration/openssl/x509/name_spec.rb +9 -0
  27. data/spec/integration/openssl/x509/request_spec.rb +10 -0
  28. data/spec/models/openssl-extensions/ssl/ssl_socket_spec.rb +16 -0
  29. data/spec/models/openssl-extensions/x509/authority_key_identifier_spec.rb +17 -0
  30. data/spec/models/openssl-extensions/x509/certificate_chain_spec.rb +54 -0
  31. data/spec/models/openssl-extensions/x509/certificate_spec.rb +109 -0
  32. data/spec/models/openssl-extensions/x509/name_spec.rb +20 -0
  33. data/spec/models/openssl-extensions/x509/request_spec.rb +77 -0
  34. data/spec/models/openssl-extensions_spec.rb +40 -0
  35. data/spec/spec_helper.rb +22 -0
  36. data/spec/support/certificate_request_fixtures.rb +29 -0
  37. data/spec/support/ssl_certificate_fixtures.rb +28 -0
  38. metadata +75 -14
@@ -0,0 +1,6 @@
1
+ ## 1.0.0, released 2011-01-17
2
+
3
+ * Initial major release.
4
+ * Extends OpenSSL::X509::Request, OpenSSL::X509::Certificate, OpenSSL::X509::Name
5
+ * Adds OpenSSLExtensions::X509::CertificateChain and OpenSSLExtensions::X509::AuthorityKeyIdentifier
6
+
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ Copyright (c) 2010 Envy Labs LLC
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
@@ -0,0 +1,50 @@
1
+ # OpenSSL Extensions
2
+
3
+ This library generally provides helper methods which makes working with
4
+ OpenSSL a little more bearable. It does, however, provide some additional
5
+ structures (such as a CertificateChain) which extend the traditional
6
+ features of the library.
7
+
8
+ ## Installation
9
+
10
+ With [Bundler](http://gembundler.com):
11
+
12
+ gem 'openssl-extensions', :require => 'openssl-extensions/all'
13
+
14
+ With standard RubyGems:
15
+
16
+ gem install openssl-extensions
17
+
18
+ require 'rubygems'
19
+ require 'openssl-extensions/all'
20
+
21
+ Once required, the extensions are automatically applied.
22
+
23
+ ## Usage
24
+
25
+ In general, this extension library should be somewhat transparent to you.
26
+ It does not directly provide many classes with which you might interact.
27
+ Instead, it extends the current classes provided by Ruby's OpenSSL library
28
+ (being OpenSSL::X509::Request, OpenSSL::X509::Certificate, and
29
+ OpenSSL::X509::NAME).
30
+
31
+ Below is a simple example exercising a few helpers provided by this
32
+ library:
33
+
34
+ csr_body = File.read('example.csr') # assuming this is valid and exists
35
+ request = OpenSSL::X509::Request.new(csr_body)
36
+
37
+ request.subject.common_name # => "example.com"
38
+ request.subject.organization # => "Example Corp"
39
+ request.subject.locality # => "Orlando"
40
+ request.subject.region # => "Florida"
41
+ request.subject.country # => "US"
42
+ request.subject.location # => "Orlando, Florida, US"
43
+
44
+ request.strength # => 2048
45
+ request.challenge_password? # => false
46
+ request.subject_alternative_names # => ['example.com', 'www.example.com']
47
+
48
+ ## License
49
+
50
+ Released under the MIT License. See the LICENSE file for further details.
@@ -1,3 +1,3 @@
1
1
  module OpenSSLExtensions
2
- Version = '0.0.9'
2
+ Version = '1.0.0'
3
3
  end
@@ -84,6 +84,23 @@ module OpenSSLExtensions::X509::Certificate
84
84
  read_extension_by_oid('subjectKeyIdentifier')
85
85
  end
86
86
 
87
+ ##
88
+ # Returns the SSL version used by the certificate. Most likely, this
89
+ # will return +3+, since version +1+ was unreleased, and version +2+ was
90
+ # abandoned in 1995.
91
+ #
92
+ # See http://en.wikipedia.org/wiki/Secure_Sockets_Layer.
93
+ #
94
+ #--
95
+ # OPTIMIZE: This should really use a call directly to the OpenSSL library, but will require becoming a compiled gem.
96
+ #++
97
+ #
98
+ def ssl_version
99
+ if to_text =~ %r{^\s+Version: (\d+)}m
100
+ $1.to_i
101
+ end
102
+ end
103
+
87
104
  end
88
105
 
89
106
  OpenSSL::X509::Certificate.send(:include, OpenSSLExtensions::X509::Certificate)
@@ -0,0 +1,12 @@
1
+ -----BEGIN CERTIFICATE REQUEST-----
2
+ MIIBtzCCASACAQAwdzELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0dlb3JnaWExEDAO
3
+ BgNVBAcTB0F0bGFudGExFTATBgNVBAoTDEdlb0NlcnRzIEluYzESMBAGA1UECxMJ
4
+ U1NMIFNhbGVzMRkwFwYDVQQDExB3d3cuZ2VvY2VydHMuY29tMIGfMA0GCSqGSIb3
5
+ DQEBAQUAA4GNADCBiQKBgQDdlqVkMMohJ1kUqBxqZJojCFtJFht7f4JDs5kURI7Q
6
+ SCpN6eB/KLqP4x8skx3FGktU/Vgsdri9OeLS71cyw389eJyxmDFroicE0pyAd2o6
7
+ dZGh1x9/7AJuIDwolhyNAhHLtKppTRh1LIUoU2ZU9xuywN9QzI5Yj29pNBaszsbE
8
+ JwIDAQABoAAwDQYJKoZIhvcNAQEFBQADgYEAC3LXB167uc3gXxMSn+aMk6FxnAaB
9
+ o7FMPV//zpk7gqijWxDmDaiIKp5cCKzoaC6M53vR00cx4O65V5La9U39I5NFqmqP
10
+ m/x5k6iO35VPTrqbO0ZXM2YsoDarjNnYBYBwLd/MpjpVZIHIRcyndK6gWrU15T4I
11
+ cfsIpGfkscraHNA=
12
+ -----END CERTIFICATE REQUEST-----
@@ -0,0 +1,14 @@
1
+ -----BEGIN CERTIFICATE REQUEST-----
2
+ MIIB+zCCAWQCAQAwgaUxCzAJBgNVBAYTAkdCMRIwEAYDVQQIEwlCZXJrc2hpcmUx
3
+ EDAOBgNVBAcTB05ld2J1cnkxFzAVBgNVBAoTDk15IENvbXBhbnkgTHRkMQ4wDAYD
4
+ VQQLEwVTYWxlczEnMCUGA1UEAxMed3d3LnVuc3VwcG9ydGVkLWV4dGVudGlvbnMu
5
+ bmV0MR4wHAYJKoZIhvcNAQkBFg91c2VyQGRvbWFpbi5jb20wgZ8wDQYJKoZIhvcN
6
+ AQEBBQADgY0AMIGJAoGBAK7A15mxNCj+NoDbOYgiDp5V3i3+I3qww73iwy6UjA8e
7
+ /+xOvdLCsXapBCQEz6Zj+AUTPIqVeo6WZbZSHBocBCztRqj5B17gudsaBnV+wJ7h
8
+ Cqy+/TWG95DwlwDSBkoNL5aaB1ytwDJke2+s77RUrI26teTCqdXWJ4EzvOEiZUFZ
9
+ AgMBAAGgFTATBgkqhkiG9w0BCQcxBgwEKiZeJTANBgkqhkiG9w0BAQUFAAOBgQBA
10
+ Idns2ji1Mgs/DMEnBejSpD/cXFQytIZw0hcthhhRYzeZC44SeLoOQl7zusySAnlq
11
+ Pk3NonCEGHYDTw7A3s4RNxsfhEnCddB3hvW07tJzFq/CAyC8kack/3zCzfTT6ZCg
12
+ E6vUd3TRLLjR2KYz34fsvH7VExIm6ilNUzyvIu2oCQ==
13
+ -----END CERTIFICATE REQUEST-----
14
+
@@ -0,0 +1,19 @@
1
+ -----BEGIN CERTIFICATE REQUEST-----
2
+ MIIDETCCAfkCAQAwgZgxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdGbG9yaWRhMRAw
3
+ DgYDVQQHEwdPcmxhbmRvMRYwFAYDVQQKEw1FbnZ5IExhYnMgTExDMREwDwYDVQQL
4
+ EwhJbnRlcm5ldDEVMBMGA1UEAxMMZW52eWxhYnMuY29tMSMwIQYJKoZIhvcNAQkB
5
+ FhRzdXBwb3J0QGVudnlsYWJzLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
6
+ AQoCggEBALlhCULQ4sdyrB48Fz7+FZ8c7IYJAXpJU/bnsTeRvf2je5xD9ZOpQbLA
7
+ lprXaDWWd28LJOenQ7zxPGNGhcsdSnZ/zZautNVh9hgTmqfOCqZO6UV3atmrR3Wc
8
+ 69ZRbIEKf6IjwWpA1IjIa4fI82UVXL2k0R2ZZyz1gvBapa50WEWqYvzv385q9NAP
9
+ lqqZsrh11Sl1jxdk5+a9y74TOyFRwPHH2ZVVAYurZ0JuiAbyiKD+XruL9A2eXw1c
10
+ dAuUiOsmoXrt9lYyXhwcgrrgpdt/uP4+fn5HR+QOEPrB6lX48O3r06KkoYNJ3PKw
11
+ +UhhJpiBK8hn7IR5nHKSb0fq+6Rd+08CAwEAAaAzMBcGCSqGSIb3DQEJBzEKEwhw
12
+ YXNzd29yZDAYBgkqhkiG9w0BCQIxCxMJRW52eSBMYWJzMA0GCSqGSIb3DQEBBQUA
13
+ A4IBAQCE17fnA6ew4gddqo4yXArRjkmYjSWR7/fc620tSEfo6DXS0ToZfDcT/Qo2
14
+ O9i2BLNJjz2zvGzuH39vlFqFy+YYf2EIUZb4NLPAWacdB0XKNX4S8dwUlNW7q9Ji
15
+ SdDI3ggIyUusI9Uw8MQWLgcso3T3f3jIpTLAB+4uy7V4xWNTVrqlcf/bEIlJt/gA
16
+ Seg7hhHWrhmbJ0UjV8CBs/7IITzpkUZbNyuT0XwjU/WbadiSvB3G9jc8yhWPQmo+
17
+ LhNnqXFgShvlkUpugjyz2igUzR9uRZwUG1iHMC+0l7mZ2DD0HKdWeAnMdfVJMSGc
18
+ UhWy1VRgbLSjxJNAOQZSJwta+q/h
19
+ -----END CERTIFICATE REQUEST-----
@@ -0,0 +1,17 @@
1
+ -----BEGIN CERTIFICATE REQUEST-----
2
+ MIICvDCCAaQCAQAwdzELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0dlb3JnaWExEDAO
3
+ BgNVBAcTB0F0bGFudGExFTATBgNVBAoTDEdlb0NlcnRzIEluYzESMBAGA1UECxMJ
4
+ U1NMIFNhbGVzMRkwFwYDVQQDExB3d3cuZ2VvY2VydHMuY29tMIIBIjANBgkqhkiG
5
+ 9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuXWzKA84WdxAhyOSsJgyh4Xa6UCItYcEanPL
6
+ 1NP5vAsDXyoGlKry49hRDGQkX6SQ+ER3NLYw7jjADn0eB9wIe3RRABRaHzaGTR4s
7
+ aFuRlBFahWq7WlRXtyGGM/3LO93GXbN/ZGqZVVzkP/4UhPge6mEs81mTmVAiuLan
8
+ RrNnakt/6wJuJg/leyaXtQ82RHE6Oge+h8LaEbHUtfx2Z8ooiwAr4hk4rAH3AqQf
9
+ mWiEF+XDIEDI0fBWcUCEXTxpfthojP6JuRC1PS1X9kk5P4ol3nSDlDl4YS4x6LF8
10
+ OYhZyBMLxCat9YueS7T8vx64+ilwhXevsqVVu84HHx1TDupLjwIDAQABoAAwDQYJ
11
+ KoZIhvcNAQEFBQADggEBAF9xFJQK0R7m75Qw2LWjQ5jI/V1XlOca0G61TKyuYXdn
12
+ LpJkIo8cpRnU7/GCEM/lSAmIx2sQeIwpzGErwqLVlq3GnsbbDEkaclJ9hAtalDIc
13
+ UrH8Crso1GehjNy08r8UppveG+b/sD7L2GDf7Pxqdxb3x+vt5osmo0l12BFf/85s
14
+ K5tjLVnkqjtbMdESgOPvML0Ppq+q9M4TURDqs8zbMSJBu10oZDgxOyGw53JA7yI3
15
+ PgiRWlylJlblXTpHm/jvPXaEMeCJ9CrO0z4bMF61A52yFW2+jFmA1L58a7OQ68Kg
16
+ u+witRMeQm42iOZGES2p9d/wLPwKXgRPzcvgNyiRLiI=
17
+ -----END CERTIFICATE REQUEST-----
@@ -0,0 +1,27 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEogIBAAKCAQEAuXWzKA84WdxAhyOSsJgyh4Xa6UCItYcEanPL1NP5vAsDXyoG
3
+ lKry49hRDGQkX6SQ+ER3NLYw7jjADn0eB9wIe3RRABRaHzaGTR4saFuRlBFahWq7
4
+ WlRXtyGGM/3LO93GXbN/ZGqZVVzkP/4UhPge6mEs81mTmVAiuLanRrNnakt/6wJu
5
+ Jg/leyaXtQ82RHE6Oge+h8LaEbHUtfx2Z8ooiwAr4hk4rAH3AqQfmWiEF+XDIEDI
6
+ 0fBWcUCEXTxpfthojP6JuRC1PS1X9kk5P4ol3nSDlDl4YS4x6LF8OYhZyBMLxCat
7
+ 9YueS7T8vx64+ilwhXevsqVVu84HHx1TDupLjwIDAQABAoIBAGXVvURX5ydgi4Yp
8
+ AFk7mTNVSrkdmHOk6cXSQ7BfnRemLHnKx8ZGgAygMRDOxDJIWNoaLiKhkAie3MaX
9
+ 6S+DoJy5Z+jVRA8zj1c1JElBTpSxWrU7wBh/i5KhM+HEkB4VTuEQuPjYl82JrkN9
10
+ LqM84yzroxUUsLlUiVxH314xEK4KS4vzEte9Mf3YGO00OTcKRHig3J1en+5m56i/
11
+ 3GsGjCogT8xTAPV+KSX6qU7GQ/1KE0soQzt2WlVQT7HwvcUhLn2C9l28Asn+mZaF
12
+ 1aPsiEoFGPsBfDopWywST6dvxe4RHByLWEpjUUKhUMuv8Eqfd531+qPFnhrHn9QY
13
+ aM5SFAECgYEA4VLDcDjALNNZEYN/hZHm9l/RJONHZ+CLAwpTHDdlwcejHL8gxTo0
14
+ G8cEbgT0IyL6dIAC8aB/ne7Cb/Ua2AIklA04FJe2B4Q83ICmPFtHdoQq/ViGqVxM
15
+ yvU/KY28A7UYIGYmoKFsONo//HIXED61iK7ChUDMUXcZpublOTEQFo8CgYEA0rWQ
16
+ p1EebI7cZqQzSs2wueTKDDswIRnIoX9x8O0Ar1HkzoJ2JOAW999UZ8x8jeQhRNQX
17
+ NZ/r+ixWvzzVPQva+SxgQqx4dB08NJGgdEOkYqzl3bRnR2q2I+nyNDYU8elxIvUd
18
+ 95OGOQZGd12oLUKBG3YIb8Oc4Hfwz5/7ACqE+wECgYBfF1iXobuor0ElnQNSUXLR
19
+ gzp2gNx/wEmqbM8KV27ASwpRdW/VDG01U9ZQwBJwSbC9PdEAPCXfdwXjzeMYSj85
20
+ pCKIvkX6AhrVTA3b5wHPyJOD+7pI+0UFWl7foIs6XVDjS3j9zWIo1CKw3U1Sc8SU
21
+ /HvnVKNltgfDYipW6pfJjQKBgBajPRxMwckF/DXm1D/oI2GFbBOuVDhqLbz0FUi+
22
+ HcG4Oa3aJFlH3g/ZZZcVSBhydwSPCMNRICgrlVJMddhuKqN0mg7vuq026t32+1ci
23
+ YUncq4GLPUFV/KWVH9luKgfnfak0znhn2BbOTsnKPSRHrdlGcBeZ24PePvf/hxb4
24
+ ensBAoGANyQfL6E4RcBHQWZ1d2wq+Gd/mFctLrHWaJwdYd0dxd7oQ5zhue7+yPfD
25
+ q5dosxjGs7ZEF5HbMwf5Iv0RAkb/W4BKja/tC6PIplpCTt59COlGdnLyHJeoRmF6
26
+ KnSai8jcXz2SWdOMQWgHSSdfWqxosIf3wAIwbtY7wNv1t+1JguE=
27
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,15 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIICXQIBAAKBgQDdlqVkMMohJ1kUqBxqZJojCFtJFht7f4JDs5kURI7QSCpN6eB/
3
+ KLqP4x8skx3FGktU/Vgsdri9OeLS71cyw389eJyxmDFroicE0pyAd2o6dZGh1x9/
4
+ 7AJuIDwolhyNAhHLtKppTRh1LIUoU2ZU9xuywN9QzI5Yj29pNBaszsbEJwIDAQAB
5
+ AoGBALm8LTPW5YZ2qedzpiXT35MfzQxs+GpDDdhbsSNY9/BDnRojwKY1aHN1J8tA
6
+ IUL2cFBz7rWOaflKjQLL1WZakcpQW9msIemPF0gKD5cNJrMuPcHZEu5vpPOXcTtR
7
+ N4VxW5+U/PYU5J69j6q800z/Z0rWl+YtLnKc8ZbIIbFX1DBhAkEA9U4WR9QokPDf
8
+ IPjDJOZkBVvvLLfnCx8RkcTmrJslfJ/5VrFLCVHMw1oaZuDOJVIG8bvMElcQR3/E
9
+ qUHCw90V9wJBAOc/2i9gY/Mimzfs9xBNv+NFXEoJdoVHw9NAZgDi9otHZmfQHzYh
10
+ 3DCQLzptJSp4cArVL5SB1mlLBFpmhBkLd1ECQAzjHFKLt9HdhatixkXDANAzQz5z
11
+ LuUrra2dzYyV3gNNGDlQuSN1M6+zpR1whAP76jd66T6xaj6HXNqThNrrW4MCQDAI
12
+ rlx67Cf7vzwdp7AmRj6CEMp8Lrc+kemWjdmPS2Dg4t+bdnA7Fk6sFHNRao/o1nUZ
13
+ lTmGwq+6WlwgwT2miRECQQDrfnkHnjQP3yWtuwzx8/LeMSZ6rfMmQAAWUnF6FoRg
14
+ /v7SVDx353vmj8k+ulQoyP6RKCnKZf4dGPRWCgpetdRk
15
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,30 @@
1
+ -----BEGIN NEW CERTIFICATE REQUEST-----
2
+ MIIE3TCCA8UCAQAwga8xGTAXBgNVBAMMEG1haWwuc2lwY2hlbS5jb20xCzAJBgNV
3
+ BAsMAklUMTwwOgYDVQQKDDNTYXVkaSBJbnRlcm5hdGlvbmFsIFBldHJvY2hlbWlj
4
+ YWwgQ29tcGFueSAoU0lQQ0hFTSkxHzAdBgNVBAcMFkp1YmFpbCBJbmR1c3RyaWFs
5
+ IENpdHkxGTAXBgNVBAgMEEVhc3Rlcm4gUHJvdmluY2UxCzAJBgNVBAYTAlNBMIIB
6
+ IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv3FqEVQCm0bBsA1YQX+/cq0y
7
+ 2ZBPMsrQtP5S8F8bi2S8b6+BmsPuOIo7pdl7KYmpiD228mrpQqyrwkX7oBkNn94u
8
+ TnxUlNJ+ach8Ni+V42O0IAALtYBd1JNoaCqmpr4+xmtWvdFow3cDTSYmqPapY9iN
9
+ 2fxDm7VdNv9WMV89CrZg0a6F2p+PaKn8hOR1guax2AYnyVNx9DZJYiHqRfGXyWM1
10
+ dIZaHTL/RtOzhrzxOvU/u+qulzWsSIslrz36rDqNTdDHGZNbKzix1etA0qP349/B
11
+ jqIN7lP4+8pjaPp/Ygit6M2wuCTFhq5rm5SHanBlzCCq8pyhraQCjTvdNH0JRQID
12
+ AQABoIIB5jAaBgorBgEEAYI3DQIDMQwWCjYuMS43NjAwLjIwZQYJKwYBBAGCNxUU
13
+ MVgwVgIBBQwYc2lwYy1jYXMwMS5zaXBjaGVtLmxvY2FsDBNTSVBDSEVNXFNJUEMt
14
+ Q0FTMDEkDCJNaWNyb3NvZnQuRXhjaGFuZ2UuU2VydmljZUhvc3QuZXhlMHIGCisG
15
+ AQQBgjcNAgIxZDBiAgEBHloATQBpAGMAcgBvAHMAbwBmAHQAIABSAFMAQQAgAFMA
16
+ QwBoAGEAbgBuAGUAbAAgAEMAcgB5AHAAdABvAGcAcgBhAHAAaABpAGMAIABQAHIA
17
+ bwB2AGkAZABlAHIDAQAwgewGCSqGSIb3DQEJDjGB3jCB2zAOBgNVHQ8BAf8EBAMC
18
+ BaAwgZsGA1UdEQSBkzCBkIISbWFpbC5zaXBjaGVtLmxvY2FsghBtYWlsLnNpcGNo
19
+ ZW0uY29tggtzaXBjaGVtLmNvbYIaYXV0b2Rpc2NvdmVyLnNpcGNoZW0ubG9jYWyC
20
+ GGF1dG9kaXNjb3Zlci5zaXBjaGVtLmNvbYIKc2lwYy1jYXMwMYIKc2lwYy1jYXMw
21
+ MoINc2lwY2hlbS5sb2NhbDAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBSqTt2+024w
22
+ mEJ1nXZpJKMvJAb/uTANBgkqhkiG9w0BAQUFAAOCAQEAIMAxnkhyqkmnqdXfWVSV
23
+ ucYeulY0UWlxquBO91n39Vx7f8dDuTlxLXnO4N0GYgkHQWB+NJOXpGhowRc9iJLV
24
+ uKFzCbF/t5JekmGU+Vh3+Lns/09pa4zs1LAU+lvfEosI0ay8iBRP7aN0h4H6W7Y9
25
+ cmh3Z1OemLy3HvbHkplbNN0agEpcITOzvugN5SnGaXS44271VSas10pBWD27CjlA
26
+ nsP4Q1n8OHO9I83UTGqjqzMjMnFMZ7DcFIzEoW8M6TqJQsQVpZ+6WxGKG/1z63Ka
27
+ OGbJUk+wK5KJjp8fkB1gSlQhvEyDF6DFcQCjbcssfn06hobLuiF2aNb9YDFUf+s/
28
+ 9g==
29
+ -----END NEW CERTIFICATE REQUEST-----
30
+
@@ -0,0 +1,26 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEHTCCAwWgAwIBAgIDI2WeMA0GCSqGSIb3DQEBBQUAMEkxCzAJBgNVBAYTAkhL
3
+ MRYwFAYDVQQKEw1Ib25na29uZyBQb3N0MSIwIAYDVQQDExlIb25na29uZyBQb3N0
4
+ IGUtQ2VydCBDQSAxMB4XDTA5MDgxMDA4NDYwOVoXDTExMDgyOTE2MDAwMFowgcMx
5
+ CzAJBgNVBAYTAkhLMSYwJAYDVQQKEx1Ib25na29uZyBQb3N0IGUtQ2VydCAoU2Vy
6
+ dmVyKTETMBEGA1UECxMKMDAwMDA3NzE1NjElMCMGA1UECxMcMDAwMDAwMDAwMDAw
7
+ MDAwMDAwMDAwMDAwSEtQTzEhMB8GA1UECxMYSG9uZyBLb25nIFNBUiBHb3Zlcm5t
8
+ ZW50MQ0wCwYDVQQLEwRIS1BPMR4wHAYDVQQDExVhcHAxLmhvbmdrb25ncG9zdC5j
9
+ b20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKB5YgVYDWFfeQSg7Bd3cWDK
10
+ UnArAqfNqGC59KxwwY5tpy8QQNpI8l/SHDpDqJ0E/4pNFEDFNSv2c/VaORmxybqI
11
+ mbP6iUZuxjBa3YMfDYMuVjvA+cw7JGsyE3hPz3OJlkzTIgB4J7Hvbo+XlKn8a/N4
12
+ rBeNVQm0QBdBagctkVKTAgMBAAGjggEVMIIBETA+BgNVHSAENzA1MDMGCisGAQQB
13
+ /R4BARAwJTAjBggrBgEFBQcCARYXd3d3Lmhvbmdrb25ncG9zdC5nb3YuaGswCQYD
14
+ VR0TBAIwADARBglghkgBhvhCAQEEBAMCBkAwDgYDVR0PAQH/BAQDAgUgMFoGA1Ud
15
+ IwRTMFGhS6RJMEcxCzAJBgNVBAYTAkhLMRYwFAYDVQQKEw1Ib25na29uZyBQb3N0
16
+ MSAwHgYDVQQDExdIb25na29uZyBQb3N0IFJvb3QgQ0EgMYICA+0wRQYDVR0fBD4w
17
+ PDA6oDigNoY0aHR0cDovL2NybDEuaG9uZ2tvbmdwb3N0Lmdvdi5oay9jcmwvZUNl
18
+ cnRDQTFDUkwyLmNybDANBgkqhkiG9w0BAQUFAAOCAQEAsyO3KMxHle+AyWM8Ku5v
19
+ Sz2uXaR8YmadOIBc8MKe522j6eq2MORC4EQ/ObCJ2vzyq8NoJ6aUtIi8k3He9B00
20
+ pRKa9uAtgFGW1HVr6soGWvr4UcSVCDYs6C58+XEgbzCiurO5IIaprQCjOptkTLa/
21
+ x4QXkF6YVvtYXufjILl1i5RPr6YmwByeGxJnPKUhNuDsqJ9PfGqq3wfBX7ogEwG7
22
+ Hu9L2Kbk9P7+OvqU7flh9GfxhPOTyFvN9itwcmImIScM9EG59JsZOBZHN4SeUzWk
23
+ cYrNNv1NTqzBfFWKnX1aAuzeSC3tQP472gC+NgTcL84aBBjCk+2xmwP9OLdQyrkd
24
+ ZQ==
25
+ -----END CERTIFICATE-----
26
+
@@ -0,0 +1,20 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
3
+ UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
4
+ dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
5
+ MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
6
+ dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
7
+ AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
8
+ BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
9
+ cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
10
+ AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
11
+ MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
12
+ aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
13
+ ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
14
+ IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
15
+ MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
16
+ A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
17
+ 7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
18
+ 1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
19
+ -----END CERTIFICATE-----
20
+
@@ -0,0 +1,28 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEnDCCA4SgAwIBAgIQaUiiayAapCHomLHEksfFjjANBgkqhkiG9w0BAQUFADBY
3
+ MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo
4
+ R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx
5
+ MjkwMDAwMDBaFw0xNjExMjgyMzU5NTlaMIGFMQswCQYDVQQGEwJVUzEVMBMGA1UE
6
+ ChMMR2VvVHJ1c3QgSW5jMTEwLwYDVQQLEyhTZWUgd3d3Lmdlb3RydXN0LmNvbS9y
7
+ ZXNvdXJjZXMvY3BzIChjKTA2MSwwKgYDVQQDEyNHZW9UcnVzdCBFeHRlbmRlZCBW
8
+ YWxpZGF0aW9uIFNTTCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
9
+ AMLv7ewLLXKKdGhzNm4QqH5If1i7eGfc7XvWfKZPPZ9dbwrQoLRl/b7Tv3e2lKWC
10
+ /4GVnSgQBuzCtJCqWlFMc9lrdKg1SfSmNoDUXHWennwBx4ycgciGgxqOvQATotz/
11
+ pXiqdywhYgiXP4C992ekedt91z5uttWWuZiGTnpn4pOv2qXRJ/vxZsMqAwy2x4Id
12
+ Ofs83ik2cV3hqLUWOXwb/3uG9YCSleADO6pE+/QAteWp4voY+YSaweH2Lg6BixQp
13
+ NP8fVWCIpJnGb28EOTp1pKceWN+3/8maHXDbg6DTgxstbSqQW6NjkXO1/52CekHz
14
+ 06ovCw2fz0TAXseha8+ulNsCAwEAAaOCATIwggEuMB0GA1UdDgQWBBQoxOuP8V95
15
+ kKMrVcNWTn1rU3IsGDA9BggrBgEFBQcBAQQxMC8wLQYIKwYBBQUHMAGGIWh0dHA6
16
+ Ly9FVlNlY3VyZS1vY3NwLmdlb3RydXN0LmNvbTASBgNVHRMBAf8ECDAGAQH/AgEA
17
+ MEYGA1UdIAQ/MD0wOwYEVR0gADAzMDEGCCsGAQUFBwIBFiVodHRwOi8vd3d3Lmdl
18
+ b3RydXN0LmNvbS9yZXNvdXJjZXMvY3BzMEEGA1UdHwQ6MDgwNqA0oDKGMGh0dHA6
19
+ Ly9FVlNlY3VyZS1jcmwuZ2VvdHJ1c3QuY29tL0dlb1RydXN0UENBLmNybDAOBgNV
20
+ HQ8BAf8EBAMCAQYwHwYDVR0jBBgwFoAULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ
21
+ KoZIhvcNAQEFBQADggEBAAJgoxYSndgcGeRaN2z/Mpg3Rk+8gXyAw8qJKgD+Xj7s
22
+ uowrH6uVa5GUIaBgHwIG+s8XbfiVq814IxSWwJ0fG+tQ4WVCitKzya2Aw2fPtFgb
23
+ 1QTkWP40ReD7pIQii+niN0yY8Qv/pIlT0U3AaEjXWYcaO3310Pkjcspg/cMiFfCa
24
+ lVhvfCST7KUSPbQbAejuae1Ba1LLmrdcFdG9BkB64AyXy2Dngl9qX95JhFZqr3yw
25
+ S62MTw95oMwRPCXnRr960C+IyL/rlAtqdTN/cwC4EnAjXlV/RVseELECaNgnQM8k
26
+ CeJldM6JRI17KJBorqzCOMhWDTOIKH9U/Dw8UAmTPTg=
27
+ -----END CERTIFICATE-----
28
+
@@ -0,0 +1,22 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDizCCAvSgAwIBAgIDBo4dMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT
3
+ MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0
4
+ aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMTI4MTYwODMxWhcNMTgwODIxMTUwODMx
5
+ WjBYMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UE
6
+ AxMoR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIw
7
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL64FXv/1Hx9Z62DZHvIQlMt3/aE
8
+ CCBh1gFZapxEEa/vdv2Vfs5hMLt6g18CvQFmyu4VjW+hMJy9oYWelDrzVogAMc/Y
9
+ 7mqWAtntA4z7dW3n6rhVFgUWmvTgXrGIwGSFXBVNiMe3uuB16a0FPZ3HiUjguyjI
10
+ A+Ewk2ReUsBZcCI1V4iK8ZUKg9e8MXMBNO3vRnHgawKoNXJrl5tm4MsceV/YGgRo
11
+ HkcC5p1g4jaXAd/ONZLfvmfHbXdZO4+d1pAVlLxCNBDBOfmxJz5+1op1xbKvltOi
12
+ 3pvkmL594emBrbZv/NcO2uA0sA0ad+fjCJjvWPqchLc2r8LfrNL0EAZwcTUCAwEA
13
+ AaOB6DCB5TAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFCzVUEGXFYvwjzZhW0r7
14
+ a9mZyTOSMB8GA1UdIwQYMBaAFEjmaPkr0rKV10fYIyAQTzOYkJ/UMA8GA1UdEwEB
15
+ /wQFMAMBAf8wOgYDVR0fBDMwMTAvoC2gK4YpaHR0cDovL2NybC5nZW90cnVzdC5j
16
+ b20vY3Jscy9zZWN1cmVjYS5jcmwwRgYDVR0gBD8wPTA7BgRVHSAAMDMwMQYIKwYB
17
+ BQUHAgEWJWh0dHA6Ly93d3cuZ2VvdHJ1c3QuY29tL3Jlc291cmNlcy9jcHMwDQYJ
18
+ KoZIhvcNAQEFBQADgYEAe2AG6d2nHSkI7xH51Ts80itTyz7tvnZgZEig5svoScMa
19
+ v92txUy9U0hVQdsYsU47OmgsJFpB9cipRKYyKS11+E3yUI7w4pvp4eQ7cLcyiduo
20
+ OcVbaFa9BBXDtssbJEqn/MTVjbaY3QP2sbOU2j9SoKRQBspFZ07/8UGJQAA2fnk=
21
+ -----END CERTIFICATE-----
22
+
@@ -0,0 +1,22 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
3
+ A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
4
+ b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
5
+ MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
6
+ YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
7
+ aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
8
+ jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
9
+ xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
10
+ 1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
11
+ snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
12
+ U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
13
+ 9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
14
+ BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B
15
+ AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
16
+ yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE
17
+ 38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
18
+ AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
19
+ DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
20
+ HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
21
+ -----END CERTIFICATE-----
22
+
@@ -0,0 +1,21 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDMjCCAhqgAwIBAgICA+0wDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx
3
+ FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg
4
+ Um9vdCBDQSAxMB4XDTAzMDUxNTA3MjkzNFoXDTEzMDUxNTA3MjkxMFowSTELMAkG
5
+ A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIjAgBgNVBAMTGUhvbmdr
6
+ b25nIFBvc3QgZS1DZXJ0IENBIDEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
7
+ AoIBAQDMuy41bQKNRsp21OVxWu3JI4Vp48VgeVriKqLBhmdOird5LD9FhsiIStw0
8
+ mOXZVuwJ8HmpuE4phvqIpSuxKhz/eCCTWO0duIa7XZ36uEv3vWJowjkcmn/r+6V3
9
+ AN1Ts/1Ga39eqVIIJGMVDpFAH1vS3II7YOoYWJkfbwgIxSJ80bVxroNEzP2T2bW/
10
+ m4JhFhGC2WBHM8mobpvqqRFPQ1uc+w7bFMs3mKc+zq71FjTu0s3NAZu3LXIdMYn2
11
+ pOM0agz8J3Yn/3Stru3UiC7HASupAcasbIAf6edrroYf4ZvQQp4oiaG9bGEchjyw
12
+ ghGQPn9MFq+AzV1SkCjl/LPd3FFRAgMBAAGjJjAkMBIGA1UdEwEB/wQIMAYBAf8C
13
+ AQAwDgYDVR0PAQH/BAQDAgHGMA0GCSqGSIb3DQEBBQUAA4IBAQChcHcWuSHwYRMl
14
+ RFbLCt0ee9zmataVUMaCpSNwHutmvaYbnwDe30ipJkUzxBlTcWgHp5zKTZLzU8go
15
+ rsA+pHpznU2VLD+Sr1OOpefJ+t04ZmkAYpTCsi65SEEL3dhFRF/fHtTK/4JKSHuZ
16
+ 3oyuHwbjONGRPos212h/EFw20vR5R2acK8l5/6iPkl+jKhmfqsHd5Ve/JWN3G05+
17
+ 4KkrAgLFjCXUh9PmFTeGsR7GELuL6xQC33udGnLDRALdumafePAMbKqYLUb6Ftrz
18
+ Fb9gih/+sTUt+hWme/Bas3Vwl7oswqzMDaJG4q/vqO5w48LPvE1nKEMoVw5nzJ+h
19
+ f+4cB/TZ
20
+ -----END CERTIFICATE-----
21
+
@@ -0,0 +1,21 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDLTCCAhWgAwIBAgIBBDANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJISzEW
3
+ MBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEeMBwGA1UEAxMVSG9uZ2tvbmcgUG9zdCBS
4
+ b290IENBMB4XDTAwMDExNjA4NDMwMFoXDTEwMDExNjIzNTkwMFowRzELMAkGA1UE
5
+ BhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25n
6
+ IFBvc3QgZS1DZXJ0IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
7
+ 0Nimo3Osj9gWM+WFpQ5PksMquQ8CXOUdpHCOl9l5KvGZqdSH3QhYhYDe0MmM+mSO
8
+ Oz1HHxjDniDmEZuzTveQdhlkOYuW5zAhNy7R+kXOnEku0Tmvrd6/YEHQxThgTXSk
9
+ wF0vcd4zMrajUNQUv+d1QbL40Gg6mV3T3wbZG9gk4KblakGd/znx/EeNAGaLRrjU
10
+ GNn3l/DmxzEf80uBtLYBsBhUzCA24SqpMh5x3waEyN/kNzjb7NT0XI0hKs0yGE32
11
+ R7hrkHM/RSTa7in0AqLy/gJaPBIypzpY+5h/XRMmef0yAggWThOJJtWhJC8/AwOF
12
+ wPfAkZtJ71+f8+2c6t7x7wIDAQABoyYwJDAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0T
13
+ AQH/BAgwBgEB/wIBADANBgkqhkiG9w0BAQUFAAOCAQEAbaENyadgv8R5k2qUGWCm
14
+ 4iA3XLu/P8qo6sulk+M+bKpL8WmU+Pl36yeBZax+QJTrHrdqgvgaZNvfmRykOvVm
15
+ OZMGLSG9DxejqZtydEC5kGCqr3XmdQgkM8END5YDZNaOlj92WAVnuF7lw0nM54w9
16
+ 1URkLN7I6tbAbD4X66HwKB2JotO9EPLbdVrMZIPOj7wNMWdxbBImmHIizH3mD7HV
17
+ VdjLQNgh5ErB2mDouKLwHX/ok2GiiNRC8vNqBgV7cJDs58c23Pm7q2TjjmkAMCc0
18
+ dy0QCKffH1ncMcPkVha1EhIx35HMyDa0RPJlVjW0M9LWMzfup9luU3uYKd1EG4g+
19
+ fA==
20
+ -----END CERTIFICATE-----
21
+
@@ -0,0 +1,21 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx
3
+ FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg
4
+ Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG
5
+ A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr
6
+ b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
7
+ AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ
8
+ jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn
9
+ PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh
10
+ ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9
11
+ nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h
12
+ q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED
13
+ MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC
14
+ mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3
15
+ 7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB
16
+ oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs
17
+ EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO
18
+ fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi
19
+ AmvZWg==
20
+ -----END CERTIFICATE-----
21
+
@@ -0,0 +1,20 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDKzCCAhOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJISzEW
3
+ MBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEeMBwGA1UEAxMVSG9uZ2tvbmcgUG9zdCBS
4
+ b290IENBMB4XDTAwMDExNjA3NDIwMFoXDTEwMDExNjIzNTkwMFowRTELMAkGA1UE
5
+ BhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxHjAcBgNVBAMTFUhvbmdrb25n
6
+ IFBvc3QgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKWi
7
+ kb485TY8Su80j4j9um1xpmJy7cIGvHYlu4pfFSUnON3pkZEBim+O1Vumvz4js2PD
8
+ VOHxwwyWTPt6Dice8CMQgNIoaL0GlYt96Sn51Cf28ndfIqslqEWXl0VWYVichyQy
9
+ nTgdPe24HHQFNWWgpZEPr2g9eg9cIfvnLBv+VoZScXNkgdTghIDQlVa9SdA9JDNd
10
+ jnqCOFS2avS6dGkuu9FBcBF05jdoY69M6tyiIM32j0zm0IAIJFCZGHTlztYH0HgW
11
+ Bl893IXLdD94fxnIDY5IVGlqBYCpbLJB/rQEBou6taJ+Kaaqr0HpHEkRtw1ICHJ/
12
+ S4OY8xMaeUvRThTOEjMCAwEAAaMmMCQwEgYDVR0TAQH/BAgwBgEB/wIBAzAOBgNV
13
+ HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAJUFGRYwVpy5mEtANI0RW08k
14
+ 8SxowrWsteC0hKBMbeyKdmHB89V08WGffL4gkidS+jEkuNGe4PNtULqt4i2vKHVr
15
+ 4Srv+CHNO8vIMh7TulnPOOjykHjdnghElV+GT2qb3KKL5ZymVouGZTUcbAzKHqSe
16
+ TlwSk9J4yNhp6mmGJtSk04+tV0pY9OzGf2y7tPLHkvLOPPRCwyFnhm2lTaA/wvcY
17
+ q1fW6MeS+oanNgUOGXK/BvCspERMrD7o730LSMXBGzPpyQHQzO/+Ye2M6DKazPXJ
18
+ 2ck9eKYABR0p6yYBjkv+OazFkv++cJpXwvLPIbhmLt7g1P6727RHiZJ/GLwshrU=
19
+ -----END CERTIFICATE-----
20
+
@@ -0,0 +1,31 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIFaDCCBFCgAwIBAgICCokwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAlVT
3
+ MRUwEwYDVQQKEwxHZW9UcnVzdCBJbmMxMTAvBgNVBAsTKFNlZSB3d3cuZ2VvdHJ1
4
+ c3QuY29tL3Jlc291cmNlcy9jcHMgKGMpMDYxLDAqBgNVBAMTI0dlb1RydXN0IEV4
5
+ dGVuZGVkIFZhbGlkYXRpb24gU1NMIENBMB4XDTEwMDYxODIwNTUwNloXDTEyMDgx
6
+ MjE0MTkwNVowgdUxGzAZBgNVBA8TElYxLjAsIENsYXVzZSA1LihiKTETMBEGCysG
7
+ AQQBgjc8AgEDEwJVUzEYMBYGCysGAQQBgjc8AgECEwdHZW9yZ2lhMRAwDgYDVQQF
8
+ EwcwNDUwNzcxMQswCQYDVQQGEwJVUzEQMA4GA1UECBMHR2VvcmdpYTEQMA4GA1UE
9
+ BxMHQXRsYW50YTEVMBMGA1UEChMMR2VvQ2VydHMgSW5jMRIwEAYDVQQLEwlTU0wg
10
+ U2FsZXMxGTAXBgNVBAMTEHd3dy5nZW9jZXJ0cy5jb20wggEiMA0GCSqGSIb3DQEB
11
+ AQUAA4IBDwAwggEKAoIBAQCfSaBRuqglkqNaIRqdd2CzPOVdw14YPheWEOG28iFI
12
+ Oi+Pzjk0XU+KFEJ3ID7aC+ntyb/CjXjOiv7k9Xrjp4+y4e/bXPr4Cz1SSQwYtY5Q
13
+ 6xbUnRXkCn3SETsGeub8pKM/KCJB0Tbmmtqw7TgJbGSHTbWNkxTY9oUIMRYx44sE
14
+ 2LLh2o08WMiYrFO2L9kRyR6rn4tLL7RGj4Q2ZZbWG4xzkwDL4GhZ9eUnOFz7vzWc
15
+ CB+EAggMlM8pck1bJD/7z8qCMbV7h/NYJFDRb8Gd1skBd0b58tYlY8sn+P9qYRWc
16
+ oWUWES8XSP/HUehuLKIzIy0JckAt88U8rRy4DLP9rD3BAgMBAAGjggGOMIIBijAf
17
+ BgNVHSMEGDAWgBQoxOuP8V95kKMrVcNWTn1rU3IsGDBuBggrBgEFBQcBAQRiMGAw
18
+ KgYIKwYBBQUHMAGGHmh0dHA6Ly9FVlNTTC1vY3NwLmdlb3RydXN0LmNvbTAyBggr
19
+ BgEFBQcwAoYmaHR0cDovL0VWU1NMLWFpYS5nZW90cnVzdC5jb20vZXZjYS5jcnQw
20
+ DgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAp
21
+ BgNVHREEIjAgghB3d3cuZ2VvY2VydHMuY29tggxnZW9jZXJ0cy5jb20wQgYDVR0f
22
+ BDswOTA3oDWgM4YxaHR0cDovL0VWU1NMLWNybC5nZW90cnVzdC5jb20vY3Jscy9n
23
+ dGV4dHZhbGNhLmNybDAMBgNVHRMBAf8EAjAAMEsGA1UdIAREMEIwQAYJKwYBBAHw
24
+ IgEGMDMwMQYIKwYBBQUHAgEWJWh0dHA6Ly93d3cuZ2VvdHJ1c3QuY29tL3Jlc291
25
+ cmNlcy9jcHMwDQYJKoZIhvcNAQEFBQADggEBAIppmd9Lm9+cbSPrKKlIdunEbwTU
26
+ kquqmCaJP7tP6ASb2NfJczfzpdlxidiVOp1wJxIHhuAQjhWt0nO7aOTjMD8WZa1d
27
+ NIQMWHeFyhAuqJFXtJ6Ha9t1CB+V3ksNNKIhR5urZXlRc4G7Y2udyIYuqq4VzWsS
28
+ TFCS6/lAuDob4h5+TEdm51CV6BFyJweYt4o1FKSDVKwQmRMmc4Tk2oyBlX4jKPdS
29
+ WPKMKb7f934e69sZlne575+Ml4FJm3g2QK+AR/2rSuQsO2vV+stkhknLZsCIrrkh
30
+ 9zClcbFt/pHG1LTI0KNs87Eix3avl2uLIzb9MSyQbKPbtDXlH+fqSAao/mY=
31
+ -----END CERTIFICATE-----
@@ -0,0 +1,22 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDYTCCAsqgAwIBAgIDDqS7MA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT
3
+ MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0
4
+ aWZpY2F0ZSBBdXRob3JpdHkwHhcNMTAwMTA0MTU1ODMzWhcNMTEwMTA2MTAzNzAy
5
+ WjCB6zEpMCcGA1UEBRMgVk9hT080MW1qbHdiTS8tbFNvZWlpTjRuQWxabUJuRFMx
6
+ CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw53d3cudHdvbmdvLmNvbTETMBEGA1UECxMK
7
+ R1Q5OTYyNTQyMzExMC8GA1UECxMoU2VlIHd3dy5nZW90cnVzdC5jb20vcmVzb3Vy
8
+ Y2VzL2NwcyAoYykxMDE3MDUGA1UECxMuRG9tYWluIENvbnRyb2wgVmFsaWRhdGVk
9
+ IC0gUXVpY2tTU0wgUHJlbWl1bShSKTEXMBUGA1UEAxMOd3d3LnR3b25nby5jb20w
10
+ gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAPQnD+rXT4qG8tbp9qDV4EflRm1d
11
+ z4U0DqjcSZDPVLN3ae3E1dQQP7aSe4LlgYP0ZFgn+cTNFOwe950diE22zPQR/yRq
12
+ ZhzNkXwvwxL1eirP6Evd3aX60xmQoV/g103KsVeCx+ZJ/6G1xA01x4Sw+5G1pH0j
13
+ T+NnqYAODxD3uxDnAgMBAAGjga4wgaswDgYDVR0PAQH/BAQDAgTwMB0GA1UdDgQW
14
+ BBRO6N23fnbWi7eK5OHvN05UYN+LijA6BgNVHR8EMzAxMC+gLaArhilodHRwOi8v
15
+ Y3JsLmdlb3RydXN0LmNvbS9jcmxzL3NlY3VyZWNhLmNybDAfBgNVHSMEGDAWgBRI
16
+ 5mj5K9KylddH2CMgEE8zmJCf1DAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUH
17
+ AwIwDQYJKoZIhvcNAQEFBQADgYEACmWFvfv3qUV3KO0j5R3eS35cl44EvVeq8FFX
18
+ Ib46eOoMybZLt4tMK56zeTyE4mACOdjqLB4G8gLYTDMw4bGpHBLnOM+F97As7FD3
19
+ VpzIfd8DBTkJqC/u9zpHz7VCWoufYIXRzH/kSh6V3TJlTWasgYsI+OLfPuXra4WY
20
+ FgjRhhc=
21
+ -----END CERTIFICATE-----
22
+
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe OpenSSL::SSL::SSLSocket do
4
+ it 'carries the OpenSSLExtensions::SSL::SSLSocket extensions' do
5
+ OpenSSL::SSL::SSLSocket.ancestors.should include(OpenSSLExtensions::SSL::SSLSocket)
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe OpenSSL::X509::Certificate do
4
+ subject { ssl_certificates('www.geocerts.com') }
5
+
6
+ it "includes the OpenSSLExtensions::X509::Certificate extensions" do
7
+ subject.should be_kind_of OpenSSLExtensions::X509::Certificate
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe OpenSSL::X509::Name do
4
+ subject { ssl_certificates('www.geocerts.com').issuer }
5
+
6
+ it "includes the OpenSSLExtensions::X509::Name extensions" do
7
+ subject.should be_kind_of OpenSSLExtensions::X509::Name
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ describe OpenSSL::X509::Request do
4
+ subject { certificate_request('geocerts') }
5
+
6
+ it "includes the OpenSSLExtensions::X509::Request extensions" do
7
+ subject.should be_kind_of OpenSSLExtensions::X509::Request
8
+ end
9
+ end
10
+
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe OpenSSLExtensions::SSL::SSLSocket do
4
+ context 'peer_cert_chain' do
5
+ it 'delegates to OpenSSLExtensions::X509::CertificateChain' do
6
+ pending 'Figure out how to stub the IO required for SSLSocket without using an actual File or TCPSocket.'
7
+ OpenSSLExtensions::X509::CertificateChain.
8
+ should_receive(:new).
9
+ with(an_instance_of(OpenSSL::X509::Certificate),
10
+ an_instance_of(Array)).
11
+ once.
12
+ and_return([])
13
+ subject.peer_cert_chain
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe OpenSSLExtensions::X509::AuthorityKeyIdentifier do
4
+ context 'using a V1 identifier' do
5
+ subject { OpenSSLExtensions::X509::AuthorityKeyIdentifier.new('DirName:/C=HK/O=Hongkong Post/CN=Hongkong Post Root CA 1, serial:03:ED') }
6
+
7
+ its(:issuer_name) { should == 'Hongkong Post Root CA 1' }
8
+ its(:serial_number) { should == '03:ED' }
9
+ its(:serial) { should == '03:ED' }
10
+ end
11
+
12
+ context 'using a V3 identifier' do
13
+ subject { OpenSSLExtensions::X509::AuthorityKeyIdentifier.new("keyid:28:C4:EB:8F:F1:5F:79:90:A3:2B:55:C3:56:4E:7D:6B:53:72:2C:18\n") }
14
+
15
+ its(:key_id) { should == '28:C4:EB:8F:F1:5F:79:90:A3:2B:55:C3:56:4E:7D:6B:53:72:2C:18' }
16
+ end
17
+ end
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+
3
+ describe OpenSSLExtensions::X509::CertificateChain do
4
+ context 'with SSL V3 certificates' do
5
+ subject do
6
+ OpenSSLExtensions::X509::CertificateChain.
7
+ new(ssl_certificates('www.geocerts.com'), [ssl_certificates('www.geocerts.com'),
8
+ ssl_certificates('GeoTrust Primary Certification Authority'),
9
+ ssl_certificates('GeoTrust Extended Validation SSL CA') ])
10
+ end
11
+
12
+ it 'is the correct size' do
13
+ subject.size.should == 3
14
+ end
15
+
16
+ it 'reports itself as an Array' do
17
+ subject.class.should == Array
18
+ end
19
+
20
+ it 'is in the correct order' do
21
+ subject.should == [ssl_certificates('www.geocerts.com'),
22
+ ssl_certificates('GeoTrust Extended Validation SSL CA'),
23
+ ssl_certificates('GeoTrust Primary Certification Authority')]
24
+ end
25
+ end
26
+
27
+ context 'with SSL V1 certificates' do
28
+ subject do
29
+ OpenSSLExtensions::X509::CertificateChain.
30
+ new(ssl_certificates('app1.hongkongpost.com'), [ssl_certificates('app1.hongkongpost.com'),
31
+ ssl_certificates('Hongkong Post e-Cert CA'),
32
+ ssl_certificates('Hongkong Post Root CA'),
33
+ ssl_certificates('Hongkong Post e-Cert CA 1'),
34
+ ssl_certificates('Hongkong Post Root CA 1') ])
35
+ end
36
+
37
+ it 'filters out unlinked certificates' do
38
+ subject.should_not include(ssl_certificates('Hongkong Post e-Cert CA'))
39
+ subject.should_not include(ssl_certificates('Hongkong Post Root CA'))
40
+ end
41
+
42
+ it 'includes chained certificates' do
43
+ subject.should include(ssl_certificates('app1.hongkongpost.com'))
44
+ subject.should include(ssl_certificates('Hongkong Post e-Cert CA 1'))
45
+ subject.should include(ssl_certificates('Hongkong Post Root CA 1'))
46
+ end
47
+
48
+ it 'is in the correct order' do
49
+ subject.should == [ssl_certificates('app1.hongkongpost.com'),
50
+ ssl_certificates('Hongkong Post e-Cert CA 1'),
51
+ ssl_certificates('Hongkong Post Root CA 1')]
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,109 @@
1
+ require 'spec_helper'
2
+
3
+ describe OpenSSLExtensions::X509::Certificate do
4
+ subject { extended_ssl_certificates('www.geocerts.com') }
5
+
6
+ its(:subject_alternative_names) { should == %w(www.geocerts.com geocerts.com) }
7
+ its(:subject_key_identifier) { should be_nil }
8
+ its(:authority_key_identifier) { should be_kind_of(OpenSSLExtensions::X509::AuthorityKeyIdentifier) }
9
+ its(:ssl_version) { should == 3 }
10
+
11
+ context 'strength' do
12
+ it 'is 2048 bits' do
13
+ subject.strength.should == 2048
14
+ end
15
+
16
+ it 'is 1024 bits' do
17
+ extended_ssl_certificates('www.twongo.com').strength.should == 1024
18
+ end
19
+ end
20
+
21
+ context 'allows_certificate_signing?' do
22
+ context 'for V3' do
23
+ it 'is true for a root certificate' do
24
+ extended_ssl_certificates('GeoTrust Primary Certification Authority').allows_certificate_signing?.should be_true
25
+ end
26
+
27
+ it 'is false for a site certificate' do
28
+ extended_ssl_certificates('www.geocerts.com').allows_certificate_signing?.should be_false
29
+ end
30
+ end
31
+
32
+ context 'for V1' do
33
+ it 'is true for a root certificate' do
34
+ extended_ssl_certificates('HongKong Post Root CA 1').allows_certificate_signing?.should be_true
35
+ end
36
+
37
+ it 'is false for a site certificate' do
38
+ extended_ssl_certificates('app1.hongkongpost.com').allows_certificate_signing?.should be_false
39
+ end
40
+ end
41
+ end
42
+
43
+ context 'issuing_certificate?' do
44
+ context 'for V3' do
45
+ it 'is true when passing the issuing certificate' do
46
+ extended_ssl_certificates('www.geocerts.com').
47
+ issuing_certificate?(extended_ssl_certificates('GeoTrust Extended Validation SSL CA')).should be_true
48
+ end
49
+
50
+ it 'is false when passing the distant root certificate' do
51
+ extended_ssl_certificates('www.geocerts.com').
52
+ issuing_certificate?(extended_ssl_certificates('GeoTrust Primary Certification Authority')).should be_false
53
+ end
54
+
55
+ it 'is false when passing a different site certificate' do
56
+ extended_ssl_certificates('www.geocerts.com').
57
+ issuing_certificate?(extended_ssl_certificates('www.twongo.com'))
58
+ end
59
+ end
60
+ end
61
+
62
+ context 'equality (==)' do
63
+ it 'is true with matching PEMs' do
64
+ ssl_certificates('www.geocerts.com').should == ssl_certificates('www.geocerts.com')
65
+ end
66
+
67
+ it 'is false with mismatched PEMs' do
68
+ certificate = ssl_certificates('www.geocerts.com')
69
+ certificate.should_receive(:to_pem).and_return('DIFFERENTPEM')
70
+ ssl_certificates('www.geocerts.com').should_not == certificate
71
+ end
72
+ end
73
+
74
+ context 'in a collection, uniq' do
75
+ it 'removes duplicate certificates' do
76
+ [ssl_certificates('www.geocerts.com'),
77
+ ssl_certificates('www.geocerts.com')].uniq.should ==
78
+ [ssl_certificates('www.geocerts.com')]
79
+ end
80
+
81
+ it 'does not modify non-duplicates' do
82
+ [ssl_certificates('www.geocerts.com'),
83
+ ssl_certificates('GeoTrust Extended Validation SSL CA')].uniq.should ==
84
+ [ssl_certificates('www.geocerts.com'),
85
+ ssl_certificates('GeoTrust Extended Validation SSL CA')]
86
+ end
87
+ end
88
+
89
+ context 'when a subject key identifier is provided' do
90
+
91
+ subject { ssl_certificates('GeoTrust Extended Validation SSL CA').extend(OpenSSLExtensions::X509::Certificate) }
92
+
93
+ its(:subject_key_identifier) { should == '28:C4:EB:8F:F1:5F:79:90:A3:2B:55:C3:56:4E:7D:6B:53:72:2C:18' }
94
+ end
95
+
96
+ context 'root?' do
97
+ it 'is false for a certificate with a separate issuer' do
98
+ extended_ssl_certificates('www.geocerts.com').should_not be_root
99
+ end
100
+
101
+ it 'is true for a certificate which is its own issuer' do
102
+ extended_ssl_certificates('equifax-secure-ca').should be_root
103
+ end
104
+
105
+ it 'is true for a certificate with a matching subject and issuer, subject identifier given, but no authority identifier provided' do
106
+ extended_ssl_certificates('globalsign-root-ca').should be_root
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe OpenSSLExtensions::X509::Name do
4
+ subject { ssl_certificates('www.geocerts.com').subject.extend(OpenSSLExtensions::X509::Name) }
5
+
6
+ its(:organization) { should == 'GeoCerts Inc' }
7
+ its(:organizational_unit) { should == 'SSL Sales' }
8
+ its(:common_name) { should == 'www.geocerts.com' }
9
+ its(:country) { should == 'US' }
10
+ its(:locality) { should == 'Atlanta' }
11
+ its(:state) { should == 'Georgia' }
12
+ its(:region) { should == 'Georgia' }
13
+
14
+ context 'with an email address' do
15
+ subject { certificate_request('envylabs').subject.extend(OpenSSLExtensions::X509::Name) }
16
+ its(:email) { should == 'support@envylabs.com' }
17
+ end
18
+
19
+ its(:location) { should == 'Atlanta, Georgia, US' }
20
+ end
@@ -0,0 +1,77 @@
1
+ require 'spec_helper'
2
+
3
+ describe OpenSSLExtensions::X509::Request do
4
+ subject { extended_certificate_request('geocerts') }
5
+
6
+ context 'subject_alternative_names' do
7
+ context 'on a CSR with SANs' do
8
+ subject { extended_certificate_request('sans') }
9
+ it 'returns a collection of the alternative names' do
10
+ subject.subject_alternative_names.should ==
11
+ ['mail.sipchem.local',
12
+ 'mail.sipchem.com',
13
+ 'sipchem.com',
14
+ 'autodiscover.sipchem.local',
15
+ 'autodiscover.sipchem.com',
16
+ 'sipc-cas01',
17
+ 'sipc-cas02',
18
+ 'sipchem.local' ]
19
+ end
20
+ end
21
+
22
+ context 'on a CSR without SANs' do
23
+ it 'returns an empty collection' do
24
+ subject.subject_alternative_names.should == []
25
+ end
26
+ end
27
+ end
28
+
29
+ context 'challenge_password?' do
30
+ context 'on a CSR with a challenge password' do
31
+ subject { extended_certificate_request('challenge') }
32
+ its(:challenge_password?) { should be_true }
33
+ end
34
+
35
+ context 'on a CSR without a challenge password' do
36
+ its(:challenge_password?) { should be_false }
37
+ end
38
+ end
39
+
40
+ context 'strength' do
41
+ it 'is 2048 bits' do
42
+ subject.strength.should == 2048
43
+ end
44
+
45
+ it 'is 1024 bits' do
46
+ extended_certificate_request('1024').strength.should == 1024
47
+ end
48
+ end
49
+
50
+ context 'equality (==)' do
51
+ it 'is true with matching PEMs' do
52
+ extended_certificate_request('geocerts').should ==
53
+ extended_certificate_request('geocerts')
54
+ end
55
+
56
+ it 'is false with mismatched PEMs' do
57
+ certificate = extended_certificate_request('geocerts')
58
+ certificate.should_receive(:to_pem).and_return('DIFFERENTPEM')
59
+ extended_certificate_request('geocerts').should_not == certificate
60
+ end
61
+ end
62
+
63
+ context 'in a collection, uniq' do
64
+ it 'removes duplicate certificates' do
65
+ [extended_certificate_request('geocerts'),
66
+ extended_certificate_request('geocerts')].uniq.should ==
67
+ [extended_certificate_request('geocerts')]
68
+ end
69
+
70
+ it 'does not modify non-duplicates' do
71
+ [extended_certificate_request('geocerts'),
72
+ extended_certificate_request('1024')].uniq.should ==
73
+ [extended_certificate_request('geocerts'),
74
+ extended_certificate_request('1024')]
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ describe OpenSSLExtensions do
4
+ context 'check_dependencies!' do
5
+ context 'with OpenSSL extensions installed' do
6
+ before(:each) do
7
+ OpenSSLExtensions.should_receive(:require).with('openssl').and_return(true)
8
+ end
9
+
10
+ it 'does not exit' do
11
+ OpenSSLExtensions.should_receive(:exit).never
12
+ OpenSSLExtensions.check_dependencies!
13
+ end
14
+
15
+ it 'does not write to STDERR' do
16
+ $stderr.should_receive(:puts).never
17
+ OpenSSLExtensions.check_dependencies!
18
+ end
19
+ end
20
+
21
+ context 'without OpenSSL extensions installed' do
22
+ before(:each) do
23
+ OpenSSLExtensions.should_receive(:require).with('openssl').and_raise(LoadError)
24
+
25
+ $stderr.stub!(:puts)
26
+ OpenSSLExtensions.stub!(:exit)
27
+ end
28
+
29
+ it 'write a message on STDERR' do
30
+ $stderr.should_receive(:puts).with("OpenSSLExtensions requires Ruby to be compiled with OpenSSL support.")
31
+ OpenSSLExtensions.check_dependencies!
32
+ end
33
+
34
+ it 'exits with error' do
35
+ OpenSSLExtensions.should_receive(:exit).with(1)
36
+ OpenSSLExtensions.check_dependencies!
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,22 @@
1
+ # encoding: utf-8
2
+ lib = File.expand_path('../../lib', __FILE__)
3
+ $:.unshift lib unless $:.include?(lib)
4
+
5
+ begin
6
+ require 'openssl'
7
+ rescue LoadError
8
+ $stderr.puts "OpenSSLExtensions requires Ruby to be compiled with OpenSSL support"
9
+ exit(1)
10
+ end
11
+
12
+ require 'rubygems'
13
+ require 'bundler'
14
+
15
+ Bundler.setup
16
+ Bundler.require :default, :test
17
+
18
+ require 'openssl-extensions/all'
19
+
20
+ Dir.glob(File.join(File.dirname(__FILE__), 'support/**/*.rb')).each do |f|
21
+ require f
22
+ end
@@ -0,0 +1,29 @@
1
+ module CertificateRequestFixtures
2
+
3
+ ##
4
+ # Returns an OpenSSL::X509::Request without explicit extensions.
5
+ #
6
+ def certificate_request(name)
7
+ name = name.to_s.downcase.gsub(/[^\w\.]/, '-')
8
+ @_certificate_requests ||= {}
9
+ return @_certificate_requests[name].dup if @_certificate_requests.has_key?(name)
10
+
11
+ request_path = File.expand_path("../../fixtures/certificate_requests/#{name}.csr", __FILE__)
12
+ @_certificate_requests[name] = File.exist?(request_path) ?
13
+ OpenSSL::X509::Request.new(File.read(request_path)) :
14
+ nil
15
+ end
16
+
17
+ ##
18
+ # Returns an OpenSSL::X509::Request explicitly extended with OpenSSLExtensions::X509::Request.
19
+ #
20
+ def extended_certificate_request(name)
21
+ certificate_request(name).extend(OpenSSLExtensions::X509::Request)
22
+ end
23
+
24
+ end
25
+
26
+ RSpec.configure do |config|
27
+ config.include CertificateRequestFixtures
28
+ end
29
+
@@ -0,0 +1,28 @@
1
+ module SslCertificateFixtures
2
+
3
+ ##
4
+ # Returns an OpenSSL::X509::Certificate without explicit extensions.
5
+ #
6
+ def ssl_certificates(name)
7
+ name = name.to_s.downcase.gsub(/[^\w\.]/, '-')
8
+ @_ssl_certificates ||= {}
9
+ return @_ssl_certificates[name].dup if @_ssl_certificates.has_key?(name)
10
+
11
+ certificate_path = File.expand_path("../../fixtures/certificates/#{name}.pem", __FILE__)
12
+ @_ssl_certificates[name] = File.exist?(certificate_path) ?
13
+ OpenSSL::X509::Certificate.new(File.read(certificate_path)) :
14
+ nil
15
+ end
16
+
17
+ ##
18
+ # Returns an OpenSSL::X509::Certificate explicitly extended with OpenSSLExtensions::X509::Certificate.
19
+ #
20
+ def extended_ssl_certificates(name)
21
+ ssl_certificates(name).extend(OpenSSLExtensions::X509::Certificate)
22
+ end
23
+
24
+ end
25
+
26
+ RSpec.configure do |config|
27
+ config.include SslCertificateFixtures
28
+ end
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openssl-extensions
3
3
  version: !ruby/object:Gem::Version
4
- hash: 13
5
4
  prerelease: false
6
5
  segments:
6
+ - 1
7
7
  - 0
8
8
  - 0
9
- - 9
10
- version: 0.0.9
9
+ version: 1.0.0
11
10
  platform: ruby
12
11
  authors:
13
12
  - Nathaniel Bibler
@@ -15,7 +14,7 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2010-12-07 00:00:00 -05:00
17
+ date: 2011-01-07 00:00:00 -05:00
19
18
  default_executable:
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
@@ -24,14 +23,13 @@ dependencies:
24
23
  requirement: &id001 !ruby/object:Gem::Requirement
25
24
  none: false
26
25
  requirements:
27
- - - ">="
26
+ - - ~>
28
27
  - !ruby/object:Gem::Version
29
- hash: 11
30
28
  segments:
31
29
  - 2
32
- - 1
30
+ - 4
33
31
  - 0
34
- version: 2.1.0
32
+ version: 2.4.0
35
33
  type: :development
36
34
  version_requirements: *id001
37
35
  - !ruby/object:Gem::Dependency
@@ -40,9 +38,8 @@ dependencies:
40
38
  requirement: &id002 !ruby/object:Gem::Requirement
41
39
  none: false
42
40
  requirements:
43
- - - ">="
41
+ - - ~>
44
42
  - !ruby/object:Gem::Version
45
- hash: 29
46
43
  segments:
47
44
  - 0
48
45
  - 0
@@ -71,6 +68,41 @@ files:
71
68
  - lib/openssl-extensions/x509/request.rb
72
69
  - lib/openssl-extensions/x509.rb
73
70
  - lib/openssl-extensions.rb
71
+ - CHANGELOG.md
72
+ - LICENSE
73
+ - README.md
74
+ - spec/fixtures/certificate_requests/1024.csr
75
+ - spec/fixtures/certificate_requests/challenge.csr
76
+ - spec/fixtures/certificate_requests/envylabs.csr
77
+ - spec/fixtures/certificate_requests/geocerts.csr
78
+ - spec/fixtures/certificate_requests/geocerts.key
79
+ - spec/fixtures/certificate_requests/geocerts_1024.key
80
+ - spec/fixtures/certificate_requests/sans.csr
81
+ - spec/fixtures/certificates/app1.hongkongpost.com.pem
82
+ - spec/fixtures/certificates/equifax-secure-ca.pem
83
+ - spec/fixtures/certificates/geotrust-extended-validation-ssl-ca.pem
84
+ - spec/fixtures/certificates/geotrust-primary-certification-authority.pem
85
+ - spec/fixtures/certificates/globalsign-root-ca.pem
86
+ - spec/fixtures/certificates/hongkong-post-e-cert-ca-1.pem
87
+ - spec/fixtures/certificates/hongkong-post-e-cert-ca.pem
88
+ - spec/fixtures/certificates/hongkong-post-root-ca-1.pem
89
+ - spec/fixtures/certificates/hongkong-post-root-ca.pem
90
+ - spec/fixtures/certificates/www.geocerts.com.pem
91
+ - spec/fixtures/certificates/www.twongo.com.pem
92
+ - spec/integration/openssl/ssl/ssl_socket_spec.rb
93
+ - spec/integration/openssl/x509/certificate_spec.rb
94
+ - spec/integration/openssl/x509/name_spec.rb
95
+ - spec/integration/openssl/x509/request_spec.rb
96
+ - spec/models/openssl-extensions/ssl/ssl_socket_spec.rb
97
+ - spec/models/openssl-extensions/x509/authority_key_identifier_spec.rb
98
+ - spec/models/openssl-extensions/x509/certificate_chain_spec.rb
99
+ - spec/models/openssl-extensions/x509/certificate_spec.rb
100
+ - spec/models/openssl-extensions/x509/name_spec.rb
101
+ - spec/models/openssl-extensions/x509/request_spec.rb
102
+ - spec/models/openssl-extensions_spec.rb
103
+ - spec/spec_helper.rb
104
+ - spec/support/certificate_request_fixtures.rb
105
+ - spec/support/ssl_certificate_fixtures.rb
74
106
  has_rdoc: true
75
107
  homepage: http://github.com/envylabs/openssl-extensions
76
108
  licenses: []
@@ -85,7 +117,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
85
117
  requirements:
86
118
  - - ">="
87
119
  - !ruby/object:Gem::Version
88
- hash: 3
89
120
  segments:
90
121
  - 0
91
122
  version: "0"
@@ -94,7 +125,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
94
125
  requirements:
95
126
  - - ">="
96
127
  - !ruby/object:Gem::Version
97
- hash: 23
98
128
  segments:
99
129
  - 1
100
130
  - 3
@@ -107,5 +137,36 @@ rubygems_version: 1.3.7
107
137
  signing_key:
108
138
  specification_version: 3
109
139
  summary: Helper methods and extensions for OpenSSL to make the interface more intuitive.
110
- test_files: []
111
-
140
+ test_files:
141
+ - spec/fixtures/certificate_requests/1024.csr
142
+ - spec/fixtures/certificate_requests/challenge.csr
143
+ - spec/fixtures/certificate_requests/envylabs.csr
144
+ - spec/fixtures/certificate_requests/geocerts.csr
145
+ - spec/fixtures/certificate_requests/geocerts.key
146
+ - spec/fixtures/certificate_requests/geocerts_1024.key
147
+ - spec/fixtures/certificate_requests/sans.csr
148
+ - spec/fixtures/certificates/app1.hongkongpost.com.pem
149
+ - spec/fixtures/certificates/equifax-secure-ca.pem
150
+ - spec/fixtures/certificates/geotrust-extended-validation-ssl-ca.pem
151
+ - spec/fixtures/certificates/geotrust-primary-certification-authority.pem
152
+ - spec/fixtures/certificates/globalsign-root-ca.pem
153
+ - spec/fixtures/certificates/hongkong-post-e-cert-ca-1.pem
154
+ - spec/fixtures/certificates/hongkong-post-e-cert-ca.pem
155
+ - spec/fixtures/certificates/hongkong-post-root-ca-1.pem
156
+ - spec/fixtures/certificates/hongkong-post-root-ca.pem
157
+ - spec/fixtures/certificates/www.geocerts.com.pem
158
+ - spec/fixtures/certificates/www.twongo.com.pem
159
+ - spec/integration/openssl/ssl/ssl_socket_spec.rb
160
+ - spec/integration/openssl/x509/certificate_spec.rb
161
+ - spec/integration/openssl/x509/name_spec.rb
162
+ - spec/integration/openssl/x509/request_spec.rb
163
+ - spec/models/openssl-extensions/ssl/ssl_socket_spec.rb
164
+ - spec/models/openssl-extensions/x509/authority_key_identifier_spec.rb
165
+ - spec/models/openssl-extensions/x509/certificate_chain_spec.rb
166
+ - spec/models/openssl-extensions/x509/certificate_spec.rb
167
+ - spec/models/openssl-extensions/x509/name_spec.rb
168
+ - spec/models/openssl-extensions/x509/request_spec.rb
169
+ - spec/models/openssl-extensions_spec.rb
170
+ - spec/spec_helper.rb
171
+ - spec/support/certificate_request_fixtures.rb
172
+ - spec/support/ssl_certificate_fixtures.rb