jruby-openssl 0.5.2 → 0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. data/History.txt +27 -0
  2. data/Manifest.txt +100 -0
  3. data/Rakefile +71 -0
  4. data/lib/jopenssl.jar +0 -0
  5. data/lib/jopenssl/version.rb +1 -1
  6. data/lib/openssl/bn.rb +1 -3
  7. data/lib/openssl/cipher.rb +15 -17
  8. data/lib/openssl/digest.rb +1 -3
  9. data/test/cert_with_ec_pk.cer +27 -0
  10. data/test/fixture/ca_path/72fa7371.0 +19 -0
  11. data/test/fixture/ca_path/verisign.pem +19 -0
  12. data/test/fixture/common.pem +48 -0
  13. data/test/fixture/max.pem +29 -0
  14. data/test/fixture/purpose/b70a5bc1.0 +24 -0
  15. data/test/fixture/purpose/ca/PASSWD_OF_CA_KEY_IS_1234 +0 -0
  16. data/test/fixture/purpose/ca/ca_config.rb +37 -0
  17. data/test/fixture/purpose/ca/cacert.pem +24 -0
  18. data/test/fixture/purpose/ca/newcerts/2_cert.pem +19 -0
  19. data/test/fixture/purpose/ca/newcerts/3_cert.pem +19 -0
  20. data/test/fixture/purpose/ca/private/cakeypair.pem +30 -0
  21. data/test/fixture/purpose/ca/serial +1 -0
  22. data/test/fixture/purpose/cacert.pem +24 -0
  23. data/test/fixture/purpose/scripts/gen_cert.rb +127 -0
  24. data/test/fixture/purpose/scripts/gen_csr.rb +50 -0
  25. data/test/fixture/purpose/scripts/init_ca.rb +66 -0
  26. data/test/fixture/purpose/sslclient.pem +19 -0
  27. data/test/fixture/purpose/sslclient/csr.pem +10 -0
  28. data/test/fixture/purpose/sslclient/keypair.pem +15 -0
  29. data/test/fixture/purpose/sslclient/sslclient.pem +19 -0
  30. data/test/fixture/purpose/sslserver.pem +19 -0
  31. data/test/fixture/purpose/sslserver/csr.pem +10 -0
  32. data/test/fixture/purpose/sslserver/keypair.pem +15 -0
  33. data/test/fixture/purpose/sslserver/sslserver.pem +19 -0
  34. data/test/fixture/verisign.pem +19 -0
  35. data/test/fixture/verisign_c3.pem +14 -0
  36. data/test/openssl/test_cipher.rb +22 -0
  37. data/test/openssl/test_pkcs7.rb +1 -0
  38. data/test/openssl/test_ssl.rb +2 -0
  39. data/test/openssl/test_x509ext.rb +21 -0
  40. data/test/openssl/test_x509name.rb +16 -0
  41. data/test/test_cipher.rb +20 -6
  42. data/test/test_integration.rb +43 -4
  43. data/test/test_parse_certificate.rb +20 -0
  44. data/test/test_x509store.rb +155 -0
  45. metadata +37 -3
@@ -0,0 +1,37 @@
1
+ class CAConfig
2
+ BASE_DIR = File.dirname(__FILE__)
3
+ KEYPAIR_FILE = "#{BASE_DIR}/private/cakeypair.pem"
4
+ CERT_FILE = "#{BASE_DIR}/cacert.pem"
5
+ SERIAL_FILE = "#{BASE_DIR}/serial"
6
+ NEW_CERTS_DIR = "#{BASE_DIR}/newcerts"
7
+ NEW_KEYPAIR_DIR = "#{BASE_DIR}/private/keypair_backup"
8
+ CRL_DIR = "#{BASE_DIR}/crl"
9
+
10
+ NAME = [['C', 'JP'], ['O', 'www.ruby-lang.org'], ['OU', 'development']]
11
+ CA_CERT_DAYS = 20 * 365
12
+ CA_RSA_KEY_LENGTH = 2048
13
+
14
+ CERT_DAYS = 19 * 365
15
+ CERT_KEY_LENGTH_MIN = 1024
16
+ CERT_KEY_LENGTH_MAX = 2048
17
+ CDP_LOCATION = nil
18
+ OCSP_LOCATION = nil
19
+
20
+ CRL_FILE = "#{CRL_DIR}/jruby.crl"
21
+ CRL_PEM_FILE = "#{CRL_DIR}/jruby.pem"
22
+ CRL_DAYS = 14
23
+
24
+ PASSWD_CB = Proc.new { |flag|
25
+ print "Enter password: "
26
+ pass = $stdin.gets.chop!
27
+ # when the flag is true, this passphrase
28
+ # will be used to perform encryption; otherwise it will
29
+ # be used to perform decryption.
30
+ if flag
31
+ print "Verify password: "
32
+ pass2 = $stdin.gets.chop!
33
+ raise "verify failed." if pass != pass2
34
+ end
35
+ pass
36
+ }
37
+ end
@@ -0,0 +1,24 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEADCCAuigAwIBAgIBATANBgkqhkiG9w0BAQUFADBMMQswCQYDVQQGEwJKUDEa
3
+ MBgGA1UECgwRd3d3LnJ1YnktbGFuZy5vcmcxFDASBgNVBAsMC2RldmVsb3BtZW50
4
+ MQswCQYDVQQDDAJDQTAeFw0wOTExMTkxMDI5MjBaFw0yOTExMTQxMDI5MjBaMEwx
5
+ CzAJBgNVBAYTAkpQMRowGAYDVQQKDBF3d3cucnVieS1sYW5nLm9yZzEUMBIGA1UE
6
+ CwwLZGV2ZWxvcG1lbnQxCzAJBgNVBAMMAkNBMIIBIjANBgkqhkiG9w0BAQEFAAOC
7
+ AQ8AMIIBCgKCAQEA2nXhXZxXUs1Sfxqi8sReyzPHRcAHQM9RqDAGG9Nt1zYrLXwg
8
+ MmUhOr4yBeW2KAxJGxdRQSzI38jyT6mrDRBpTl/OeU9zBG4p6AtFGkoMnRvUonB3
9
+ CvgYJXhmrFjnHn34JNaRSORjaZDBmI9/fMGvaYndEM3wJ2b3jEOeizDIG60kZxA6
10
+ XQ+X7ral+aABsjomubvjEQ9dlcDhQlssKjbjaN3NZ/kL/i/75jc6rzT05XYYkj+Z
11
+ 9rPRfT+HH3c5EYLtxcRTEHVWXMC8/of7oOFgZwwI3Cx9/v1s2Z6gdJ8J0kIkEoUL
12
+ ziYsLIOmVB2tx0rKkmeivJB4PTM5QyHb7d1xUwIDAQABo4HsMIHpMA8GA1UdEwEB
13
+ /wQFMAMBAf8wMQYJYIZIAYb4QgENBCQWIlJ1YnkvT3BlblNTTCBHZW5lcmF0ZWQg
14
+ Q2VydGlmaWNhdGUwHQYDVR0OBBYEFBOZGvHkAfn+0Ct33rQ6tW2UmF5TMA4GA1Ud
15
+ DwEB/wQEAwIBBjB0BgNVHSMEbTBrgBQTmRrx5AH5/tArd960OrVtlJheU6FQpE4w
16
+ TDELMAkGA1UEBhMCSlAxGjAYBgNVBAoMEXd3dy5ydWJ5LWxhbmcub3JnMRQwEgYD
17
+ VQQLDAtkZXZlbG9wbWVudDELMAkGA1UEAwwCQ0GCAQEwDQYJKoZIhvcNAQEFBQAD
18
+ ggEBACfgSl3pA+e3JyjgS/zscaJHHNDwXIIoH0KY6pcrZnl7Zh8CW+Gdba621Lek
19
+ aAy0YhAAM9bF87QZG1+sL7B2H1oSTt7F67SwQfq079oNWjhEdV5dxBKk6XaU0R31
20
+ KXSsmLR4pMxcFdPzGM0FTiSj9FNKk2pydVySsa5jJeG0qvXVFMqsRUUwklQHl9Kx
21
+ 9GZiknt4PEGj/ThUwarhRbRjV5z7ZxXKexkangBlRWPX7TjvlpZPgLzAODG4fiRW
22
+ ZUo8Ng7QolTJuPAhlVxhdi9n5hItm6mt21RTpQcP49KoGe8x+T4EzPO0PPdCMliD
23
+ fH3udDO+bq2F8H4ts6ZJAYWFo8U=
24
+ -----END CERTIFICATE-----
@@ -0,0 +1,19 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDBjCCAe6gAwIBAgIBAjANBgkqhkiG9w0BAQUFADBMMQswCQYDVQQGEwJKUDEa
3
+ MBgGA1UECgwRd3d3LnJ1YnktbGFuZy5vcmcxFDASBgNVBAsMC2RldmVsb3BtZW50
4
+ MQswCQYDVQQDDAJDQTAeFw0wOTExMTkxMDMwMTdaFw0yODExMTQxMDMwMTdaMD0x
5
+ CzAJBgNVBAYTAkpQMRowGAYDVQQKDBF3d3cucnVieS1sYW5nLm9yZzESMBAGA1UE
6
+ AwwJc3Nsc2VydmVyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDgYsazavfR
7
+ a72yK4qfnIjOrDT9Uv2ToL4swbE86PXY5N+YvUig3fVmNJo72rT5JlAODs+MtJJU
8
+ aJ8HsczlGdrhjTWyT/0fyoY/rC4mi5UFASBCbaoaviDPgbhI6ehBY6d5vEYQOW79
9
+ fL95KIa+OyGzUNYy+EkSxJmvt/8EJYtqIwIDAQABo4GFMIGCMAwGA1UdEwEB/wQC
10
+ MAAwMQYJYIZIAYb4QgENBCQWIlJ1YnkvT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlm
11
+ aWNhdGUwHQYDVR0OBBYEFJsUyGU/R4muSKVIeckJElcBNbipMAsGA1UdDwQEAwIF
12
+ oDATBgNVHSUEDDAKBggrBgEFBQcDATANBgkqhkiG9w0BAQUFAAOCAQEAAc49qdDC
13
+ TzFoWy794TYEx/uSAFQPMxp/dktYuMvtMSqhOfkDAaX7YFAD40R9tQljm6Vb7uEB
14
+ afAecveSyBN2EPZas8NdohJJcTT/pu39E9iMuvAoxz+R8RV7S/RikFOtoet79owa
15
+ 6lnD3893tz5RR5BloRX7yRii87U5LUdxd3CvEmA7ycNTO8ZEaAuLDitsTMxhPiIJ
16
+ DeGW5L8DCyiWuDt9K6S13XdnDxTvYUmafVPU59BncdSoY/3BebappMzDM8QM0yCZ
17
+ GWh7ItY4sncMur1fc9ZuSsyplT3d3jysmVXolz2khxboMPVBoRSTtgBOn1PSsVma
18
+ FWULbrbYBK5Cqg==
19
+ -----END CERTIFICATE-----
@@ -0,0 +1,19 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDEDCCAfigAwIBAgIBAzANBgkqhkiG9w0BAQUFADBMMQswCQYDVQQGEwJKUDEa
3
+ MBgGA1UECgwRd3d3LnJ1YnktbGFuZy5vcmcxFDASBgNVBAsMC2RldmVsb3BtZW50
4
+ MQswCQYDVQQDDAJDQTAeFw0wOTExMTkxMDMwMjdaFw0yODExMTQxMDMwMjdaMD0x
5
+ CzAJBgNVBAYTAkpQMRowGAYDVQQKDBF3d3cucnVieS1sYW5nLm9yZzESMBAGA1UE
6
+ AwwJc3NsY2xpZW50MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDgemBPByEo
7
+ KbxaYnHXJxslyYsdWWCKf6j2mVIoxzC0b7W4TS5loBzOkZ05rkuapZ7O5flSMjtH
8
+ 5NMJ2h7/zsgK5XBkNRCPFK+8HMXVFdSs+euKY+2qE01P0NIuCrkvKjJgsrXdy3sG
9
+ 2UVUEoYEt5MHDR6aBL0Km+nVKc6T7O+KtQIDAQABo4GPMIGMMAwGA1UdEwEB/wQC
10
+ MAAwMQYJYIZIAYb4QgENBCQWIlJ1YnkvT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlm
11
+ aWNhdGUwHQYDVR0OBBYEFOFnq0r6adftxM/7aApl0DDrLTNWMAsGA1UdDwQEAwIF
12
+ 4DAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwDQYJKoZIhvcNAQEFBQAD
13
+ ggEBACiRGC9KvUP2PaU7JmcIzJHMJtz0mUsO8KJeFWmBCSkfQErF3egOzE47WcRM
14
+ 0lGy0e4fjJB3at/O2V4RgwkFpsBpGXv9LJ5ZVXkEu9PwzwLTGZ4VfSPNIXgse1lK
15
+ 9EYOXgL8XhL7c9XPJLRFOWt6Odwp1VjQ2RqkpYLYnsHZam+5gsRd5K2yS0VO8A1Q
16
+ otxH1D4evwpoSAaRHSff71Qh7046g2jGvCvdEVqBXuAoOuY8IRvf6YpTKEcPuOOo
17
+ t7h5kLIVKuG4/AikVZ62Xh7DjdRFxy/Pxg3uIhrvkHkG8QtEFgBBMHoQR6iSGf6N
18
+ 1SNrs9tpu1oqTSzoKFG72BsEA6M=
19
+ -----END CERTIFICATE-----
@@ -0,0 +1,30 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ Proc-Type: 4,ENCRYPTED
3
+ DEK-Info: DES-EDE3-CBC,1381BA5304F6971E
4
+
5
+ NmDiHjP3Kn3gG7q0oG8n5nyCM8wp5PYeEpuwrZmnNzpdsTTxpPV2Px8wy9EBrR4k
6
+ SeZufUHA7T+zOLc1mSGMm+LOSSV2CMcUnby+yVRuV7CTtw7AwD+et7asff/HU1v6
7
+ GE4SbX0tnZskiAR00zZTN/C17w27HIG7qNHrEjCng/S4fKFVNe6riQbmQqvykYQS
8
+ 8bZsQzzlB8e8kxNV5EDvYag3oevgY7RpIWUXEwTHd46o+8GsExuhs+8WpiO1az1D
9
+ vu0u0MpO5t6PKyafp5vdiLTiwoY8VUdCF627FbyCWFkSuRbYxXNiRZzIvgwtZS7d
10
+ wHOr5aVA2ROli2S7W5Mmx00tww05mPdzQbk5q6ZMxD+lK9bIuHEGwBY0IaWjkJtt
11
+ a0RyBilLatVE9866D40dmNKA4mzAqtADdq6vwzoEqd7kVdwjdk7EMvaZgACrBypH
12
+ NfadJ+HG2TW+4gnZLG60y6YaMPXAbObCUHCUYVhJe/E4mGdSkKOGgiQks9hT448T
13
+ +/YBt2TqCq3UQU2rfxLVV6AlD/tywTwPTb0Leu40oTNEQyJ9aaQXmcZHZlDWI+Sl
14
+ xdvGule84RenlV+GnC5UlBxUopTKbVSI7tw10grJtz5/TWx7ubOQ4pCNHzxksQH7
15
+ YqygX5F6jlR6GbZFYUozNf57Frh9zUmhc6YWGFeTz1uc6rRqTCrKcyqvRD9QCYPY
16
+ P+8MhvztbbYOr+XRStVeuDXzMwS6/HUrlPTt0IvO3Hq9dFDaTg1bW4mzgdKuYotV
17
+ VF5DRenkF8lalTFpMppNsfpldazrZ8VvW5qRwbKF4mu7AWsBh9IpZMW15LtI7fUA
18
+ L+JQO8aBUq6gyXTzaJxx8kxpdcIRtubOIultptj2m/XPXNNFSsI5DMv7V5jh58sC
19
+ ju2RwxwivcWh1XtQxc4RNzvP3/Ek85at+cO9Q74Tu4f8alJZiWT51PZRwaucdQ8y
20
+ rYT32rsqoWw1MvkDDENHbEt1QZ7AFmO3zFeGYXbPNHoi2gKzCo7xQtCm+QXQAh7B
21
+ 87KoKqwS9BO9QA/F+htVW9mbA+Yc5a2vcykxYbGlGqyMleI8cU5AeIbGoZdyYaun
22
+ cDX/NtyV3HGPD5aHUPcz/sP7KAbdLzwh72CzRqQQo8yxOmQEWdd7W8jtxt0on2cs
23
+ AXj59c9jKRJl5XlXMQO+VWnWO04bWxs8PAgop5Y4ePY766/mL1bAr02kdI6DJ9mx
24
+ Opmpqk4gPZpnksnCQWJelPPYad0S49QxbOIWf5bI9FMi+6cgVh76iC5nMGVGI+gw
25
+ lS64zEHhSRXuAC9Nsw5d+owc3aCG15DzUjpEBhDJ8EYKP9kgiJU0rnqPqGrriyrb
26
+ f6kNOisGvAbI3RldVDLvvZbZEffPu60yA1rP7XaBRPn4K3g+3KTiEcn00wwJaoc3
27
+ rddzmUCbx6fOluN+34BiPdJzHBZsROEvCcT4KGw1/nZIp/GgX3f3nPW40go2RLFP
28
+ THQ5L0tuEvyhtJWaiLzjoZ3kCiwWZUzUwYCSfP9raVVXAxLoS4wU+qqKPl6/AaLI
29
+ NDgIDJtZ0hrnptZuCkBUzVGQzxpMr8IVK/zQDq8uSXI53heZhLQoww==
30
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1 @@
1
+ 0004
@@ -0,0 +1,24 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEADCCAuigAwIBAgIBATANBgkqhkiG9w0BAQUFADBMMQswCQYDVQQGEwJKUDEa
3
+ MBgGA1UECgwRd3d3LnJ1YnktbGFuZy5vcmcxFDASBgNVBAsMC2RldmVsb3BtZW50
4
+ MQswCQYDVQQDDAJDQTAeFw0wOTExMTkxMDI5MjBaFw0yOTExMTQxMDI5MjBaMEwx
5
+ CzAJBgNVBAYTAkpQMRowGAYDVQQKDBF3d3cucnVieS1sYW5nLm9yZzEUMBIGA1UE
6
+ CwwLZGV2ZWxvcG1lbnQxCzAJBgNVBAMMAkNBMIIBIjANBgkqhkiG9w0BAQEFAAOC
7
+ AQ8AMIIBCgKCAQEA2nXhXZxXUs1Sfxqi8sReyzPHRcAHQM9RqDAGG9Nt1zYrLXwg
8
+ MmUhOr4yBeW2KAxJGxdRQSzI38jyT6mrDRBpTl/OeU9zBG4p6AtFGkoMnRvUonB3
9
+ CvgYJXhmrFjnHn34JNaRSORjaZDBmI9/fMGvaYndEM3wJ2b3jEOeizDIG60kZxA6
10
+ XQ+X7ral+aABsjomubvjEQ9dlcDhQlssKjbjaN3NZ/kL/i/75jc6rzT05XYYkj+Z
11
+ 9rPRfT+HH3c5EYLtxcRTEHVWXMC8/of7oOFgZwwI3Cx9/v1s2Z6gdJ8J0kIkEoUL
12
+ ziYsLIOmVB2tx0rKkmeivJB4PTM5QyHb7d1xUwIDAQABo4HsMIHpMA8GA1UdEwEB
13
+ /wQFMAMBAf8wMQYJYIZIAYb4QgENBCQWIlJ1YnkvT3BlblNTTCBHZW5lcmF0ZWQg
14
+ Q2VydGlmaWNhdGUwHQYDVR0OBBYEFBOZGvHkAfn+0Ct33rQ6tW2UmF5TMA4GA1Ud
15
+ DwEB/wQEAwIBBjB0BgNVHSMEbTBrgBQTmRrx5AH5/tArd960OrVtlJheU6FQpE4w
16
+ TDELMAkGA1UEBhMCSlAxGjAYBgNVBAoMEXd3dy5ydWJ5LWxhbmcub3JnMRQwEgYD
17
+ VQQLDAtkZXZlbG9wbWVudDELMAkGA1UEAwwCQ0GCAQEwDQYJKoZIhvcNAQEFBQAD
18
+ ggEBACfgSl3pA+e3JyjgS/zscaJHHNDwXIIoH0KY6pcrZnl7Zh8CW+Gdba621Lek
19
+ aAy0YhAAM9bF87QZG1+sL7B2H1oSTt7F67SwQfq079oNWjhEdV5dxBKk6XaU0R31
20
+ KXSsmLR4pMxcFdPzGM0FTiSj9FNKk2pydVySsa5jJeG0qvXVFMqsRUUwklQHl9Kx
21
+ 9GZiknt4PEGj/ThUwarhRbRjV5z7ZxXKexkangBlRWPX7TjvlpZPgLzAODG4fiRW
22
+ ZUo8Ng7QolTJuPAhlVxhdi9n5hItm6mt21RTpQcP49KoGe8x+T4EzPO0PPdCMliD
23
+ fH3udDO+bq2F8H4ts6ZJAYWFo8U=
24
+ -----END CERTIFICATE-----
@@ -0,0 +1,127 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'openssl'
4
+ require 'ca_config'
5
+ require 'fileutils'
6
+ require 'getopts'
7
+
8
+ include OpenSSL
9
+
10
+ def usage
11
+ myname = File::basename($0)
12
+ $stderr.puts "Usage: #{myname} [--type (client|server|ca|ocsp)] [--out certfile] csr_file"
13
+ exit
14
+ end
15
+
16
+ getopts nil, 'type:client', 'out:', 'force'
17
+
18
+ cert_type = $OPT_type
19
+ out_file = $OPT_out || 'cert.pem'
20
+ csr_file = ARGV.shift or usage
21
+ ARGV.empty? or usage
22
+
23
+ csr = X509::Request.new(File.open(csr_file).read)
24
+ unless csr.verify(csr.public_key)
25
+ raise "CSR sign verification failed."
26
+ end
27
+ p csr.public_key
28
+ if csr.public_key.n.num_bits < CAConfig::CERT_KEY_LENGTH_MIN
29
+ raise "Key length too short"
30
+ end
31
+ if csr.public_key.n.num_bits > CAConfig::CERT_KEY_LENGTH_MAX
32
+ raise "Key length too long"
33
+ end
34
+ if csr.subject.to_a[0, CAConfig::NAME.size] != CAConfig::NAME
35
+ unless $OPT_force
36
+ p csr.subject.to_a
37
+ p CAConfig::NAME
38
+ raise "DN does not match"
39
+ end
40
+ end
41
+
42
+ # Only checks signature here. You must verify CSR according to your CP/CPS.
43
+
44
+ $stdout.sync = true
45
+
46
+ # CA setup
47
+
48
+ ca_file = CAConfig::CERT_FILE
49
+ puts "Reading CA cert (from #{ca_file})"
50
+ ca = X509::Certificate.new(File.read(ca_file))
51
+
52
+ ca_keypair_file = CAConfig::KEYPAIR_FILE
53
+ puts "Reading CA keypair (from #{ca_keypair_file})"
54
+ ca_keypair = PKey::RSA.new(File.read(ca_keypair_file), &CAConfig::PASSWD_CB)
55
+
56
+ serial = File.open(CAConfig::SERIAL_FILE, "r").read.chomp.hex
57
+ File.open(CAConfig::SERIAL_FILE, "w") do |f|
58
+ f << sprintf("%04X", serial + 1)
59
+ end
60
+
61
+ # Generate new cert
62
+
63
+ cert = X509::Certificate.new
64
+ from = Time.now # + 30 * 60 # Wait 30 minutes.
65
+ cert.subject = csr.subject
66
+ cert.issuer = ca.subject
67
+ cert.not_before = from
68
+ cert.not_after = from + CAConfig::CERT_DAYS * 24 * 60 * 60
69
+ cert.public_key = csr.public_key
70
+ cert.serial = serial
71
+ cert.version = 2 # X509v3
72
+
73
+ basic_constraint = nil
74
+ key_usage = []
75
+ ext_key_usage = []
76
+ case cert_type
77
+ when "ca"
78
+ basic_constraint = "CA:TRUE"
79
+ key_usage << "cRLSign" << "keyCertSign"
80
+ when "terminalsubca"
81
+ basic_constraint = "CA:TRUE,pathlen:0"
82
+ key_usage << "cRLSign" << "keyCertSign"
83
+ when "server"
84
+ basic_constraint = "CA:FALSE"
85
+ key_usage << "digitalSignature" << "keyEncipherment"
86
+ ext_key_usage << "serverAuth"
87
+ when "ocsp"
88
+ basic_constraint = "CA:FALSE"
89
+ key_usage << "nonRepudiation" << "digitalSignature"
90
+ ext_key_usage << "serverAuth" << "OCSPSigning"
91
+ when "client"
92
+ basic_constraint = "CA:FALSE"
93
+ key_usage << "nonRepudiation" << "digitalSignature" << "keyEncipherment"
94
+ ext_key_usage << "clientAuth" << "emailProtection"
95
+ else
96
+ raise "unknonw cert type \"#{cert_type}\" is specified."
97
+ end
98
+
99
+ ef = X509::ExtensionFactory.new
100
+ ef.subject_certificate = cert
101
+ ef.issuer_certificate = ca
102
+ ex = []
103
+ ex << ef.create_extension("basicConstraints", basic_constraint, true)
104
+ ex << ef.create_extension("nsComment","Ruby/OpenSSL Generated Certificate")
105
+ ex << ef.create_extension("subjectKeyIdentifier", "hash")
106
+ #ex << ef.create_extension("nsCertType", "client,email")
107
+ ex << ef.create_extension("keyUsage", key_usage.join(",")) unless key_usage.empty?
108
+ #ex << ef.create_extension("authorityKeyIdentifier", "keyid:always,issuer:always")
109
+ #ex << ef.create_extension("authorityKeyIdentifier", "keyid:always")
110
+ ex << ef.create_extension("extendedKeyUsage", ext_key_usage.join(",")) unless ext_key_usage.empty?
111
+
112
+ ex << ef.create_extension("crlDistributionPoints", CAConfig::CDP_LOCATION) if CAConfig::CDP_LOCATION
113
+ ex << ef.create_extension("authorityInfoAccess", "OCSP;" << CAConfig::OCSP_LOCATION) if CAConfig::OCSP_LOCATION
114
+ cert.extensions = ex
115
+ cert.sign(ca_keypair, OpenSSL::Digest::SHA1.new)
116
+
117
+ # For backup
118
+
119
+ cert_file = CAConfig::NEW_CERTS_DIR + "/#{cert.serial}_cert.pem"
120
+ File.open(cert_file, "w", 0644) do |f|
121
+ f << cert.to_pem
122
+ end
123
+
124
+ puts "Writing cert.pem..."
125
+ FileUtils.copy(cert_file, out_file)
126
+
127
+ puts "DONE. (Generated certificate for '#{cert.subject}')"
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'getopts'
4
+ require 'openssl'
5
+
6
+ include OpenSSL
7
+
8
+ def usage
9
+ myname = File::basename($0)
10
+ $stderr.puts <<EOS
11
+ Usage: #{myname} [--key keypair_file] name
12
+ name ... ex. /C=JP/O=RRR/OU=CA/CN=NaHi/emailAddress=nahi@example.org
13
+ EOS
14
+ exit
15
+ end
16
+
17
+ getopts nil, "key:", "csrout:", "keyout:"
18
+ keypair_file = $OPT_key
19
+ csrout = $OPT_csrout || "csr.pem"
20
+ keyout = $OPT_keyout || "keypair.pem"
21
+
22
+ $stdout.sync = true
23
+ name_str = ARGV.shift or usage()
24
+ p name_str
25
+ name = X509::Name.parse(name_str)
26
+
27
+ keypair = nil
28
+ if keypair_file
29
+ keypair = PKey::RSA.new(File.open(keypair_file).read)
30
+ else
31
+ keypair = PKey::RSA.new(1024) { putc "." }
32
+ puts
33
+ puts "Writing #{keyout}..."
34
+ File.open(keyout, "w", 0400) do |f|
35
+ f << keypair.to_pem
36
+ end
37
+ end
38
+
39
+ puts "Generating CSR for #{name_str}"
40
+
41
+ req = X509::Request.new
42
+ req.version = 0
43
+ req.subject = name
44
+ req.public_key = keypair.public_key
45
+ req.sign(keypair, OpenSSL::Digest::MD5.new)
46
+
47
+ puts "Writing #{csrout}..."
48
+ File.open(csrout, "w") do |f|
49
+ f << req.to_pem
50
+ end
@@ -0,0 +1,66 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'openssl'
4
+ require 'ca_config'
5
+
6
+ include OpenSSL
7
+
8
+ $stdout.sync = true
9
+
10
+ cn = ARGV.shift || 'CA'
11
+
12
+ unless FileTest.exist?('private')
13
+ Dir.mkdir('private', 0700)
14
+ end
15
+ unless FileTest.exist?('newcerts')
16
+ Dir.mkdir('newcerts')
17
+ end
18
+ unless FileTest.exist?('crl')
19
+ Dir.mkdir('crl')
20
+ end
21
+ unless FileTest.exist?('serial')
22
+ File.open('serial', 'w') do |f|
23
+ f << '2'
24
+ end
25
+ end
26
+
27
+ print "Generating CA keypair: "
28
+ keypair = PKey::RSA.new(CAConfig::CA_RSA_KEY_LENGTH) { putc "." }
29
+ putc "\n"
30
+
31
+ now = Time.now
32
+ cert = X509::Certificate.new
33
+ name = CAConfig::NAME.dup << ['CN', cn]
34
+ cert.subject = cert.issuer = X509::Name.new(name)
35
+ cert.not_before = now
36
+ cert.not_after = now + CAConfig::CA_CERT_DAYS * 24 * 60 * 60
37
+ cert.public_key = keypair.public_key
38
+ cert.serial = 0x1
39
+ cert.version = 2 # X509v3
40
+
41
+ key_usage = ["cRLSign", "keyCertSign"]
42
+ ef = X509::ExtensionFactory.new
43
+ ef.subject_certificate = cert
44
+ ef.issuer_certificate = cert # we needed subjectKeyInfo inside, now we have it
45
+ ext1 = ef.create_extension("basicConstraints","CA:TRUE", true)
46
+ ext2 = ef.create_extension("nsComment","Ruby/OpenSSL Generated Certificate")
47
+ ext3 = ef.create_extension("subjectKeyIdentifier", "hash")
48
+ ext4 = ef.create_extension("keyUsage", key_usage.join(","), true)
49
+ cert.extensions = [ext1, ext2, ext3, ext4]
50
+ ext0 = ef.create_extension("authorityKeyIdentifier", "keyid:always,issuer:always")
51
+ cert.add_extension(ext0)
52
+ cert.sign(keypair, OpenSSL::Digest::SHA1.new)
53
+
54
+ keypair_file = CAConfig::KEYPAIR_FILE
55
+ puts "Writing keypair."
56
+ File.open(keypair_file, "w", 0400) do |f|
57
+ f << keypair.export(Cipher::DES.new(:EDE3, :CBC), &CAConfig::PASSWD_CB)
58
+ end
59
+
60
+ cert_file = CAConfig::CERT_FILE
61
+ puts "Writing #{cert_file}."
62
+ File.open(cert_file, "w", 0644) do |f|
63
+ f << cert.to_pem
64
+ end
65
+
66
+ puts "DONE. (Generated certificate for '#{cert.subject}')"
@@ -0,0 +1,19 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDEDCCAfigAwIBAgIBAzANBgkqhkiG9w0BAQUFADBMMQswCQYDVQQGEwJKUDEa
3
+ MBgGA1UECgwRd3d3LnJ1YnktbGFuZy5vcmcxFDASBgNVBAsMC2RldmVsb3BtZW50
4
+ MQswCQYDVQQDDAJDQTAeFw0wOTExMTkxMDMwMjdaFw0yODExMTQxMDMwMjdaMD0x
5
+ CzAJBgNVBAYTAkpQMRowGAYDVQQKDBF3d3cucnVieS1sYW5nLm9yZzESMBAGA1UE
6
+ AwwJc3NsY2xpZW50MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDgemBPByEo
7
+ KbxaYnHXJxslyYsdWWCKf6j2mVIoxzC0b7W4TS5loBzOkZ05rkuapZ7O5flSMjtH
8
+ 5NMJ2h7/zsgK5XBkNRCPFK+8HMXVFdSs+euKY+2qE01P0NIuCrkvKjJgsrXdy3sG
9
+ 2UVUEoYEt5MHDR6aBL0Km+nVKc6T7O+KtQIDAQABo4GPMIGMMAwGA1UdEwEB/wQC
10
+ MAAwMQYJYIZIAYb4QgENBCQWIlJ1YnkvT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlm
11
+ aWNhdGUwHQYDVR0OBBYEFOFnq0r6adftxM/7aApl0DDrLTNWMAsGA1UdDwQEAwIF
12
+ 4DAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwDQYJKoZIhvcNAQEFBQAD
13
+ ggEBACiRGC9KvUP2PaU7JmcIzJHMJtz0mUsO8KJeFWmBCSkfQErF3egOzE47WcRM
14
+ 0lGy0e4fjJB3at/O2V4RgwkFpsBpGXv9LJ5ZVXkEu9PwzwLTGZ4VfSPNIXgse1lK
15
+ 9EYOXgL8XhL7c9XPJLRFOWt6Odwp1VjQ2RqkpYLYnsHZam+5gsRd5K2yS0VO8A1Q
16
+ otxH1D4evwpoSAaRHSff71Qh7046g2jGvCvdEVqBXuAoOuY8IRvf6YpTKEcPuOOo
17
+ t7h5kLIVKuG4/AikVZ62Xh7DjdRFxy/Pxg3uIhrvkHkG8QtEFgBBMHoQR6iSGf6N
18
+ 1SNrs9tpu1oqTSzoKFG72BsEA6M=
19
+ -----END CERTIFICATE-----
@@ -0,0 +1,10 @@
1
+ -----BEGIN CERTIFICATE REQUEST-----
2
+ MIIBfDCB5gIBADA9MQswCQYDVQQGEwJKUDEaMBgGA1UECgwRd3d3LnJ1YnktbGFu
3
+ Zy5vcmcxEjAQBgNVBAMMCXNzbGNsaWVudDCBnzANBgkqhkiG9w0BAQEFAAOBjQAw
4
+ gYkCgYEA4HpgTwchKCm8WmJx1ycbJcmLHVlgin+o9plSKMcwtG+1uE0uZaAczpGd
5
+ Oa5LmqWezuX5UjI7R+TTCdoe/87ICuVwZDUQjxSvvBzF1RXUrPnrimPtqhNNT9DS
6
+ Lgq5LyoyYLK13ct7BtlFVBKGBLeTBw0emgS9Cpvp1SnOk+zvirUCAwEAAaAAMA0G
7
+ CSqGSIb3DQEBBAUAA4GBAAg7mWW/hU/fBNLxYVoBRGjpgYKTipRieZ9UDxsxu5O5
8
+ DpLbM/DWydzD0nWDt3zSxG4tCwgEL7gOK6rQz3D+b3BkFGSeQ5AQXjxaDurQoLdR
9
+ OQccN93zAeDb0vBADN/90thJ7osiX8VKG6vUHHcWhA26hzaARSHcLPRR8TeTFFb6
10
+ -----END CERTIFICATE REQUEST-----
@@ -0,0 +1,15 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIICXAIBAAKBgQDgemBPByEoKbxaYnHXJxslyYsdWWCKf6j2mVIoxzC0b7W4TS5l
3
+ oBzOkZ05rkuapZ7O5flSMjtH5NMJ2h7/zsgK5XBkNRCPFK+8HMXVFdSs+euKY+2q
4
+ E01P0NIuCrkvKjJgsrXdy3sG2UVUEoYEt5MHDR6aBL0Km+nVKc6T7O+KtQIDAQAB
5
+ AoGABfvdI14qSRrLtZEYPccCF0DHH5IpW6fJhkFSClo89yJfMrmD+huJiQwip834
6
+ n/e4QwWoXsOOBv2XjpSs7N7DQFJNfZ3ivRHyEOlHYgiH2m3hOpe/47sbgvB4z7li
7
+ SPGV6oV2BBafc+yDof3vWLX2BMmxvQKB6aJ7DUjSsc7SR2ECQQD+0m+Q03AynhST
8
+ 9ZSOnHt9mUMykeNuPXfX2oeQ1LXtpIQ9Zco/Bl9fWr94ghygAy8tsc4gtGQj+74G
9
+ GcGGcBydAkEA4YQHyGGdZAb6bH0esNpE3hyTiqzjEshTpvF3jkKAlRU+4DS9cBhB
10
+ fcqPrsYetIrl1fgySLdNK3vTdS8WduWu+QJBAN5u5JIf7uVQVhgdm3KtJ6KoQR8I
11
+ d+VH5K/YAtQqyS/KluBdVSCUuHWs6kwQD1qhzPHvLkYgEPXUDriWjPaEMIUCQFf1
12
+ wXtc56DOP/r0ynW8jMP9bWbXjDIVRNuGr1Ujhzee88lLiOAh9dl0mppW2D8fNgpB
13
+ JovKQyVExPOeDCsP5zECQBoXPjAvdLm1BrRhQkvtX7Fkk2l54CxoKz7yBHwNWD7e
14
+ hKa0riKKq3z+tzzfOkgFdNf3aTZyL7cfBALZJdfiLhA=
15
+ -----END RSA PRIVATE KEY-----