bullion 0.11.0 → 0.11.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 95d9b8437f39397499aaa73d1b9abf932930ab46a29ac5f08d5ab2533b0c0b83
4
- data.tar.gz: 78ca06dc463ffffd5e274bee516196d8cbaefe759b413fa5670fedc247c7c9a8
3
+ metadata.gz: 8821e563a9452dbd524f1bdfbd2f944ee4a3d0c071e57bab6d5f9b2c61e18555
4
+ data.tar.gz: d31913ae560676de68a57ea6aa308126a6d3c92c7a3da69d4d882e032ed56196
5
5
  SHA512:
6
- metadata.gz: '02358422a89125d538c4eb8b5c16d875121525658c11988209cc3bd8581c4cf8a7782d37a70ae2498a3d24e4e28015320d65e2d17285e14dce9f94ea09d69063'
7
- data.tar.gz: 6d927f92fdd653b044bff00f9683f57a026e1cbd504867dd89b1061cbe92219f0da11612af700d6044c90d99accb588ba19e517875547fe039173683245517e8
6
+ metadata.gz: 4bcabcb78421e92a48fbd5485631de98bee3bf0d4452ba5d9c08eb04d34ac171934b073e0a441b5dc95aeeb353765a5445188ca7011b98d3e2f376d130aaf2d4
7
+ data.tar.gz: 5541be539b018f62d1e466e51ada7985f5e37ee460eb98c4e344f79c443aa60fa3f8b2bf1d26d169a15c0b8efef38c7523c4023a416436e85654b585a5fcae6c
@@ -1,3 +1,3 @@
1
1
  {
2
- ".": "0.11.0"
2
+ ".": "0.11.1"
3
3
  }
data/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.11.1](https://github.com/jgnagy/bullion/compare/bullion/v0.11.0...bullion/v0.11.1) (2025-08-24)
4
+
5
+
6
+ ### Features
7
+
8
+ * add support for ECDSA CAs ([49b752e](https://github.com/jgnagy/bullion/commit/49b752ef6fde2b0543b59fb1c5977073f21b6731))
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * improve detection of SANS for cert-manager ([605f80d](https://github.com/jgnagy/bullion/commit/605f80d97135727ab9a962d6c3078b2b4a74b533))
14
+ * loading required bigdecimal gem ([98d1668](https://github.com/jgnagy/bullion/commit/98d1668da600bba890dd0eb035af4a363fa79eef))
15
+
3
16
  ## [0.11.0](https://github.com/jgnagy/bullion/compare/bullion/v0.10.3...bullion/v0.11.0) (2025-08-23)
4
17
 
5
18
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- bullion (0.11.0)
4
+ bullion (0.11.1)
5
5
  benchmark (~> 0.4)
6
6
  dry-configurable (~> 1.1)
7
7
  httparty (~> 0.21)
data/Rakefile CHANGED
@@ -62,6 +62,7 @@ end
62
62
 
63
63
  require "openssl"
64
64
  require "sqlite3"
65
+ require "bigdecimal"
65
66
  require "trilogy"
66
67
  require "sinatra/activerecord/rake"
67
68
 
@@ -119,13 +119,13 @@ module Bullion
119
119
  csr_attrs = extract_csr_attrs(csr)
120
120
  csr_sans = extract_csr_sans(csr_attrs)
121
121
  csr_domains = extract_csr_domains(csr_sans)
122
- csr_cn = cn_from_csr(csr)
122
+ csr_cn = cn_from_csr(csr) || csr_domains.first
123
123
 
124
124
  # Make sure the CSR has a valid public key
125
125
  raise Bullion::Acme::Errors::BadCsr unless csr.verify(csr.public_key)
126
126
 
127
127
  return false unless order.ready_status?
128
- raise Bullion::Acme::Errors::BadCsr unless csr_domains.include?(csr_cn)
128
+ raise Bullion::Acme::Errors::BadCsr if csr_cn && !csr_domains.include?(csr_cn)
129
129
  raise Bullion::Acme::Errors::BadCsr unless csr_domains.sort == order.domains.sort
130
130
 
131
131
  true
@@ -127,9 +127,7 @@ module Bullion
127
127
  )
128
128
 
129
129
  # Alternate Names
130
- cn = cn_from_csr(csr)
131
- existing_sans = filter_sans(csr_sans(csr))
132
- valid_alts = (["DNS:#{cn}"] + [*existing_sans]).uniq
130
+ valid_alts = build_valid_alt_names(csr)
133
131
 
134
132
  new_cert.add_extension(ef.create_extension("subjectAltName", valid_alts.join(",")))
135
133
 
@@ -137,21 +135,6 @@ module Bullion
137
135
  [new_cert, valid_alts]
138
136
  end
139
137
 
140
- def csr_sans(csr)
141
- raw_attributes = csr.attributes
142
- return [] unless raw_attributes
143
-
144
- seq = extract_csr_attrs(csr)
145
- return [] unless seq
146
-
147
- values = extract_san_values(seq)
148
- return [] unless values
149
-
150
- values = OpenSSL::ASN1.decode(values).value
151
-
152
- values.select { |v| v.tag == 2 }.map { |v| "DNS:#{v.value}" }
153
- end
154
-
155
138
  def extract_csr_attrs(csr)
156
139
  csr.attributes.select { |a| a.oid == "extReq" }.map { |a| a.value.map(&:value) }
157
140
  end
@@ -161,8 +144,9 @@ module Bullion
161
144
  end
162
145
 
163
146
  def extract_csr_domains(csr_sans)
164
- csr_decoded_sans = OpenSSL::ASN1.decode(csr_sans.first.value[1].value)
165
- csr_decoded_sans.select { |v| v.tag == 2 }.map(&:value)
147
+ subject_alt_names = csr_sans.first.value.find { |v| v.tag == 4 }
148
+ csr_decoded_sans = OpenSSL::ASN1.decode(subject_alt_names.value)
149
+ csr_decoded_sans.value.select { |v| v.tag == 2 }.map(&:value)
166
150
  end
167
151
 
168
152
  def extract_san_values(sequence)
@@ -184,13 +168,33 @@ module Bullion
184
168
  end
185
169
 
186
170
  def cn_from_csr(csr)
187
- if csr.subject.to_s
188
- cns = csr.subject.to_s.split("/").grep(/^CN=/)
171
+ return unless csr.subject.to_s
189
172
 
190
- return cns.first.split("=").last if cns && !cns.empty?
191
- end
173
+ cns = csr.subject.to_s.split("/").grep(/^CN=/)
174
+
175
+ cns.first.split("=").last if cns && !cns.empty?
176
+ end
177
+
178
+ def cn_or_first_san_from_csr(csr)
179
+ cn = cn_from_csr(csr)
180
+ return cn if cn
181
+
182
+ csr_attrs = extract_csr_attrs(csr)
183
+ csr_sans = extract_csr_sans(csr_attrs)
184
+ extract_csr_domains(csr_sans).first
185
+ end
186
+
187
+ def domains_from_csr(csr)
188
+ csr_attrs = extract_csr_attrs(csr)
189
+ csr_sans = extract_csr_sans(csr_attrs)
190
+ extract_csr_domains(csr_sans)
191
+ end
192
192
 
193
- csr_sans(csr).first.split(":").last
193
+ def build_valid_alt_names(csr)
194
+ cn = cn_or_first_san_from_csr(csr)
195
+ csr_domains = domains_from_csr(csr)
196
+ existing_sans = filter_sans(csr_domains).map { |d| "DNS:#{d}" }
197
+ (["DNS:#{cn}"] + [*existing_sans]).uniq
194
198
  end
195
199
 
196
200
  # Signs an ACME CSR
@@ -206,7 +210,7 @@ module Bullion
206
210
  csr_cert.not_after = csr_cert.not_before + (3 * 30 * 24 * 60 * 60)
207
211
 
208
212
  # Force a subject if the cert doesn't have one
209
- cert.subject = simple_subject(cn_from_csr(csr)) unless cert.subject
213
+ cert.subject = simple_subject(cn_or_first_san_from_csr(csr)) unless cert.subject
210
214
 
211
215
  csr_cert.subject = simple_subject(cert.subject.to_s)
212
216
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Bullion
4
- VERSION = "0.11.0"
4
+ VERSION = "0.11.1"
5
5
  end
data/lib/bullion.rb CHANGED
@@ -7,6 +7,7 @@ require "securerandom"
7
7
  require "time"
8
8
  require "logger"
9
9
  require "openssl"
10
+ require "bigdecimal"
10
11
 
11
12
  # External requirements
12
13
  require "benchmark"
@@ -68,7 +69,11 @@ module Bullion
68
69
  MetricsRegistry = Prometheus::Client.registry
69
70
 
70
71
  def self.ca_key
71
- @ca_key ||= OpenSSL::PKey::RSA.new(File.read(config.ca.key_path), config.ca.secret)
72
+ @ca_key ||= begin
73
+ OpenSSL::PKey::RSA.new(File.read(config.ca.key_path), config.ca.secret)
74
+ rescue OpenSSL::PKey::RSAError
75
+ OpenSSL::PKey::EC.new(File.read(config.ca.key_path), config.ca.secret)
76
+ end
72
77
  end
73
78
 
74
79
  def self.ca_cert_file
@@ -1,5 +1,4 @@
1
1
  #!/bin/sh
2
2
 
3
3
  # Starts the server
4
- rake db:migrate
5
4
  itsi
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bullion
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.0
4
+ version: 0.11.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Gnagy