r509 0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (162) hide show
  1. data/README.md +447 -0
  2. data/Rakefile +38 -0
  3. data/bin/r509 +96 -0
  4. data/bin/r509-parse +35 -0
  5. data/doc/R509.html +154 -0
  6. data/doc/R509/Cert.html +3954 -0
  7. data/doc/R509/Cert/Extensions.html +360 -0
  8. data/doc/R509/Cert/Extensions/AuthorityInfoAccess.html +391 -0
  9. data/doc/R509/Cert/Extensions/AuthorityKeyIdentifier.html +148 -0
  10. data/doc/R509/Cert/Extensions/BasicConstraints.html +482 -0
  11. data/doc/R509/Cert/Extensions/CrlDistributionPoints.html +316 -0
  12. data/doc/R509/Cert/Extensions/ExtendedKeyUsage.html +780 -0
  13. data/doc/R509/Cert/Extensions/KeyUsage.html +1230 -0
  14. data/doc/R509/Cert/Extensions/SubjectAlternativeName.html +467 -0
  15. data/doc/R509/Cert/Extensions/SubjectKeyIdentifier.html +216 -0
  16. data/doc/R509/CertificateAuthority.html +126 -0
  17. data/doc/R509/CertificateAuthority/Signer.html +855 -0
  18. data/doc/R509/Config.html +127 -0
  19. data/doc/R509/Config/CaConfig.html +2144 -0
  20. data/doc/R509/Config/CaConfigPool.html +599 -0
  21. data/doc/R509/Config/CaProfile.html +656 -0
  22. data/doc/R509/Config/SubjectItemPolicy.html +578 -0
  23. data/doc/R509/Crl.html +126 -0
  24. data/doc/R509/Crl/Administrator.html +2077 -0
  25. data/doc/R509/Crl/Parser.html +1224 -0
  26. data/doc/R509/Csr.html +2248 -0
  27. data/doc/R509/IOHelpers.html +564 -0
  28. data/doc/R509/MessageDigest.html +396 -0
  29. data/doc/R509/NameSanitizer.html +319 -0
  30. data/doc/R509/Ocsp.html +128 -0
  31. data/doc/R509/Ocsp/Request.html +126 -0
  32. data/doc/R509/Ocsp/Request/Nonce.html +160 -0
  33. data/doc/R509/Ocsp/Response.html +837 -0
  34. data/doc/R509/OidMapper.html +393 -0
  35. data/doc/R509/PrivateKey.html +1647 -0
  36. data/doc/R509/R509Error.html +134 -0
  37. data/doc/R509/Spki.html +1424 -0
  38. data/doc/R509/Subject.html +836 -0
  39. data/doc/R509/Validity.html +160 -0
  40. data/doc/R509/Validity/Checker.html +320 -0
  41. data/doc/R509/Validity/DefaultChecker.html +283 -0
  42. data/doc/R509/Validity/DefaultWriter.html +330 -0
  43. data/doc/R509/Validity/Status.html +561 -0
  44. data/doc/R509/Validity/Writer.html +394 -0
  45. data/doc/_index.html +501 -0
  46. data/doc/class_list.html +53 -0
  47. data/doc/css/common.css +1 -0
  48. data/doc/css/full_list.css +57 -0
  49. data/doc/css/style.css +328 -0
  50. data/doc/file.README.html +534 -0
  51. data/doc/file.r509.html +149 -0
  52. data/doc/file_list.html +58 -0
  53. data/doc/frames.html +28 -0
  54. data/doc/index.html +534 -0
  55. data/doc/js/app.js +208 -0
  56. data/doc/js/full_list.js +173 -0
  57. data/doc/js/jquery.js +4 -0
  58. data/doc/methods_list.html +1932 -0
  59. data/doc/top-level-namespace.html +112 -0
  60. data/lib/r509.rb +22 -0
  61. data/lib/r509/cert.rb +414 -0
  62. data/lib/r509/cert/extensions.rb +309 -0
  63. data/lib/r509/certificateauthority.rb +290 -0
  64. data/lib/r509/config.rb +407 -0
  65. data/lib/r509/crl.rb +379 -0
  66. data/lib/r509/csr.rb +324 -0
  67. data/lib/r509/exceptions.rb +5 -0
  68. data/lib/r509/io_helpers.rb +52 -0
  69. data/lib/r509/messagedigest.rb +49 -0
  70. data/lib/r509/ocsp.rb +85 -0
  71. data/lib/r509/oidmapper.rb +32 -0
  72. data/lib/r509/privatekey.rb +185 -0
  73. data/lib/r509/spki.rb +112 -0
  74. data/lib/r509/subject.rb +133 -0
  75. data/lib/r509/validity.rb +92 -0
  76. data/lib/r509/version.rb +4 -0
  77. data/r509.yaml +73 -0
  78. data/spec/cert/extensions_spec.rb +632 -0
  79. data/spec/cert_spec.rb +321 -0
  80. data/spec/certificate_authority_spec.rb +260 -0
  81. data/spec/config_spec.rb +349 -0
  82. data/spec/crl_spec.rb +215 -0
  83. data/spec/csr_spec.rb +302 -0
  84. data/spec/fixtures.rb +233 -0
  85. data/spec/fixtures/cert1.der +0 -0
  86. data/spec/fixtures/cert1.pem +24 -0
  87. data/spec/fixtures/cert1_public_key_modulus.txt +1 -0
  88. data/spec/fixtures/cert3.p12 +0 -0
  89. data/spec/fixtures/cert3.pem +28 -0
  90. data/spec/fixtures/cert3_key.pem +27 -0
  91. data/spec/fixtures/cert3_key_des3.pem +30 -0
  92. data/spec/fixtures/cert4.pem +14 -0
  93. data/spec/fixtures/cert5.pem +30 -0
  94. data/spec/fixtures/cert6.pem +26 -0
  95. data/spec/fixtures/cert_expired.pem +26 -0
  96. data/spec/fixtures/cert_not_yet_valid.pem +26 -0
  97. data/spec/fixtures/cert_san.pem +27 -0
  98. data/spec/fixtures/cert_san2.pem +22 -0
  99. data/spec/fixtures/config_pool_test_minimal.yaml +15 -0
  100. data/spec/fixtures/config_test.yaml +41 -0
  101. data/spec/fixtures/config_test_engine_key.yaml +7 -0
  102. data/spec/fixtures/config_test_engine_no_key_name.yaml +6 -0
  103. data/spec/fixtures/config_test_minimal.yaml +7 -0
  104. data/spec/fixtures/config_test_password.yaml +7 -0
  105. data/spec/fixtures/config_test_various.yaml +100 -0
  106. data/spec/fixtures/crl_list_file.txt +1 -0
  107. data/spec/fixtures/crl_with_reason.pem +17 -0
  108. data/spec/fixtures/csr1.der +0 -0
  109. data/spec/fixtures/csr1.pem +17 -0
  110. data/spec/fixtures/csr1_key.der +0 -0
  111. data/spec/fixtures/csr1_key.pem +27 -0
  112. data/spec/fixtures/csr1_key_encrypted_des3.pem +30 -0
  113. data/spec/fixtures/csr1_newlines.pem +32 -0
  114. data/spec/fixtures/csr1_no_begin_end.pem +15 -0
  115. data/spec/fixtures/csr1_public_key_modulus.txt +1 -0
  116. data/spec/fixtures/csr2.pem +15 -0
  117. data/spec/fixtures/csr2_key.pem +27 -0
  118. data/spec/fixtures/csr3.pem +16 -0
  119. data/spec/fixtures/csr4.pem +25 -0
  120. data/spec/fixtures/csr_dsa.pem +15 -0
  121. data/spec/fixtures/csr_invalid_signature.pem +13 -0
  122. data/spec/fixtures/dsa_key.pem +20 -0
  123. data/spec/fixtures/key4.pem +27 -0
  124. data/spec/fixtures/key4_encrypted_des3.pem +30 -0
  125. data/spec/fixtures/missing_key_identifier_ca.cer +21 -0
  126. data/spec/fixtures/missing_key_identifier_ca.key +27 -0
  127. data/spec/fixtures/ocsptest.r509.local.pem +27 -0
  128. data/spec/fixtures/ocsptest.r509.local_ocsp_request.der +0 -0
  129. data/spec/fixtures/ocsptest2.r509.local.pem +27 -0
  130. data/spec/fixtures/second_ca.cer +26 -0
  131. data/spec/fixtures/second_ca.key +27 -0
  132. data/spec/fixtures/spkac.der +0 -0
  133. data/spec/fixtures/spkac.txt +1 -0
  134. data/spec/fixtures/spkac_dsa.txt +1 -0
  135. data/spec/fixtures/stca.pem +22 -0
  136. data/spec/fixtures/stca_ocsp_request.der +0 -0
  137. data/spec/fixtures/stca_ocsp_response.der +0 -0
  138. data/spec/fixtures/test1.csr +17 -0
  139. data/spec/fixtures/test_ca.cer +22 -0
  140. data/spec/fixtures/test_ca.key +28 -0
  141. data/spec/fixtures/test_ca.p12 +0 -0
  142. data/spec/fixtures/test_ca_des3.key +30 -0
  143. data/spec/fixtures/test_ca_ocsp.cer +26 -0
  144. data/spec/fixtures/test_ca_ocsp.key +27 -0
  145. data/spec/fixtures/test_ca_ocsp.p12 +0 -0
  146. data/spec/fixtures/test_ca_ocsp_chain.txt +48 -0
  147. data/spec/fixtures/test_ca_ocsp_response.der +0 -0
  148. data/spec/fixtures/test_ca_subroot.cer +26 -0
  149. data/spec/fixtures/test_ca_subroot.key +27 -0
  150. data/spec/fixtures/test_ca_subroot_ocsp.cer +25 -0
  151. data/spec/fixtures/test_ca_subroot_ocsp.key +27 -0
  152. data/spec/fixtures/test_ca_subroot_ocsp_response.der +0 -0
  153. data/spec/fixtures/unknown_oid.csr +17 -0
  154. data/spec/message_digest_spec.rb +89 -0
  155. data/spec/ocsp_spec.rb +111 -0
  156. data/spec/oid_mapper_spec.rb +31 -0
  157. data/spec/privatekey_spec.rb +198 -0
  158. data/spec/spec_helper.rb +14 -0
  159. data/spec/spki_spec.rb +157 -0
  160. data/spec/subject_spec.rb +203 -0
  161. data/spec/validity_spec.rb +98 -0
  162. metadata +257 -0
@@ -0,0 +1,53 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html>
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
+
7
+ <link rel="stylesheet" href="css/full_list.css" type="text/css" media="screen" charset="utf-8" />
8
+
9
+ <link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
10
+
11
+
12
+
13
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
14
+
15
+ <script type="text/javascript" charset="utf-8" src="js/full_list.js"></script>
16
+
17
+
18
+ <base id="base_target" target="_parent" />
19
+ </head>
20
+ <body>
21
+ <script type="text/javascript" charset="utf-8">
22
+ if (window.top.frames.main) {
23
+ document.getElementById('base_target').target = 'main';
24
+ document.body.className = 'frames';
25
+ }
26
+ </script>
27
+ <div id="content">
28
+ <h1 id="full_list_header">Class List</h1>
29
+ <div id="nav">
30
+
31
+ <span><a target="_self" href="class_list.html">
32
+ Classes
33
+ </a></span>
34
+
35
+ <span><a target="_self" href="method_list.html">
36
+ Methods
37
+ </a></span>
38
+
39
+ <span><a target="_self" href="file_list.html">
40
+ Files
41
+ </a></span>
42
+
43
+ </div>
44
+ <div id="search">Search: <input type="text" /></div>
45
+
46
+ <ul id="full_list" class="class">
47
+ <li><span class='object_link'><a href="top-level-namespace.html" title=" (root)">Top Level Namespace</a></span></li>
48
+ <li><a class='toggle'></a> <span class='object_link'><a href="R509.html" title="R509 (module)">R509</a></span><small class='search_info'>Top Level Namespace</small></li><ul><li><a class='toggle'></a> <span class='object_link'><a href="R509/Cert.html" title="R509::Cert (class)">Cert</a></span> &lt; Object<small class='search_info'>R509</small></li><ul><li><a class='toggle'></a> <span class='object_link'><a href="R509/Cert/Extensions.html" title="R509::Cert::Extensions (module)">Extensions</a></span><small class='search_info'>R509::Cert</small></li><ul><li><span class='object_link'><a href="R509/Cert/Extensions/AuthorityInfoAccess.html" title="R509::Cert::Extensions::AuthorityInfoAccess (class)">AuthorityInfoAccess</a></span> &lt; Extension<small class='search_info'>R509::Cert::Extensions</small></li><li><span class='object_link'><a href="R509/Cert/Extensions/AuthorityKeyIdentifier.html" title="R509::Cert::Extensions::AuthorityKeyIdentifier (class)">AuthorityKeyIdentifier</a></span> &lt; Extension<small class='search_info'>R509::Cert::Extensions</small></li><li><span class='object_link'><a href="R509/Cert/Extensions/BasicConstraints.html" title="R509::Cert::Extensions::BasicConstraints (class)">BasicConstraints</a></span> &lt; Extension<small class='search_info'>R509::Cert::Extensions</small></li><li><span class='object_link'><a href="R509/Cert/Extensions/CrlDistributionPoints.html" title="R509::Cert::Extensions::CrlDistributionPoints (class)">CrlDistributionPoints</a></span> &lt; Extension<small class='search_info'>R509::Cert::Extensions</small></li><li><span class='object_link'><a href="R509/Cert/Extensions/ExtendedKeyUsage.html" title="R509::Cert::Extensions::ExtendedKeyUsage (class)">ExtendedKeyUsage</a></span> &lt; Extension<small class='search_info'>R509::Cert::Extensions</small></li><li><span class='object_link'><a href="R509/Cert/Extensions/KeyUsage.html" title="R509::Cert::Extensions::KeyUsage (class)">KeyUsage</a></span> &lt; Extension<small class='search_info'>R509::Cert::Extensions</small></li><li><span class='object_link'><a href="R509/Cert/Extensions/SubjectAlternativeName.html" title="R509::Cert::Extensions::SubjectAlternativeName (class)">SubjectAlternativeName</a></span> &lt; Extension<small class='search_info'>R509::Cert::Extensions</small></li><li><span class='object_link'><a href="R509/Cert/Extensions/SubjectKeyIdentifier.html" title="R509::Cert::Extensions::SubjectKeyIdentifier (class)">SubjectKeyIdentifier</a></span> &lt; Extension<small class='search_info'>R509::Cert::Extensions</small></li></ul></ul><li><a class='toggle'></a> <span class='object_link'><a href="R509/CertificateAuthority.html" title="R509::CertificateAuthority (module)">CertificateAuthority</a></span><small class='search_info'>R509</small></li><ul><li><span class='object_link'><a href="R509/CertificateAuthority/Signer.html" title="R509::CertificateAuthority::Signer (class)">Signer</a></span> &lt; Object<small class='search_info'>R509::CertificateAuthority</small></li></ul><li><a class='toggle'></a> <span class='object_link'><a href="R509/Config.html" title="R509::Config (module)">Config</a></span><small class='search_info'>R509</small></li><ul><li><span class='object_link'><a href="R509/Config/CaConfig.html" title="R509::Config::CaConfig (class)">CaConfig</a></span> &lt; Object<small class='search_info'>R509::Config</small></li><li><span class='object_link'><a href="R509/Config/CaConfigPool.html" title="R509::Config::CaConfigPool (class)">CaConfigPool</a></span> &lt; Object<small class='search_info'>R509::Config</small></li><li><span class='object_link'><a href="R509/Config/CaProfile.html" title="R509::Config::CaProfile (class)">CaProfile</a></span> &lt; Object<small class='search_info'>R509::Config</small></li><li><span class='object_link'><a href="R509/Config/SubjectItemPolicy.html" title="R509::Config::SubjectItemPolicy (class)">SubjectItemPolicy</a></span> &lt; Object<small class='search_info'>R509::Config</small></li></ul><li><a class='toggle'></a> <span class='object_link'><a href="R509/Crl.html" title="R509::Crl (module)">Crl</a></span><small class='search_info'>R509</small></li><ul><li><span class='object_link'><a href="R509/Crl/Administrator.html" title="R509::Crl::Administrator (class)">Administrator</a></span> &lt; Object<small class='search_info'>R509::Crl</small></li><li><span class='object_link'><a href="R509/Crl/Parser.html" title="R509::Crl::Parser (class)">Parser</a></span> &lt; Object<small class='search_info'>R509::Crl</small></li></ul><li><span class='object_link'><a href="R509/Csr.html" title="R509::Csr (class)">Csr</a></span> &lt; Object<small class='search_info'>R509</small></li><li><span class='object_link'><a href="R509/IOHelpers.html" title="R509::IOHelpers (module)">IOHelpers</a></span><small class='search_info'>R509</small></li><li><span class='object_link'><a href="R509/MessageDigest.html" title="R509::MessageDigest (class)">MessageDigest</a></span> &lt; Object<small class='search_info'>R509</small></li><li><span class='object_link'><a href="R509/NameSanitizer.html" title="R509::NameSanitizer (class)">NameSanitizer</a></span> &lt; Object<small class='search_info'>R509</small></li><li><a class='toggle'></a> <span class='object_link'><a href="R509/Ocsp.html" title="R509::Ocsp (module)">Ocsp</a></span><small class='search_info'>R509</small></li><ul><li><a class='toggle'></a> <span class='object_link'><a href="R509/Ocsp/Request.html" title="R509::Ocsp::Request (module)">Request</a></span><small class='search_info'>R509::Ocsp</small></li><ul><li><span class='object_link'><a href="R509/Ocsp/Request/Nonce.html" title="R509::Ocsp::Request::Nonce (module)">Nonce</a></span><small class='search_info'>R509::Ocsp::Request</small></li></ul><li><span class='object_link'><a href="R509/Ocsp/Response.html" title="R509::Ocsp::Response (class)">Response</a></span> &lt; Object<small class='search_info'>R509::Ocsp</small></li></ul><li><span class='object_link'><a href="R509/OidMapper.html" title="R509::OidMapper (class)">OidMapper</a></span> &lt; Object<small class='search_info'>R509</small></li><li><span class='object_link'><a href="R509/PrivateKey.html" title="R509::PrivateKey (class)">PrivateKey</a></span> &lt; Object<small class='search_info'>R509</small></li><li><span class='object_link'><a href="R509/R509Error.html" title="R509::R509Error (class)">R509Error</a></span> &lt; StandardError<small class='search_info'>R509</small></li><li><span class='object_link'><a href="R509/Spki.html" title="R509::Spki (class)">Spki</a></span> &lt; Object<small class='search_info'>R509</small></li><li><span class='object_link'><a href="R509/Subject.html" title="R509::Subject (class)">Subject</a></span> &lt; Object<small class='search_info'>R509</small></li><li><a class='toggle'></a> <span class='object_link'><a href="R509/Validity.html" title="R509::Validity (module)">Validity</a></span><small class='search_info'>R509</small></li><ul><li><span class='object_link'><a href="R509/Validity/Checker.html" title="R509::Validity::Checker (class)">Checker</a></span> &lt; Object<small class='search_info'>R509::Validity</small></li><li><span class='object_link'><a href="R509/Validity/DefaultChecker.html" title="R509::Validity::DefaultChecker (class)">DefaultChecker</a></span> &lt; Checker<small class='search_info'>R509::Validity</small></li><li><span class='object_link'><a href="R509/Validity/DefaultWriter.html" title="R509::Validity::DefaultWriter (class)">DefaultWriter</a></span> &lt; Writer<small class='search_info'>R509::Validity</small></li><li><span class='object_link'><a href="R509/Validity/Status.html" title="R509::Validity::Status (class)">Status</a></span> &lt; Object<small class='search_info'>R509::Validity</small></li><li><span class='object_link'><a href="R509/Validity/Writer.html" title="R509::Validity::Writer (class)">Writer</a></span> &lt; Object<small class='search_info'>R509::Validity</small></li></ul></ul>
49
+
50
+ </ul>
51
+ </div>
52
+ </body>
53
+ </html>
@@ -0,0 +1 @@
1
+ /* Override this file with custom rules */
@@ -0,0 +1,57 @@
1
+ body {
2
+ margin: 0;
3
+ font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif;
4
+ font-size: 13px;
5
+ height: 101%;
6
+ overflow-x: hidden;
7
+ }
8
+
9
+ h1 { padding: 12px 10px; padding-bottom: 0; margin: 0; font-size: 1.4em; }
10
+ .clear { clear: both; }
11
+ #search { position: absolute; right: 5px; top: 9px; padding-left: 24px; }
12
+ #content.insearch #search, #content.insearch #noresults { background: url(data:image/gif;base64,R0lGODlhEAAQAPYAAP///wAAAPr6+pKSkoiIiO7u7sjIyNjY2J6engAAAI6OjsbGxjIyMlJSUuzs7KamppSUlPLy8oKCghwcHLKysqSkpJqamvT09Pj4+KioqM7OzkRERAwMDGBgYN7e3ujo6Ly8vCoqKjY2NkZGRtTU1MTExDw8PE5OTj4+PkhISNDQ0MrKylpaWrS0tOrq6nBwcKysrLi4uLq6ul5eXlxcXGJiYoaGhuDg4H5+fvz8/KKiohgYGCwsLFZWVgQEBFBQUMzMzDg4OFhYWBoaGvDw8NbW1pycnOLi4ubm5kBAQKqqqiQkJCAgIK6urnJyckpKSjQ0NGpqatLS0sDAwCYmJnx8fEJCQlRUVAoKCggICLCwsOTk5ExMTPb29ra2tmZmZmhoaNzc3KCgoBISEiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCAAAACwAAAAAEAAQAAAHaIAAgoMgIiYlg4kACxIaACEJCSiKggYMCRselwkpghGJBJEcFgsjJyoAGBmfggcNEx0flBiKDhQFlIoCCA+5lAORFb4AJIihCRbDxQAFChAXw9HSqb60iREZ1omqrIPdJCTe0SWI09GBACH5BAkIAAAALAAAAAAQABAAAAdrgACCgwc0NTeDiYozCQkvOTo9GTmDKy8aFy+NOBA7CTswgywJDTIuEjYFIY0JNYMtKTEFiRU8Pjwygy4ws4owPyCKwsMAJSTEgiQlgsbIAMrO0dKDGMTViREZ14kYGRGK38nHguHEJcvTyIEAIfkECQgAAAAsAAAAABAAEAAAB2iAAIKDAggPg4iJAAMJCRUAJRIqiRGCBI0WQEEJJkWDERkYAAUKEBc4Po1GiKKJHkJDNEeKig4URLS0ICImJZAkuQAhjSi/wQyNKcGDCyMnk8u5rYrTgqDVghgZlYjcACTA1sslvtHRgQAh+QQJCAAAACwAAAAAEAAQAAAHZ4AAgoOEhYaCJSWHgxGDJCQARAtOUoQRGRiFD0kJUYWZhUhKT1OLhR8wBaaFBzQ1NwAlkIszCQkvsbOHL7Y4q4IuEjaqq0ZQD5+GEEsJTDCMmIUhtgk1lo6QFUwJVDKLiYJNUd6/hoEAIfkECQgAAAAsAAAAABAAEAAAB2iAAIKDhIWGgiUlh4MRgyQkjIURGRiGGBmNhJWHm4uen4ICCA+IkIsDCQkVACWmhwSpFqAABQoQF6ALTkWFnYMrVlhWvIKTlSAiJiVVPqlGhJkhqShHV1lCW4cMqSkAR1ofiwsjJyqGgQAh+QQJCAAAACwAAAAAEAAQAAAHZ4AAgoOEhYaCJSWHgxGDJCSMhREZGIYYGY2ElYebi56fhyWQniSKAKKfpaCLFlAPhl0gXYNGEwkhGYREUywag1wJwSkHNDU3D0kJYIMZQwk8MjPBLx9eXwuETVEyAC/BOKsuEjYFhoEAIfkECQgAAAAsAAAAABAAEAAAB2eAAIKDhIWGgiUlh4MRgyQkjIURGRiGGBmNhJWHm4ueICImip6CIQkJKJ4kigynKaqKCyMnKqSEK05StgAGQRxPYZaENqccFgIID4KXmQBhXFkzDgOnFYLNgltaSAAEpxa7BQoQF4aBACH5BAkIAAAALAAAAAAQABAAAAdogACCg4SFggJiPUqCJSWGgkZjCUwZACQkgxGEXAmdT4UYGZqCGWQ+IjKGGIUwPzGPhAc0NTewhDOdL7Ykji+dOLuOLhI2BbaFETICx4MlQitdqoUsCQ2vhKGjglNfU0SWmILaj43M5oEAOwAAAAAAAAAAAA==) no-repeat center left; }
13
+ #full_list { padding: 0; list-style: none; margin-left: 0; }
14
+ #full_list ul { padding: 0; }
15
+ #full_list li { padding: 5px; padding-left: 12px; margin: 0; font-size: 1.1em; list-style: none; }
16
+ #noresults { padding: 7px 12px; }
17
+ #content.insearch #noresults { margin-left: 7px; }
18
+ ul.collapsed ul, ul.collapsed li { display: none; }
19
+ ul.collapsed.search_uncollapsed { display: block; }
20
+ ul.collapsed.search_uncollapsed li { display: list-item; }
21
+ li a.toggle { cursor: default; position: relative; left: -5px; top: 4px; text-indent: -999px; width: 10px; height: 9px; margin-left: -10px; display: block; float: left; background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTM5jWRgMAAAAVdEVYdENyZWF0aW9uIFRpbWUAMy8xNC8wOeNZPpQAAAE2SURBVDiNrZTBccIwEEXfelIAHUA6CZ24BGaWO+FuzZAK4k6gg5QAdGAq+Bxs2Yqx7BzyL7Llp/VfzZeQhCTc/ezuGzKKnKSzpCxXJM8fwNXda3df5RZETlIt6YUzSQDs93sl8w3wBZxCCE10GM1OcWbWjB2mWgEH4Mfdyxm3PSepBHibgQE2wLe7r4HjEidpnXMYdQPKEMJcsZ4zs2POYQOcaPfwMVOo58zsAdMt18BuoVDPxUJRacELbXv3hUIX2vYmOUvi8C8ydz/ThjXrqKqqLbDIAdsCKBd+Wo7GWa7o9qzOQHVVVXeAbs+yHHCH4aTsaCOQqunmUy1yBUAXkdMIfMlgF5EXLo2OpV/c/Up7jG4hhHcYLgWzAZXUc2b2ixsfvc/RmNNfOXD3Q/oeL9axJE1yT9IOoUu6MGUkAAAAAElFTkSuQmCC) no-repeat bottom left; }
22
+ li.collapsed a.toggle { opacity: 0.5; cursor: default; background-position: top left; }
23
+ li { color: #888; cursor: pointer; }
24
+ li.deprecated { text-decoration: line-through; font-style: italic; }
25
+ li.r1 { background: #f0f0f0; }
26
+ li.r2 { background: #fafafa; }
27
+ li:hover { background: #ddd; }
28
+ li small:before { content: "("; }
29
+ li small:after { content: ")"; }
30
+ li small.search_info { display: none; }
31
+ a:link, a:visited { text-decoration: none; color: #05a; }
32
+ li.clicked { background: #05a; color: #ccc; }
33
+ li.clicked a:link, li.clicked a:visited { color: #eee; }
34
+ li.clicked a.toggle { opacity: 0.5; background-position: bottom right; }
35
+ li.collapsed.clicked a.toggle { background-position: top right; }
36
+ #search input { border: 1px solid #bbb; -moz-border-radius: 3px; -webkit-border-radius: 3px; }
37
+ #nav { margin-left: 10px; font-size: 0.9em; display: none; color: #aaa; }
38
+ #nav a:link, #nav a:visited { color: #358; }
39
+ #nav a:hover { background: transparent; color: #5af; }
40
+ .frames #nav span:after { content: ' | '; }
41
+ .frames #nav span:last-child:after { content: ''; }
42
+
43
+ .frames #content h1 { margin-top: 0; }
44
+ .frames li { white-space: nowrap; cursor: normal; }
45
+ .frames li small { display: block; font-size: 0.8em; }
46
+ .frames li small:before { content: ""; }
47
+ .frames li small:after { content: ""; }
48
+ .frames li small.search_info { display: none; }
49
+ .frames #search { width: 170px; position: static; margin: 3px; margin-left: 10px; font-size: 0.9em; color: #888; padding-left: 0; padding-right: 24px; }
50
+ .frames #content.insearch #search { background-position: center right; }
51
+ .frames #search input { width: 110px; }
52
+ .frames #nav { display: block; }
53
+
54
+ #full_list.insearch li { display: none; }
55
+ #full_list.insearch li.found { display: list-item; padding-left: 10px; }
56
+ #full_list.insearch li a.toggle { display: none; }
57
+ #full_list.insearch li small.search_info { display: block; }
data/doc/css/style.css ADDED
@@ -0,0 +1,328 @@
1
+ body {
2
+ padding: 0 20px;
3
+ font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif;
4
+ font-size: 13px;
5
+ }
6
+ body.frames { padding: 0 5px; }
7
+ h1 { font-size: 25px; margin: 1em 0 0.5em; padding-top: 4px; border-top: 1px dotted #d5d5d5; }
8
+ h1.noborder { border-top: 0px; margin-top: 0; padding-top: 4px; }
9
+ h1.title { margin-bottom: 10px; }
10
+ h1.alphaindex { margin-top: 0; font-size: 22px; }
11
+ h2 {
12
+ padding: 0;
13
+ padding-bottom: 3px;
14
+ border-bottom: 1px #aaa solid;
15
+ font-size: 1.4em;
16
+ margin: 1.8em 0 0.5em;
17
+ }
18
+ h2 small { font-weight: normal; font-size: 0.7em; display: block; float: right; }
19
+ .clear { clear: both; }
20
+ .inline { display: inline; }
21
+ .inline p:first-child { display: inline; }
22
+ .docstring h1, .docstring h2, .docstring h3, .docstring h4 { padding: 0; border: 0; border-bottom: 1px dotted #bbb; }
23
+ .docstring h1 { font-size: 1.2em; }
24
+ .docstring h2 { font-size: 1.1em; }
25
+ .docstring h3, .docstring h4 { font-size: 1em; border-bottom: 0; padding-top: 10px; }
26
+ .summary_desc .object_link, .docstring .object_link { font-family: monospace; }
27
+ .rdoc-term { padding-right: 25px; font-weight: bold; }
28
+ .rdoc-list p { margin: 0; padding: 0; margin-bottom: 4px; }
29
+
30
+ /* style for <ul> */
31
+ #filecontents li > p, .docstring li > p { margin: 0px; }
32
+ #filecontents ul, .docstring ul { padding-left: 20px; }
33
+ /* style for <dl> */
34
+ #filecontents dl, .docstring dl { border: 1px solid #ccc; }
35
+ #filecontents dt, .docstring dt { background: #ddd; font-weight: bold; padding: 3px 5px; }
36
+ #filecontents dd, .docstring dd { padding: 5px 0px; margin-left: 18px; }
37
+ #filecontents dd > p, .docstring dd > p { margin: 0px; }
38
+
39
+ .note {
40
+ color: #222;
41
+ -moz-border-radius: 3px; -webkit-border-radius: 3px;
42
+ background: #e3e4e3; border: 1px solid #d5d5d5; padding: 7px 10px;
43
+ display: block;
44
+ }
45
+ .note.todo { background: #ffffc5; border-color: #ececaa; }
46
+ .note.returns_void { background: #efefef; }
47
+ .note.deprecated { background: #ffe5e5; border-color: #e9dada; }
48
+ .note.private { background: #ffffc5; border-color: #ececaa; }
49
+ .note.title { padding: 1px 5px; font-size: 0.9em; font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif; display: inline; }
50
+ .summary_signature + .note.title { margin-left: 7px; }
51
+ h1 .note.title { font-size: 0.5em; font-weight: normal; padding: 3px 5px; position: relative; top: -3px; text-transform: capitalize; }
52
+ .note.title.constructor { color: #fff; background: #6a98d6; border-color: #6689d6; }
53
+ .note.title.writeonly { color: #fff; background: #45a638; border-color: #2da31d; }
54
+ .note.title.readonly { color: #fff; background: #6a98d6; border-color: #6689d6; }
55
+ .note.title.private { background: #d5d5d5; border-color: #c5c5c5; }
56
+ .note.title.not_defined_here { background: transparent; border: none; font-style: italic; }
57
+ .discussion .note { margin-top: 6px; }
58
+ .discussion .note:first-child { margin-top: 0; }
59
+
60
+ h3.inherited {
61
+ font-style: italic;
62
+ font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif;
63
+ font-weight: normal;
64
+ padding: 0;
65
+ margin: 0;
66
+ margin-top: 12px;
67
+ margin-bottom: 3px;
68
+ font-size: 13px;
69
+ }
70
+ p.inherited {
71
+ padding: 0;
72
+ margin: 0;
73
+ margin-left: 25px;
74
+ }
75
+
76
+ #filecontents dl.box, dl.box {
77
+ border: 0;
78
+ width: 520px;
79
+ font-size: 1em;
80
+ }
81
+ #filecontents dl.box dt, dl.box dt {
82
+ float: left;
83
+ display: block;
84
+ width: 100px;
85
+ margin: 0;
86
+ text-align: right;
87
+ font-weight: bold;
88
+ background: transparent;
89
+ border: 1px solid #aaa;
90
+ border-width: 1px 0px 0px 1px;
91
+ padding: 6px 0;
92
+ padding-right: 10px;
93
+ }
94
+ #filecontents dl.box dd, dl.box dd {
95
+ float: left;
96
+ display: block;
97
+ width: 380px;
98
+ margin: 0;
99
+ padding: 6px 0;
100
+ padding-right: 20px;
101
+ border: 1px solid #aaa;
102
+ border-width: 1px 1px 0 0;
103
+ }
104
+ #filecontents dl.box .last, dl.box .last {
105
+ border-bottom: 1px solid #aaa;
106
+ }
107
+ #filecontents dl.box .r1, dl.box .r1 { background: #eee; }
108
+
109
+ ul.toplevel { list-style: none; padding-left: 0; font-size: 1.1em; }
110
+ .index_inline_list { padding-left: 0; font-size: 1.1em; }
111
+ .index_inline_list li { list-style: none; display: inline; padding: 7px 12px; line-height: 35px; }
112
+
113
+ dl.constants { margin-left: 40px; }
114
+ dl.constants dt { font-weight: bold; font-size: 1.1em; margin-bottom: 5px; }
115
+ dl.constants dd { width: 75%; white-space: pre; font-family: monospace; margin-bottom: 18px; }
116
+
117
+ .summary_desc { margin-left: 32px; display: block; font-family: sans-serif; }
118
+ .summary_desc tt { font-size: 0.9em; }
119
+ dl.constants .note { padding: 2px 6px; padding-right: 12px; margin-top: 6px; }
120
+ dl.constants .docstring { margin-left: 32px; font-size: 0.9em; font-weight: normal; }
121
+ dl.constants .tags { padding-left: 32px; font-size: 0.9em; line-height: 0.8em; }
122
+ dl.constants .discussion *:first-child { margin-top: 0; }
123
+ dl.constants .discussion *:last-child { margin-bottom: 0; }
124
+
125
+ .method_details { border-top: 1px dotted #aaa; margin-top: 15px; padding-top: 0; }
126
+ .method_details.first { border: 0; }
127
+ p.signature, h3.signature {
128
+ font-size: 1.1em; font-weight: normal; font-family: Monaco, Consolas, Courier, monospace;
129
+ padding: 6px 10px; margin-top: 18px;
130
+ background: #e5e8ff; border: 1px solid #d8d8e5; -moz-border-radius: 3px; -webkit-border-radius: 3px;
131
+ }
132
+ p.signature tt,
133
+ h3.signature tt { font-family: Monaco, Consolas, Courier, monospace; }
134
+ p.signature .overload,
135
+ h3.signature .overload { display: block; }
136
+ p.signature .extras,
137
+ h3.signature .extras { font-weight: normal; font-family: sans-serif; color: #444; font-size: 1em; }
138
+ p.signature .not_defined_here,
139
+ h3.signature .not_defined_here,
140
+ p.signature .aliases,
141
+ h3.signature .aliases { display: block; font-weight: normal; font-size: 0.9em; font-family: sans-serif; margin-top: 0px; color: #555; }
142
+ p.signature .aliases .names,
143
+ h3.signature .aliases .names { font-family: Monaco, Consolas, Courier, monospace; font-weight: bold; color: #000; font-size: 1.2em; }
144
+
145
+ .tags .tag_title { font-size: 1em; margin-bottom: 0; font-weight: bold; }
146
+ .tags ul { margin-top: 5px; padding-left: 30px; list-style: square; }
147
+ .tags ul li { margin-bottom: 3px; }
148
+ .tags ul .name { font-family: monospace; font-weight: bold; }
149
+ .tags ul .note { padding: 3px 6px; }
150
+ .tags { margin-bottom: 12px; }
151
+
152
+ .tags .examples .tag_title { margin-bottom: 10px; font-weight: bold; }
153
+ .tags .examples .inline p { padding: 0; margin: 0; margin-left: 15px; font-weight: bold; font-size: 0.9em; }
154
+
155
+ .tags .overload .overload_item { list-style: none; margin-bottom: 25px; }
156
+ .tags .overload .overload_item .signature {
157
+ padding: 2px 8px;
158
+ background: #e5e8ff; border: 1px solid #d8d8e5; -moz-border-radius: 3px; -webkit-border-radius: 3px;
159
+ }
160
+ .tags .overload .signature { margin-left: -15px; font-family: monospace; display: block; font-size: 1.1em; }
161
+ .tags .overload .docstring { margin-top: 15px; }
162
+
163
+ .defines { display: none; }
164
+
165
+ #method_missing_details .notice.this { position: relative; top: -8px; color: #888; padding: 0; margin: 0; }
166
+
167
+ .showSource { font-size: 0.9em; }
168
+ .showSource a:link, .showSource a:visited { text-decoration: none; color: #666; }
169
+
170
+ #content a:link, #content a:visited { text-decoration: none; color: #05a; }
171
+ #content a:hover { background: #ffffa5; }
172
+ div.docstring, p.docstring { margin-right: 6em; }
173
+
174
+ ul.summary {
175
+ list-style: none;
176
+ font-family: monospace;
177
+ font-size: 1em;
178
+ line-height: 1.5em;
179
+ }
180
+ ul.summary a:link, ul.summary a:visited {
181
+ text-decoration: none; font-size: 1.1em;
182
+ }
183
+ ul.summary li { margin-bottom: 5px; }
184
+ .summary .summary_signature {
185
+ padding: 1px 10px;
186
+ background: #eaeaff; border: 1px solid #dfdfe5;
187
+ -moz-border-radius: 3px; -webkit-border-radius: 3px;
188
+ }
189
+ .summary_signature:hover { background: #eeeeff; cursor: pointer; }
190
+ ul.summary.compact li { display: inline-block; margin: 0px 5px 0px 0px; line-height: 2.6em;}
191
+ ul.summary.compact .summary_signature { padding: 5px 7px; padding-right: 4px; }
192
+ #content .summary_signature:hover a:link,
193
+ #content .summary_signature:hover a:visited {
194
+ background: transparent;
195
+ color: #48f;
196
+ }
197
+
198
+ p.inherited a { font-family: monospace; font-size: 0.9em; }
199
+ p.inherited { word-spacing: 5px; font-size: 1.2em; }
200
+
201
+ p.children { font-size: 1.2em; }
202
+ p.children a { font-size: 0.9em; }
203
+ p.children strong { font-size: 0.8em; }
204
+ p.children strong.modules { padding-left: 5px; }
205
+
206
+ ul.fullTree { display: none; padding-left: 0; list-style: none; margin-left: 0; margin-bottom: 10px; }
207
+ ul.fullTree ul { margin-left: 0; padding-left: 0; list-style: none; }
208
+ ul.fullTree li { text-align: center; padding-top: 18px; padding-bottom: 12px; background: url(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAHtJREFUeNqMzrEJAkEURdGzuhgZbSoYWcAWoBVsB4JgZAGmphsZCZYzTQgWNCYrDN9RvMmHx+X916SUBFbo8CzD1idXrLErw1mQttgXtyrOcQ/Ny5p4Qh+2XqLYYazsPWNTiuMkRxa4vcV+evuNAUOLIx5+c2hyzv7hNQC67Q+/HHmlEwAAAABJRU5ErkJggg==) no-repeat top center; }
209
+ ul.fullTree li:first-child { padding-top: 0; background: transparent; }
210
+ ul.fullTree li:last-child { padding-bottom: 0; }
211
+ .showAll ul.fullTree { display: block; }
212
+ .showAll .inheritName { display: none; }
213
+
214
+ #search { position: absolute; right: 14px; top: 0px; }
215
+ #search a:link, #search a:visited {
216
+ display: block; float: left; margin-right: 4px;
217
+ padding: 8px 10px; text-decoration: none; color: #05a;
218
+ border: 1px solid #d8d8e5;
219
+ -moz-border-radius-bottomleft: 3px; -moz-border-radius-bottomright: 3px;
220
+ -webkit-border-bottom-left-radius: 3px; -webkit-border-bottom-right-radius: 3px;
221
+ background: #eaf0ff;
222
+ -webkit-box-shadow: -1px 1px 3px #ddd;
223
+ }
224
+ #search a:hover { background: #f5faff; color: #06b; }
225
+ #search a.active {
226
+ background: #568; padding-bottom: 20px; color: #fff; border: 1px solid #457;
227
+ -moz-border-radius-topleft: 5px; -moz-border-radius-topright: 5px;
228
+ -webkit-border-top-left-radius: 5px; -webkit-border-top-right-radius: 5px;
229
+ }
230
+ #search a.inactive { color: #999; }
231
+ .frames #search { display: none; }
232
+ .inheritanceTree, .toggleDefines { float: right; }
233
+
234
+ #menu { font-size: 1.3em; color: #bbb; top: -5px; position: relative; }
235
+ #menu .title, #menu a { font-size: 0.7em; }
236
+ #menu .title a { font-size: 1em; }
237
+ #menu .title { color: #555; }
238
+ #menu a:link, #menu a:visited { color: #333; text-decoration: none; border-bottom: 1px dotted #bbd; }
239
+ #menu a:hover { color: #05a; }
240
+ #menu .noframes { display: inline; }
241
+ .frames #menu .noframes { display: inline; float: right; }
242
+
243
+ #footer { margin-top: 15px; border-top: 1px solid #ccc; text-align: center; padding: 7px 0; color: #999; }
244
+ #footer a:link, #footer a:visited { color: #444; text-decoration: none; border-bottom: 1px dotted #bbd; }
245
+ #footer a:hover { color: #05a; }
246
+
247
+ #listing ul.alpha { font-size: 1.1em; }
248
+ #listing ul.alpha { margin: 0; padding: 0; padding-bottom: 10px; list-style: none; }
249
+ #listing ul.alpha li.letter { font-size: 1.4em; padding-bottom: 10px; }
250
+ #listing ul.alpha ul { margin: 0; padding-left: 15px; }
251
+ #listing ul small { color: #666; font-size: 0.7em; }
252
+
253
+ li.r1 { background: #f0f0f0; }
254
+ li.r2 { background: #fafafa; }
255
+
256
+ #search_frame {
257
+ z-index: 9999;
258
+ background: #fff;
259
+ display: none;
260
+ position: absolute;
261
+ top: 36px;
262
+ right: 18px;
263
+ width: 500px;
264
+ height: 80%;
265
+ overflow-y: scroll;
266
+ border: 1px solid #999;
267
+ border-collapse: collapse;
268
+ -webkit-box-shadow: -7px 5px 25px #aaa;
269
+ -moz-box-shadow: -7px 5px 25px #aaa;
270
+ -moz-border-radius: 2px;
271
+ -webkit-border-radius: 2px;
272
+ }
273
+
274
+ #content ul.summary li.deprecated .summary_signature a:link,
275
+ #content ul.summary li.deprecated .summary_signature a:visited { text-decoration: line-through; font-style: italic; }
276
+
277
+ #toc {
278
+ padding: 20px; padding-right: 30px; border: 1px solid #ddd; float: right; background: #fff; margin-left: 20px; margin-bottom: 20px;
279
+ max-width: 300px;
280
+ -webkit-box-shadow: -2px 2px 6px #bbb;
281
+ -moz-box-shadow: -2px 2px 6px #bbb;
282
+ z-index: 5000;
283
+ position: relative;
284
+ }
285
+ #toc.nofloat { float: none; max-width: none; border: none; padding: 0; margin: 20px 0; -webkit-box-shadow: none; -moz-box-shadow: none; }
286
+ #toc.nofloat.hidden { padding: 0; background: 0; margin-bottom: 5px; }
287
+ #toc .title { margin: 0; }
288
+ #toc ol { padding-left: 1.8em; }
289
+ #toc li { font-size: 1.1em; line-height: 1.7em; }
290
+ #toc > ol > li { font-size: 1.1em; font-weight: bold; }
291
+ #toc ol > ol { font-size: 0.9em; }
292
+ #toc ol ol > ol { padding-left: 2.3em; }
293
+ #toc ol + li { margin-top: 0.3em; }
294
+ #toc.hidden { padding: 10px; background: #f6f6f6; -webkit-box-shadow: none; -moz-box-shadow: none; }
295
+ #filecontents h1 + #toc.nofloat { margin-top: 0; }
296
+
297
+ /* syntax highlighting */
298
+ .source_code { display: none; padding: 3px 8px; border-left: 8px solid #ddd; margin-top: 5px; }
299
+ #filecontents pre.code, .docstring pre.code, .source_code pre { font-family: monospace; }
300
+ #filecontents pre.code, .docstring pre.code { display: block; }
301
+ .source_code .lines { padding-right: 12px; color: #555; text-align: right; }
302
+ #filecontents pre.code, .docstring pre.code,
303
+ .tags pre.example { padding: 5px 12px; margin-top: 4px; border: 1px solid #eef; background: #f5f5ff; }
304
+ pre.code { color: #000; }
305
+ pre.code .info.file { color: #555; }
306
+ pre.code .val { color: #036A07; }
307
+ pre.code .tstring_content,
308
+ pre.code .heredoc_beg, pre.code .heredoc_end,
309
+ pre.code .qwords_beg, pre.code .qwords_end,
310
+ pre.code .tstring, pre.code .dstring { color: #036A07; }
311
+ pre.code .fid, pre.code .rubyid_new, pre.code .rubyid_to_s,
312
+ pre.code .rubyid_to_sym, pre.code .rubyid_to_f,
313
+ pre.code .dot + pre.code .id,
314
+ pre.code .rubyid_to_i pre.code .rubyid_each { color: #0085FF; }
315
+ pre.code .comment { color: #0066FF; }
316
+ pre.code .const, pre.code .constant { color: #585CF6; }
317
+ pre.code .symbol { color: #C5060B; }
318
+ pre.code .kw,
319
+ pre.code .label,
320
+ pre.code .rubyid_require,
321
+ pre.code .rubyid_extend,
322
+ pre.code .rubyid_include { color: #0000FF; }
323
+ pre.code .ivar { color: #318495; }
324
+ pre.code .gvar,
325
+ pre.code .rubyid_backref,
326
+ pre.code .rubyid_nth_ref { color: #6D79DE; }
327
+ pre.code .regexp, .dregexp { color: #036A07; }
328
+ pre.code a { border-bottom: 1px dotted #bbf; }
@@ -0,0 +1,534 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
6
+ <title>
7
+ File: README
8
+
9
+ &mdash; Documentation by YARD 0.8.0
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="css/style.css" type="text/css" media="screen" charset="utf-8" />
14
+
15
+ <link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
16
+
17
+ <script type="text/javascript" charset="utf-8">
18
+ hasFrames = window.top.frames.main ? true : false;
19
+ relpath = '';
20
+ framesUrl = "frames.html#!" + escape(window.location.href);
21
+ </script>
22
+
23
+
24
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
25
+
26
+ <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
27
+
28
+
29
+ </head>
30
+ <body>
31
+ <div id="header">
32
+ <div id="menu">
33
+
34
+ <a href="_index.html">Index</a> &raquo;
35
+ <span class="title">File: README</span>
36
+
37
+
38
+ <div class="noframes"><span class="title">(</span><a href="." target="_top">no frames</a><span class="title">)</span></div>
39
+ </div>
40
+
41
+ <div id="search">
42
+
43
+ <a class="full_list_link" id="class_list_link"
44
+ href="class_list.html">
45
+ Class List
46
+ </a>
47
+
48
+ <a class="full_list_link" id="method_list_link"
49
+ href="method_list.html">
50
+ Method List
51
+ </a>
52
+
53
+ <a class="full_list_link" id="file_list_link"
54
+ href="file_list.html">
55
+ File List
56
+ </a>
57
+
58
+ </div>
59
+ <div class="clear"></div>
60
+ </div>
61
+
62
+ <iframe id="search_frame"></iframe>
63
+
64
+ <div id="content"><div id='filecontents'><h1>r509 <a href="http://travis-ci.org/reaperhulk/r509"><img src="https://secure.travis-ci.org/reaperhulk/r509.png" alt="Build Status"></a></h1>
65
+
66
+ <p>r509 is a wrapper for various OpenSSL functions to allow easy creation of CSRs, signing of certificates, and revocation via CRL. Together with projects like <a href="https://github.com/reaperhulk/r509-ocsp-responder">r509-ocsp-responder</a> and <a href="https://github.com/sirsean/r509-ca-http">r509-ca-http</a> it is intended to be a complete certificate authority for use in production environments.</p>
67
+
68
+ <h2>Requirements/Installation</h2>
69
+
70
+ <p>r509 requires the Ruby OpenSSL bindings as well as yaml support (present by default in modern Ruby builds).
71
+ To install the gem: <code>gem install r509-(version).gem</code></p>
72
+
73
+ <h2>Running Tests/Building Gem</h2>
74
+
75
+ <p>If you want to run the tests for r509 you&#39;ll need rspec. Additionally, you may want to install rcov/simplecov (ruby 1.8/1.9 respectively) and yard for running the code coverage and documentation tasks in the Rakefile. <code>rake -T</code> for a complete list of rake tasks available.</p>
76
+
77
+ <h2>Continuous Integration</h2>
78
+
79
+ <p>We run continuous integration tests (using Travis-CI) against 1.8.7, 1.9.2, 1.9.3, ree, ruby-head, and rubinius(rbx) 2.0 in 1.9 mode.</p>
80
+
81
+ <h2>Executable</h2>
82
+
83
+ <p>Inside the gem there is a bin directory that contains <code>r509</code>. You can use this in interactive mode to generate a CSR and (optionally) self-sign it.</p>
84
+
85
+ <h2>Usage</h2>
86
+
87
+ <h3>CSR</h3>
88
+
89
+ <p>To generate a 2048-bit RSA CSR</p>
90
+
91
+ <pre class="code ruby"><code><span class='id identifier rubyid_csr'>csr</span> <span class='op'>=</span> <span class='const'>R509</span><span class='op'>::</span><span class='const'>Csr</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span>
92
+ <span class='symbol'>:subject</span> <span class='op'>=&gt;</span> <span class='lbracket'>[</span>
93
+ <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>CN</span><span class='tstring_end'>'</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>somedomain.com</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='comma'>,</span>
94
+ <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>O</span><span class='tstring_end'>'</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>My Org</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='comma'>,</span>
95
+ <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>L</span><span class='tstring_end'>'</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>City</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='comma'>,</span>
96
+ <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>ST</span><span class='tstring_end'>'</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>State</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='comma'>,</span>
97
+ <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>C</span><span class='tstring_end'>'</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>US</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span>
98
+ <span class='rbracket'>]</span>
99
+ <span class='rparen'>)</span>
100
+ </code></pre>
101
+
102
+ <p>To load an existing CSR (without private key)</p>
103
+
104
+ <pre class="code ruby"><code><span class='id identifier rubyid_csr_pem'>csr_pem</span> <span class='op'>=</span> <span class='const'>File</span><span class='period'>.</span><span class='id identifier rubyid_read'>read</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>/path/to/csr</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
105
+ <span class='id identifier rubyid_csr'>csr</span> <span class='op'>=</span> <span class='const'>R509</span><span class='op'>::</span><span class='const'>Csr</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='symbol'>:csr</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_csr_pem'>csr_pem</span><span class='rparen'>)</span>
106
+ <span class='comment'># or
107
+ </span><span class='id identifier rubyid_csr'>csr</span> <span class='op'>=</span> <span class='const'>R509</span><span class='op'>::</span><span class='const'>Csr</span><span class='period'>.</span><span class='id identifier rubyid_load_from_file'>load_from_file</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>/path/to/csr</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
108
+ </code></pre>
109
+
110
+ <p>To create a new CSR from the subject of a certificate</p>
111
+
112
+ <pre class="code ruby"><code><span class='id identifier rubyid_cert_pem'>cert_pem</span> <span class='op'>=</span> <span class='const'>File</span><span class='period'>.</span><span class='id identifier rubyid_read'>read</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>/path/to/cert</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
113
+ <span class='id identifier rubyid_csr'>csr</span> <span class='op'>=</span> <span class='const'>R509</span><span class='op'>::</span><span class='const'>Csr</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='symbol'>:cert</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_cert_pem'>cert_pem</span><span class='rparen'>)</span>
114
+ </code></pre>
115
+
116
+ <p>To create a CSR with SAN names</p>
117
+
118
+ <pre class="code ruby"><code><span class='id identifier rubyid_csr'>csr</span> <span class='op'>=</span> <span class='const'>R509</span><span class='op'>::</span><span class='const'>Csr</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span>
119
+ <span class='symbol'>:subject</span> <span class='op'>=&gt;</span> <span class='lbracket'>[</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>CN</span><span class='tstring_end'>'</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>something.com</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='rbracket'>]</span><span class='comma'>,</span>
120
+ <span class='symbol'>:san_names</span> <span class='op'>=&gt;</span> <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>something2.com</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>something3.com</span><span class='tstring_end'>&quot;</span></span><span class='rbracket'>]</span>
121
+ <span class='rparen'>)</span>
122
+ </code></pre>
123
+
124
+ <h3>Cert</h3>
125
+
126
+ <p>To load an existing certificate</p>
127
+
128
+ <pre class="code ruby"><code><span class='id identifier rubyid_cert_pem'>cert_pem</span> <span class='op'>=</span> <span class='const'>File</span><span class='period'>.</span><span class='id identifier rubyid_read'>read</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>/path/to/cert</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
129
+ <span class='id identifier rubyid_cert'>cert</span> <span class='op'>=</span> <span class='const'>R509</span><span class='op'>::</span><span class='const'>Cert</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='symbol'>:cert</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_cert_pem'>cert_pem</span><span class='rparen'>)</span>
130
+ <span class='comment'># or
131
+ </span><span class='id identifier rubyid_cert'>cert</span> <span class='op'>=</span> <span class='const'>R509</span><span class='op'>::</span><span class='const'>Cert</span><span class='period'>.</span><span class='id identifier rubyid_load_from_file'>load_from_file</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>/path/to/cert</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
132
+ </code></pre>
133
+
134
+ <p>Load a cert and key</p>
135
+
136
+ <pre class="code ruby"><code><span class='id identifier rubyid_cert_pem'>cert_pem</span> <span class='op'>=</span> <span class='const'>File</span><span class='period'>.</span><span class='id identifier rubyid_read'>read</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>/path/to/cert</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
137
+ <span class='id identifier rubyid_key_pem'>key_pem</span> <span class='op'>=</span> <span class='const'>File</span><span class='period'>.</span><span class='id identifier rubyid_read'>read</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>/path/to/key</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
138
+ <span class='id identifier rubyid_cert'>cert</span> <span class='op'>=</span> <span class='const'>R509</span><span class='op'>::</span><span class='const'>Cert</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span>
139
+ <span class='symbol'>:cert</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_cert_pem'>cert_pem</span><span class='comma'>,</span>
140
+ <span class='symbol'>:key</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_key_pem'>key_pem</span>
141
+ <span class='rparen'>)</span>
142
+ </code></pre>
143
+
144
+ <p>Load an encrypted private key</p>
145
+
146
+ <pre class="code ruby"><code><span class='id identifier rubyid_cert_pem'>cert_pem</span> <span class='op'>=</span> <span class='const'>File</span><span class='period'>.</span><span class='id identifier rubyid_read'>read</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>/path/to/cert</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
147
+ <span class='id identifier rubyid_key_pem'>key_pem</span> <span class='op'>=</span> <span class='const'>File</span><span class='period'>.</span><span class='id identifier rubyid_read'>read</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>/path/to/key</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
148
+ <span class='id identifier rubyid_cert'>cert</span> <span class='op'>=</span> <span class='const'>R509</span><span class='op'>::</span><span class='const'>Cert</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span>
149
+ <span class='symbol'>:cert</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_cert_pem'>cert_pem</span><span class='comma'>,</span>
150
+ <span class='symbol'>:key</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_key_pem'>key_pem</span><span class='comma'>,</span>
151
+ <span class='symbol'>:password</span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>private_key_password</span><span class='tstring_end'>&quot;</span></span>
152
+ <span class='rparen'>)</span>
153
+ </code></pre>
154
+
155
+ <p>Load a PKCS12 file</p>
156
+
157
+ <pre class="code ruby"><code><span class='id identifier rubyid_pkcs12_der'>pkcs12_der</span> <span class='op'>=</span> <span class='const'>File</span><span class='period'>.</span><span class='id identifier rubyid_read'>read</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>/path/to/p12</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
158
+ <span class='id identifier rubyid_cert'>cert</span> <span class='op'>=</span> <span class='const'>R509</span><span class='op'>::</span><span class='const'>Cert</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span>
159
+ <span class='symbol'>:pkcs12</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_pkcs12_der'>pkcs12_der</span><span class='comma'>,</span>
160
+ <span class='symbol'>:password</span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>password</span><span class='tstring_end'>&quot;</span></span>
161
+ <span class='rparen'>)</span>
162
+ </code></pre>
163
+
164
+ <h3>Self-Signed Certificate</h3>
165
+
166
+ <p>To create a self-signed certificate</p>
167
+
168
+ <pre class="code ruby"><code><span class='id identifier rubyid_not_before'>not_before</span> <span class='op'>=</span> <span class='const'>Time</span><span class='period'>.</span><span class='id identifier rubyid_now'>now</span><span class='period'>.</span><span class='id identifier rubyid_to_i'>to_i</span>
169
+ <span class='id identifier rubyid_not_after'>not_after</span> <span class='op'>=</span> <span class='const'>Time</span><span class='period'>.</span><span class='id identifier rubyid_now'>now</span><span class='period'>.</span><span class='id identifier rubyid_to_i'>to_i</span><span class='op'>+</span><span class='int'>3600</span><span class='op'>*</span><span class='int'>24</span><span class='op'>*</span><span class='int'>7300</span>
170
+ <span class='id identifier rubyid_csr'>csr</span> <span class='op'>=</span> <span class='const'>R509</span><span class='op'>::</span><span class='const'>Csr</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span>
171
+ <span class='symbol'>:subject</span> <span class='op'>=&gt;</span> <span class='lbracket'>[</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>C</span><span class='tstring_end'>'</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>US</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='comma'>,</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>O</span><span class='tstring_end'>'</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>r509 LLC</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='comma'>,</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>CN</span><span class='tstring_end'>'</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>r509 Self-Signed CA Test</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='rbracket'>]</span>
172
+ <span class='rparen'>)</span>
173
+ <span class='id identifier rubyid_ca'>ca</span> <span class='op'>=</span> <span class='const'>R509</span><span class='op'>::</span><span class='const'>CertificateAuthority</span><span class='op'>::</span><span class='const'>Signer</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span>
174
+ <span class='id identifier rubyid_cert'>cert</span> <span class='op'>=</span> <span class='id identifier rubyid_ca'>ca</span><span class='period'>.</span><span class='id identifier rubyid_selfsign'>selfsign</span><span class='lparen'>(</span>
175
+ <span class='symbol'>:csr</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_csr'>csr</span><span class='comma'>,</span>
176
+ <span class='symbol'>:not_before</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_not_before'>not_before</span><span class='comma'>,</span>
177
+ <span class='symbol'>:not_after</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_not_after'>not_after</span>
178
+ <span class='rparen'>)</span>
179
+ </code></pre>
180
+
181
+ <h3>Config</h3>
182
+
183
+ <p>Create a basic CaConfig object</p>
184
+
185
+ <pre class="code ruby"><code><span class='id identifier rubyid_cert_pem'>cert_pem</span> <span class='op'>=</span> <span class='const'>File</span><span class='period'>.</span><span class='id identifier rubyid_read'>read</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>/path/to/cert</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
186
+ <span class='id identifier rubyid_key_pem'>key_pem</span> <span class='op'>=</span> <span class='const'>File</span><span class='period'>.</span><span class='id identifier rubyid_read'>read</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>/path/to/key</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
187
+ <span class='id identifier rubyid_cert'>cert</span> <span class='op'>=</span> <span class='const'>R509</span><span class='op'>::</span><span class='const'>Cert</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span>
188
+ <span class='symbol'>:cert</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_cert_pem'>cert_pem</span><span class='comma'>,</span>
189
+ <span class='symbol'>:key</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_key_pem'>key_pem</span>
190
+ <span class='rparen'>)</span>
191
+ <span class='id identifier rubyid_config'>config</span> <span class='op'>=</span> <span class='const'>R509</span><span class='op'>::</span><span class='const'>Config</span><span class='op'>::</span><span class='const'>CaConfig</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span>
192
+ <span class='symbol'>:ca_cert</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_cert'>cert</span>
193
+ <span class='rparen'>)</span>
194
+ </code></pre>
195
+
196
+ <p>Add a signing profile named &quot;server&quot; (CaProfile) to a config object</p>
197
+
198
+ <pre class="code ruby"><code><span class='id identifier rubyid_profile'>profile</span> <span class='op'>=</span> <span class='const'>R509</span><span class='op'>::</span><span class='const'>Config</span><span class='op'>::</span><span class='const'>CaProfile</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span>
199
+ <span class='symbol'>:basic_constraints</span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>CA:FALSE</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span>
200
+ <span class='symbol'>:key_usage</span> <span class='op'>=&gt;</span> <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>digitalSignature</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>keyEncipherment</span><span class='tstring_end'>&quot;</span></span><span class='rbracket'>]</span><span class='comma'>,</span>
201
+ <span class='symbol'>:extended_key_usage</span> <span class='op'>=&gt;</span> <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>serverAuth</span><span class='tstring_end'>&quot;</span></span><span class='rbracket'>]</span><span class='comma'>,</span>
202
+ <span class='symbol'>:certificate_policies</span> <span class='op'>=&gt;</span> <span class='lbracket'>[</span> <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>policyIdentifier=2.16.840.1.999999999.1.2.3.4.1</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>CPS.1=http://example.com/cps</span><span class='tstring_end'>&quot;</span></span><span class='rbracket'>]</span> <span class='rbracket'>]</span><span class='comma'>,</span>
203
+ <span class='symbol'>:subject_item_policy</span> <span class='op'>=&gt;</span> <span class='kw'>nil</span>
204
+ <span class='rparen'>)</span>
205
+ <span class='comment'># config object from above assumed
206
+ </span><span class='id identifier rubyid_config'>config</span><span class='period'>.</span><span class='id identifier rubyid_set_profile'>set_profile</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>server</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span><span class='id identifier rubyid_profile'>profile</span><span class='rparen'>)</span>
207
+ </code></pre>
208
+
209
+ <p>Set up a subject item policy (required/optional). The keys must match OpenSSL&#39;s shortnames!</p>
210
+
211
+ <pre class="code ruby"><code><span class='id identifier rubyid_profile'>profile</span> <span class='op'>=</span> <span class='const'>R509</span><span class='op'>::</span><span class='const'>Config</span><span class='op'>::</span><span class='const'>CaProfile</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span>
212
+ <span class='symbol'>:basic_constraints</span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>CA:FALSE</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span>
213
+ <span class='symbol'>:key_usage</span> <span class='op'>=&gt;</span> <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>digitalSignature</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>keyEncipherment</span><span class='tstring_end'>&quot;</span></span><span class='rbracket'>]</span><span class='comma'>,</span>
214
+ <span class='symbol'>:extended_key_usage</span> <span class='op'>=&gt;</span> <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>serverAuth</span><span class='tstring_end'>&quot;</span></span><span class='rbracket'>]</span><span class='comma'>,</span>
215
+ <span class='symbol'>:certificate_policies</span> <span class='op'>=&gt;</span> <span class='lbracket'>[</span> <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>policyIdentifier=2.16.840.1.999999999.1.2.3.4.1</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>CPS.1=http://example.com/cps</span><span class='tstring_end'>&quot;</span></span><span class='rbracket'>]</span> <span class='rbracket'>]</span><span class='comma'>,</span>
216
+ <span class='symbol'>:subject_item_policy</span> <span class='op'>=&gt;</span> <span class='lbrace'>{</span>
217
+ <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>CN</span><span class='tstring_end'>&quot;</span></span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>required</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span>
218
+ <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>O</span><span class='tstring_end'>&quot;</span></span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>optional</span><span class='tstring_end'>&quot;</span></span>
219
+ <span class='rbrace'>}</span>
220
+ <span class='rparen'>)</span>
221
+ <span class='comment'># config object from above assumed
222
+ </span><span class='id identifier rubyid_config'>config</span><span class='period'>.</span><span class='id identifier rubyid_set_profile'>set_profile</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>server</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span><span class='id identifier rubyid_profile'>profile</span><span class='rparen'>)</span>
223
+ </code></pre>
224
+
225
+ <p>Load CaConfig + Profile from YAML</p>
226
+
227
+ <pre class="code ruby"><code><span class='id identifier rubyid_config'>config</span> <span class='op'>=</span> <span class='const'>R509</span><span class='op'>::</span><span class='const'>Config</span><span class='op'>::</span><span class='const'>CaConfig</span><span class='period'>.</span><span class='id identifier rubyid_from_yaml'>from_yaml</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>test_ca</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>config_test.yaml</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
228
+ </code></pre>
229
+
230
+ <p>Example YAML (more options are supported than this example)</p>
231
+
232
+ <pre class="code yaml"><code>test_ca: {
233
+ ca_cert: {
234
+ cert: '/path/to/test_ca.cer',
235
+ key: '/path/to/test_ca.key'
236
+ },
237
+ crl_list: &quot;crl_list_file.txt&quot;,
238
+ crl_number: &quot;crl_number_file.txt&quot;,
239
+ cdp_location: 'URI:http://crl.domain.com/test_ca.crl',
240
+ crl_validity_hours: 168, #7 days
241
+ ocsp_location: 'URI:http://ocsp.domain.com',
242
+ message_digest: 'SHA1', #SHA1, SHA256, SHA512 supported. MD5 too, but you really shouldn't use that unless you have a good reason
243
+ profiles: {
244
+ server: {
245
+ basic_constraints: &quot;CA:FALSE&quot;,
246
+ key_usage: [digitalSignature,keyEncipherment],
247
+ extended_key_usage: [serverAuth],
248
+ certificate_policies: [ [ &quot;policyIdentifier=2.16.840.1.9999999999.1.2.3.4.1&quot;, &quot;CPS.1=http://example.com/cps&quot;] ],
249
+ subject_item_policy: {
250
+ &quot;CN&quot; : &quot;required&quot;,
251
+ &quot;O&quot; : &quot;optional&quot;,
252
+ &quot;ST&quot; : &quot;required&quot;,
253
+ &quot;C&quot; : &quot;required&quot;,
254
+ &quot;OU&quot; : &quot;optional&quot; }
255
+ }
256
+ }
257
+ }
258
+ </code></pre>
259
+
260
+ <p>Load multiple CaConfigs using a CaConfigPool</p>
261
+
262
+ <pre class="code ruby"><code><span class='id identifier rubyid_pool'>pool</span> <span class='op'>=</span> <span class='const'>R509</span><span class='op'>::</span><span class='const'>Config</span><span class='op'>::</span><span class='const'>CaConfigPool</span><span class='period'>.</span><span class='id identifier rubyid_from_yaml'>from_yaml</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>certificate_authorities</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>config_pool.yaml</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
263
+ </code></pre>
264
+
265
+ <p>Example (Minimal) Config Pool YAML</p>
266
+
267
+ <pre class="code yaml"><code>certificate_authorities: {
268
+ test_ca: {
269
+ ca_cert: {
270
+ cert: 'test_ca.cer',
271
+ key: 'test_ca.key'
272
+ }
273
+ },
274
+ second_ca: {
275
+ ca_cert: {
276
+ cert: 'second_ca.cer',
277
+ key: 'second_ca.key'
278
+ }
279
+ }
280
+ }
281
+ </code></pre>
282
+
283
+ <h3>CertificateAuthority</h3>
284
+
285
+ <p>Sign a CSR</p>
286
+
287
+ <pre class="code ruby"><code><span class='id identifier rubyid_csr'>csr</span> <span class='op'>=</span> <span class='const'>R509</span><span class='op'>::</span><span class='const'>Csr</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span>
288
+ <span class='symbol'>:subject</span> <span class='op'>=&gt;</span> <span class='lbracket'>[</span>
289
+ <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>CN</span><span class='tstring_end'>'</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>somedomain.com</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='comma'>,</span>
290
+ <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>O</span><span class='tstring_end'>'</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>My Org</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='comma'>,</span>
291
+ <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>L</span><span class='tstring_end'>'</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>City</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='comma'>,</span>
292
+ <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>ST</span><span class='tstring_end'>'</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>State</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='comma'>,</span>
293
+ <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>C</span><span class='tstring_end'>'</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>US</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span>
294
+ <span class='rbracket'>]</span>
295
+ <span class='rparen'>)</span>
296
+ <span class='comment'># assume config from yaml load above
297
+ </span><span class='id identifier rubyid_ca'>ca</span> <span class='op'>=</span> <span class='const'>R509</span><span class='op'>::</span><span class='const'>CertificateAuthority</span><span class='op'>::</span><span class='const'>Signer</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='id identifier rubyid_config'>config</span><span class='rparen'>)</span>
298
+ <span class='id identifier rubyid_cert'>cert</span> <span class='op'>=</span> <span class='id identifier rubyid_ca'>ca</span><span class='period'>.</span><span class='id identifier rubyid_sign'>sign</span><span class='lparen'>(</span>
299
+ <span class='symbol'>:profile_name</span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>server</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span>
300
+ <span class='symbol'>:csr</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_csr'>csr</span>
301
+ <span class='rparen'>)</span>
302
+ </code></pre>
303
+
304
+ <p>Override a CSR&#39;s subject or SAN names when signing</p>
305
+
306
+ <pre class="code ruby"><code><span class='id identifier rubyid_csr'>csr</span> <span class='op'>=</span> <span class='const'>R509</span><span class='op'>::</span><span class='const'>Csr</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span>
307
+ <span class='symbol'>:subject</span> <span class='op'>=&gt;</span> <span class='lbracket'>[</span>
308
+ <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>CN</span><span class='tstring_end'>'</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>somedomain.com</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='comma'>,</span>
309
+ <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>O</span><span class='tstring_end'>'</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>My Org</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='comma'>,</span>
310
+ <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>L</span><span class='tstring_end'>'</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>City</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='comma'>,</span>
311
+ <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>ST</span><span class='tstring_end'>'</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>State</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='comma'>,</span>
312
+ <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>C</span><span class='tstring_end'>'</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>US</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span>
313
+ <span class='rbracket'>]</span>
314
+ <span class='rparen'>)</span>
315
+ <span class='id identifier rubyid_data_hash'>data_hash</span> <span class='op'>=</span> <span class='id identifier rubyid_csr'>csr</span><span class='period'>.</span><span class='id identifier rubyid_to_hash'>to_hash</span>
316
+ <span class='id identifier rubyid_data_hash'>data_hash</span><span class='lbracket'>[</span><span class='symbol'>:san_names</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>sannames.com</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>domain2.com</span><span class='tstring_end'>&quot;</span></span><span class='rbracket'>]</span>
317
+ <span class='id identifier rubyid_data_hash'>data_hash</span><span class='lbracket'>[</span><span class='symbol'>:subject</span><span class='rbracket'>]</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>CN</span><span class='tstring_end'>&quot;</span></span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>newdomain.com</span><span class='tstring_end'>&quot;</span></span>
318
+ <span class='id identifier rubyid_data_hash'>data_hash</span><span class='lbracket'>[</span><span class='symbol'>:subject</span><span class='rbracket'>]</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>O</span><span class='tstring_end'>&quot;</span></span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Org 2.0</span><span class='tstring_end'>&quot;</span></span>
319
+ <span class='comment'># assume config from yaml load above
320
+ </span><span class='id identifier rubyid_ca'>ca</span> <span class='op'>=</span> <span class='const'>R509</span><span class='op'>::</span><span class='const'>CertificateAuthority</span><span class='op'>::</span><span class='const'>Signer</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='id identifier rubyid_config'>config</span><span class='rparen'>)</span>
321
+ <span class='id identifier rubyid_cert'>cert</span> <span class='op'>=</span> <span class='id identifier rubyid_ca'>ca</span><span class='period'>.</span><span class='id identifier rubyid_sign'>sign</span><span class='lparen'>(</span>
322
+ <span class='symbol'>:profile_name</span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>server</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span>
323
+ <span class='symbol'>:csr</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_csr'>csr</span><span class='comma'>,</span>
324
+ <span class='symbol'>:data_hash</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_data_hash'>data_hash</span>
325
+ <span class='rparen'>)</span>
326
+ </code></pre>
327
+
328
+ <h3>Load Hardware Engines</h3>
329
+
330
+ <p>The engine you want to load must already be available to OpenSSL. How to compile/install OpenSSL engines is outside the scope of this document.</p>
331
+
332
+ <pre class="code ruby"><code><span class='const'>OpenSSL</span><span class='op'>::</span><span class='const'>Engine</span><span class='period'>.</span><span class='id identifier rubyid_load'>load</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>engine_name</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
333
+ <span class='id identifier rubyid_engine'>engine</span> <span class='op'>=</span> <span class='const'>OpenSSL</span><span class='op'>::</span><span class='const'>Engine</span><span class='period'>.</span><span class='id identifier rubyid_by_id'>by_id</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>engine_name</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
334
+ <span class='id identifier rubyid_key'>key</span> <span class='op'>=</span> <span class='const'>R509</span><span class='op'>::</span><span class='const'>PrivateKey</span><span class='lparen'>(</span>
335
+ <span class='symbol'>:engine</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_engine'>engine</span><span class='comma'>,</span>
336
+ <span class='symbol'>:key_name</span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>my_key_name</span><span class='tstring_end'>&quot;</span></span>
337
+ <span class='rparen'>)</span>
338
+ </code></pre>
339
+
340
+ <p>You can then use this key for signing.</p>
341
+
342
+ <h3>OID Mapping</h3>
343
+
344
+ <p>Register one</p>
345
+
346
+ <pre class="code ruby"><code><span class='const'>R509</span><span class='op'>::</span><span class='const'>OidMapper</span><span class='period'>.</span><span class='id identifier rubyid_register'>register</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>1.3.5.6.7.8.3.23.3</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>short_name</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>optional_long_name</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
347
+ </code></pre>
348
+
349
+ <p>Register in batch</p>
350
+
351
+ <pre class="code ruby"><code><span class='const'>R509</span><span class='op'>::</span><span class='const'>OidMapper</span><span class='period'>.</span><span class='id identifier rubyid_batch_register'>batch_register</span><span class='lparen'>(</span><span class='lbracket'>[</span>
352
+ <span class='lbrace'>{</span><span class='symbol'>:oid</span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>1.3.5.6.7.8.3.23.3</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='symbol'>:short_name</span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>short_name</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='symbol'>:long_name</span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>optional_long_name</span><span class='tstring_end'>&quot;</span></span><span class='rbrace'>}</span><span class='comma'>,</span>
353
+ <span class='lbrace'>{</span><span class='symbol'>:oid</span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>1.3.5.6.7.8.3.23.5</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='symbol'>:short_name</span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>another_name</span><span class='tstring_end'>&quot;</span></span><span class='rbrace'>}</span>
354
+ <span class='rbracket'>]</span><span class='rparen'>)</span>
355
+ </code></pre>
356
+
357
+ <h2>Documentation</h2>
358
+
359
+ <p>There is (relatively) complete documentation available for every method and class in r509 available via yardoc. If you installed via gem it should be pre-generated in the doc directory. If you cloned this repo, just type <code>rake yard</code> with the yard gem installed. You will also need the redcarpet and github-markup gems to properly parse the Readme.md.</p>
360
+
361
+ <h2>Thanks to...</h2>
362
+
363
+ <ul>
364
+ <li><a href="https://github.com/sirsean">Sean Schulte</a></li>
365
+ <li><a href="https://github.com/justfalter">Mike Ryan</a></li>
366
+ </ul>
367
+
368
+ <h2>License</h2>
369
+
370
+ <p>See the LICENSE file. Licensed under the Apache 2.0 License.</p>
371
+
372
+ <h1>YAML Config Options</h1>
373
+
374
+ <p>r509 configs are nested hashes of key:values that define the behavior of each CA. See r509.yaml for a full example config.</p>
375
+
376
+ <h2>ca_name</h2>
377
+
378
+ <h3>ca_cert</h3>
379
+
380
+ <p>This hash defines the certificate + key that will be used to sign for the ca_name. Depending on desired configuration various elements are optional. You can even supply just <strong>cert</strong> (for example, if you are using an ocsp_cert hash and only using the configured CA for OCSP responses)</p>
381
+
382
+ <ul>
383
+ <li>cert (cannot use with pkcs12)</li>
384
+ <li>key (cannot use with key)</li>
385
+ <li>engine (optional, cannot be used with key or pkcs12)</li>
386
+ <li>key_name (required when using engine)</li>
387
+ <li>pkcs12 (optional, cannot be used with key or cert)</li>
388
+ <li>password (optional, used for pkcs12 or passworded private key)</li>
389
+ </ul>
390
+
391
+ <h3>ocsp_cert</h3>
392
+
393
+ <p>This hash defines the certificate + key that will be used to sign for OCSP responses. OCSP responses cannot be directly created with r509, but require the ancillary gem <a href="https://github.com/reaperhulk/r509-ocsp-responder">r509-ocsp-responder</a>. This hash is optional and if not provided r509 will automatically use the ca_cert as the OCSP certificate.</p>
394
+
395
+ <ul>
396
+ <li>cert (cannot use with pkcs12)</li>
397
+ <li>key (cannot use with key)</li>
398
+ <li>engine (optional, cannot be used with key or pkcs12)</li>
399
+ <li>key_name (required when using engine)</li>
400
+ <li>pkcs12 (optional, cannot be used with key or cert)</li>
401
+ <li>password (optional, used for pkcs12 or passworded private key)</li>
402
+ </ul>
403
+
404
+ <h3>cdp_location</h3>
405
+
406
+ <p>The CRL distribution point for certificates issued from this CA.</p>
407
+
408
+ <p>Example: &#39;URI:<a href="http://crl.r509.org/myca.crl">http://crl.r509.org/myca.crl</a>&#39;</p>
409
+
410
+ <h3>crl_list</h3>
411
+
412
+ <p>The path on the filesystem of the list of revoked certificates for this CA.</p>
413
+
414
+ <p>Example: &#39;/path/to/my_ca_crl_list.txt&#39;</p>
415
+
416
+ <h3>crl_number</h3>
417
+
418
+ <p>The path on the filesystem of the current CRL number for this CA.</p>
419
+
420
+ <p>Example: &#39;/path/to/my_ca_crl_number.txt&#39;</p>
421
+
422
+ <h3>crl_validity_hours</h3>
423
+
424
+ <p>Integer hours for CRL validity.</p>
425
+
426
+ <h3>ocsp_location</h3>
427
+
428
+ <p>The OCSP AIA extension value for certificates issued from this CA.</p>
429
+
430
+ <p>Example: &#39;URI:<a href="http://ocsp.r509.org">http://ocsp.r509.org</a>&#39;</p>
431
+
432
+ <h3>ocsp_chain</h3>
433
+
434
+ <p>An optional path to a concatenated text file of PEMs that should be attached to OCSP responses</p>
435
+
436
+ <h3>ocsp_validity_hours</h3>
437
+
438
+ <p>Integer hours for OCSP response validity.</p>
439
+
440
+ <h3>ocsp_start_skew_seconds</h3>
441
+
442
+ <p>Integer seconds to skew back the &quot;thisUpdate&quot; field. This prevents issues where the OCSP responder signs a response and the client rejects it because the response is &quot;not yet valid&quot; due to slight clock synchronization problems.</p>
443
+
444
+ <h3>message_digest</h3>
445
+
446
+ <p>String value of the message digest to use for signing (both CRL and certificates). Allowed values are:</p>
447
+
448
+ <ul>
449
+ <li>SHA1 (default)</li>
450
+ <li>SHA256</li>
451
+ <li>SHA512</li>
452
+ <li>MD5 (Don&#39;t use this unless you have a really, really good reason. Even then, you shouldn&#39;t)</li>
453
+ </ul>
454
+
455
+ <h3>profiles</h3>
456
+
457
+ <p>Each CA can have an arbitrary number of issuance profiles (with arbitrary names). For example, a CA named <strong>test_ca</strong> might have 3 issuance profiles: server, email, clientserver. Each of these profiles then has a set of options that define the encoded data in the certificate for that profile. If no profiles are defined the root cannot issue certs, but can still issue CRLs.</p>
458
+
459
+ <h4>basic_constraints</h4>
460
+
461
+ <p>All basic constraints are encoded with the critical bit set to true. In general you should only pass &quot;CA:TRUE&quot; (for an issuing CA) or &quot;CA:FALSE&quot; for everything else with this flag.</p>
462
+
463
+ <h4>key_usage</h4>
464
+
465
+ <p>An array of strings that conform to the OpenSSL naming scheme for available key usage OIDs. TODO: Document whether arbitrary OIDs can be passed here.</p>
466
+
467
+ <ul>
468
+ <li>digitalSignature</li>
469
+ <li>nonRepudiation</li>
470
+ <li>keyEncipherment</li>
471
+ <li>dataEncipherment</li>
472
+ <li>keyAgreement</li>
473
+ <li>keyCertSign</li>
474
+ <li>cRLSign</li>
475
+ <li>encipherOnly</li>
476
+ <li>decipherOnly</li>
477
+ </ul>
478
+
479
+ <h4>extended_key_usage</h4>
480
+
481
+ <p>An array of strings that conform to the OpenSSL naming scheme for available EKU OIDs. The following list of allowed shortnames is taken from the OpenSSL docs. Depending on your OpenSSL version there may be more than this list.</p>
482
+
483
+ <ul>
484
+ <li>serverAuth</li>
485
+ <li>clientAuth</li>
486
+ <li>codeSigning</li>
487
+ <li>emailProtection</li>
488
+ <li>OCSPSigning</li>
489
+ <li>timeStamping</li>
490
+ <li>msCodeInd</li>
491
+ <li>msCodeCom</li>
492
+ <li>msCTLSign</li>
493
+ <li>msSGC</li>
494
+ <li>msEFS</li>
495
+ <li>nsSGC</li>
496
+ </ul>
497
+
498
+ <h4>certificate_policies</h4>
499
+
500
+ <p>An array of arrays containing policy identifiers and CPS URIs. For example:</p>
501
+
502
+ <pre class="code yaml"><code>[ [ &quot;policyIdentifier=2.16.840.1.9999999.1.2.3.4.2&quot;,&quot;CPS.1=http://r509.org/cps&quot; ] ]
503
+ </code></pre>
504
+
505
+ <p>or</p>
506
+
507
+ <pre class="code yaml"><code>[ [&quot;policyIdentifier=2.16.840.1.999999.0&quot;], [ &quot;policyIdentifier=2.16.840.1.9999999.1.2.3.4.2&quot;,&quot;CPS.1=http://r509.org/cps&quot; ] ]
508
+ </code></pre>
509
+
510
+ <h4>subject_item_policy</h4>
511
+
512
+ <p>Hash of required/optional subject items. These must be in OpenSSL shortname format. If subject_item_policy is excluded from the profile then all subject items will be used. If it is included, <strong>only items listed in the policy will be copied to the certificate</strong>.
513
+ Example:</p>
514
+
515
+ <pre class="code yaml"><code>CN : &quot;required&quot;,
516
+ O: &quot;required&quot;,
517
+ OU: &quot;optional&quot;,
518
+ ST: &quot;required&quot;,
519
+ C: &quot;required&quot;,
520
+ L: &quot;required&quot;,
521
+ emailAddress: &quot;optional&quot;
522
+ </code></pre>
523
+
524
+ <p>If you use the R509::OidMapper you can create new shortnames that are allowed within this directive.</p>
525
+ </div></div>
526
+
527
+ <div id="footer">
528
+ Generated on Tue Oct 23 22:48:01 2012 by
529
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
530
+ 0.8.0 (ruby-1.9.3).
531
+ </div>
532
+
533
+ </body>
534
+ </html>