openssl-extensions 0.0.9 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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