changed
CHANGELOG.md
|
@@ -1,5 +1,19 @@
|
1
1
|
# Changes
|
2
2
|
|
3
|
+ ## v0.6.0
|
4
|
+
|
5
|
+ ### Enhancements
|
6
|
+
|
7
|
+ * [X509.PrivateKey] Allow encryption of PEM output
|
8
|
+ * [X509.Test.Suite] Include 'localhost' in all certifictes
|
9
|
+ * [X509.Test.Suite] Generate client certificate and associated key
|
10
|
+ * [X509.Test.Server] Add 'client-cert' endpoint for testing with client
|
11
|
+ certificate
|
12
|
+ * [`x509.gen.suite` Mix task] Add --force option
|
13
|
+ * [`x509.gen.suite` Mix task] Add --password option
|
14
|
+ * [`x509.gen.suite` Mix task] Generate 'ca_and_chain.pem' file
|
15
|
+ * [`x509.gen.selfsigned` Mix task] Add --force option
|
16
|
+
|
3
17
|
## v0.5.4
|
4
18
|
|
5
19
|
### Enhancements
|
changed
hex_metadata.config
|
@@ -19,22 +19,10 @@
|
19
19
|
<<"lib/x509/certificate.ex">>,<<"lib/x509/signature_algorithm.ex">>,
|
20
20
|
<<"lib/x509/date_time.ex">>,<<"lib/x509/rdn_sequence.ex">>,
|
21
21
|
<<"lib/x509/public_key.ex">>,<<"lib/x509/asn1.ex">>,<<"lib/x509/csr.ex">>,
|
22
|
- <<"priv">>,<<"priv/cert">>,<<"priv/cert/all.pem">>,<<"priv/cert/key.pem">>,
|
23
|
- <<"priv/cert/cert.pem">>,<<"priv/cert/selfsigned_key.pem">>,
|
24
|
- <<"priv/cert/suite">>,<<"priv/cert/suite/chain.pem">>,
|
25
|
- <<"priv/cert/suite/expired_chain.pem">>,<<"priv/cert/suite/revoked.pem">>,
|
26
|
- <<"priv/cert/suite/alternate_chain.pem">>,<<"priv/cert/suite/root.crl">>,
|
27
|
- <<"priv/cert/suite/revoked_chain.pem">>,<<"priv/cert/suite/expired.pem">>,
|
28
|
- <<"priv/cert/suite/cross_signer_root_ca.crl">>,
|
29
|
- <<"priv/cert/suite/root_ca.crl">>,
|
30
|
- <<"priv/cert/suite/alternate_cacerts.pem">>,<<"priv/cert/suite/valid.pem">>,
|
31
|
- <<"priv/cert/suite/cacerts.pem">>,<<"priv/cert/suite/intermediate_ca.crl">>,
|
32
|
- <<"priv/cert/suite/wildcard.pem">>,<<"priv/cert/suite/selfsigned.pem">>,
|
33
|
- <<"priv/cert/suite/server_key.pem">>,<<"priv/cert/suite/other_key.pem">>,
|
34
|
- <<"priv/cert/selfsigned.pem">>,<<".formatter.exs">>,<<"mix.exs">>,
|
35
|
- <<"README.md">>,<<"LICENSE">>,<<"CHANGELOG.md">>]}.
|
22
|
+ <<"priv">>,<<".formatter.exs">>,<<"mix.exs">>,<<"README.md">>,<<"LICENSE">>,
|
23
|
+ <<"CHANGELOG.md">>]}.
|
36
24
|
{<<"licenses">>,[<<"BSD 3-Clause">>]}.
|
37
25
|
{<<"links">>,[{<<"GitHub">>,<<"https://github.com/voltone/x509">>}]}.
|
38
26
|
{<<"name">>,<<"x509">>}.
|
39
27
|
{<<"requirements">>,[]}.
|
40
|
- {<<"version">>,<<"0.5.4">>}.
|
28
|
+ {<<"version">>,<<"0.6.0">>}.
|
changed
lib/mix/tasks/x509.gen.selfsigned.ex
|
@@ -39,6 +39,8 @@ defmodule Mix.Tasks.X509.Gen.Selfsigned do
|
39
39
|
key (default: #{@default_path})
|
40
40
|
* `--name` (`-n`): the Common Name value in certificate's subject
|
41
41
|
(default: "#{@default_name}")
|
42
|
+ * `--force` (`-f`): overwite existing files without prompting for
|
43
|
+ confirmation
|
42
44
|
|
43
45
|
Requires OTP 20 or later.
|
44
46
|
"""
|
|
@@ -51,12 +53,13 @@ defmodule Mix.Tasks.X509.Gen.Selfsigned do
|
51
53
|
{opts, args} =
|
52
54
|
OptionParser.parse!(
|
53
55
|
all_args,
|
54
|
- aliases: [n: :name, o: :output],
|
55
|
- strict: [name: :string, output: :string]
|
56
|
+ aliases: [n: :name, o: :output, f: :force],
|
57
|
+ strict: [name: :string, output: :string, force: :boolean]
|
56
58
|
)
|
57
59
|
|
58
60
|
path = opts[:output] || @default_path
|
59
61
|
name = opts[:name] || @default_name
|
62
|
+ force = opts[:force] || false
|
60
63
|
|
61
64
|
hostnames =
|
62
65
|
case args do
|
|
@@ -69,8 +72,8 @@ defmodule Mix.Tasks.X509.Gen.Selfsigned do
|
69
72
|
keyfile = path <> "_key.pem"
|
70
73
|
certfile = path <> ".pem"
|
71
74
|
|
72
|
- create_file(keyfile, X509.PrivateKey.to_pem(private_key))
|
73
|
- create_file(certfile, X509.Certificate.to_pem(certificate))
|
75
|
+ create_file(keyfile, X509.PrivateKey.to_pem(private_key), force: force)
|
76
|
+ create_file(certfile, X509.Certificate.to_pem(certificate), force: force)
|
74
77
|
|
75
78
|
print_shell_instructions(keyfile, certfile)
|
76
79
|
end
|
changed
lib/mix/tasks/x509.gen.suite.ex
|
@@ -29,10 +29,14 @@ defmodule Mix.Tasks.X509.Gen.Suite do
|
29
29
|
|
30
30
|
Other (optional) arguments:
|
31
31
|
|
32
|
+ * '--password' ('-p'): if set, an encrypted, password protected version of
|
33
|
+ each private key will be created
|
32
34
|
* `--crlserver` (`-c`): the base URL for the CRL server to be used for
|
33
35
|
CRL distribution points
|
34
36
|
* `--output` (`-o`): the path where the certificates and keys should be
|
35
37
|
stored (default: #{@default_path})
|
38
|
+ * `--force` (`-f`): overwite existing files without prompting for
|
39
|
+ confirmation
|
36
40
|
|
37
41
|
Requires OTP 20 or later.
|
38
42
|
"""
|
|
@@ -45,12 +49,14 @@ defmodule Mix.Tasks.X509.Gen.Suite do
|
45
49
|
{opts, args} =
|
46
50
|
OptionParser.parse!(
|
47
51
|
all_args,
|
48
|
- aliases: [c: :crlserver, o: :output],
|
49
|
- strict: [crlserver: :string, output: :string]
|
52
|
+ aliases: [p: :password, c: :crlserver, o: :output, f: :force],
|
53
|
+ strict: [password: :string, crlserver: :string, output: :string, force: :boolean]
|
50
54
|
)
|
51
55
|
|
52
56
|
path = opts[:output] || @default_path
|
57
|
+ password = opts[:password]
|
53
58
|
crl_opts = [crl_server: opts[:crlserver]]
|
59
|
+ force = opts[:force] || false
|
54
60
|
|
55
61
|
suite_opts =
|
56
62
|
case args do
|
|
@@ -60,65 +66,107 @@ defmodule Mix.Tasks.X509.Gen.Suite do
|
60
66
|
|
61
67
|
suite = X509.Test.Suite.new(suite_opts)
|
62
68
|
|
63
|
- create_file(Path.join(path, "server_key.pem"), X509.PrivateKey.to_pem(suite.server_key))
|
64
|
- create_file(Path.join(path, "other_key.pem"), X509.PrivateKey.to_pem(suite.other_key))
|
69
|
+ server_key_pem = X509.PrivateKey.to_pem(suite.server_key)
|
70
|
+ create_file(Path.join(path, "server_key.pem"), server_key_pem, force: force)
|
65
71
|
|
66
|
- create_file(
|
67
|
- Path.join(path, "cacerts.pem"),
|
72
|
+ if password do
|
73
|
+ server_key_enc_pem = X509.PrivateKey.to_pem(suite.server_key, password: password)
|
74
|
+ create_file(Path.join(path, "server_key_enc.pem"), server_key_enc_pem, force: force)
|
75
|
+ end
|
76
|
+
|
77
|
+ other_key_pem = X509.PrivateKey.to_pem(suite.other_key)
|
78
|
+ create_file(Path.join(path, "other_key.pem"), other_key_pem, force: force)
|
79
|
+
|
80
|
+ if password do
|
81
|
+ other_key_enc_pem = X509.PrivateKey.to_pem(suite.other_key, password: password)
|
82
|
+ create_file(Path.join(path, "other_key_enc.pem"), other_key_enc_pem, force: force)
|
83
|
+ end
|
84
|
+
|
85
|
+ client_key_pem = X509.PrivateKey.to_pem(suite.client_key)
|
86
|
+ create_file(Path.join(path, "client_key.pem"), client_key_pem, force: force)
|
87
|
+
|
88
|
+ if password do
|
89
|
+ client_key_enc_pem = X509.PrivateKey.to_pem(suite.client_key, password: password)
|
90
|
+ create_file(Path.join(path, "client_key_enc.pem"), client_key_enc_pem, force: force)
|
91
|
+ end
|
92
|
+
|
93
|
+ cacerts_pem =
|
68
94
|
suite.cacerts
|
69
95
|
|> Enum.map(&X509.Certificate.from_der!/1)
|
70
96
|
|> Enum.map(&X509.Certificate.to_pem/1)
|
71
97
|
|> Enum.join()
|
72
|
- )
|
73
98
|
|
74
|
- create_file(
|
75
|
- Path.join(path, "alternate_cacerts.pem"),
|
99
|
+ create_file(Path.join(path, "cacerts.pem"), cacerts_pem, force: force)
|
100
|
+
|
101
|
+ alternate_cacerts_pem =
|
76
102
|
suite.alternate_cacerts
|
77
103
|
|> Enum.map(&X509.Certificate.from_der!/1)
|
78
104
|
|> Enum.map(&X509.Certificate.to_pem/1)
|
79
105
|
|> Enum.join()
|
80
|
- )
|
81
106
|
|
82
|
- create_file(
|
83
|
- Path.join(path, "chain.pem"),
|
107
|
+ create_file(Path.join(path, "alternate_cacerts.pem"), alternate_cacerts_pem, force: force)
|
108
|
+
|
109
|
+ chain_pem =
|
84
110
|
suite.chain
|
85
111
|
|> Enum.map(&X509.Certificate.from_der!/1)
|
86
112
|
|> Enum.map(&X509.Certificate.to_pem/1)
|
87
113
|
|> Enum.join()
|
88
|
- )
|
89
114
|
|
90
|
- create_file(
|
91
|
- Path.join(path, "expired_chain.pem"),
|
115
|
+ create_file(Path.join(path, "chain.pem"), chain_pem, force: force)
|
116
|
+
|
117
|
+ ca_and_chain_pem =
|
118
|
+ (suite.cacerts ++ suite.chain)
|
119
|
+ |> Enum.map(&X509.Certificate.from_der!/1)
|
120
|
+ |> Enum.map(&X509.Certificate.to_pem/1)
|
121
|
+ |> Enum.join()
|
122
|
+
|
123
|
+ create_file(Path.join(path, "ca_and_chain.pem"), ca_and_chain_pem, force: force)
|
124
|
+
|
125
|
+ expired_chain_pem =
|
92
126
|
suite.expired_chain
|
93
127
|
|> Enum.map(&X509.Certificate.from_der!/1)
|
94
128
|
|> Enum.map(&X509.Certificate.to_pem/1)
|
95
129
|
|> Enum.join()
|
96
|
- )
|
97
130
|
|
98
|
- create_file(
|
99
|
- Path.join(path, "revoked_chain.pem"),
|
131
|
+ create_file(Path.join(path, "expired_chain.pem"), expired_chain_pem, force: force)
|
132
|
+
|
133
|
+ revoked_chain_pem =
|
100
134
|
suite.revoked_chain
|
101
135
|
|> Enum.map(&X509.Certificate.from_der!/1)
|
102
136
|
|> Enum.map(&X509.Certificate.to_pem/1)
|
103
137
|
|> Enum.join()
|
104
|
- )
|
105
138
|
|
106
|
- create_file(
|
107
|
- Path.join(path, "alternate_chain.pem"),
|
139
|
+ create_file(Path.join(path, "revoked_chain.pem"), revoked_chain_pem, force: force)
|
140
|
+
|
141
|
+ alternate_chain_pem =
|
108
142
|
suite.alternate_chain
|
109
143
|
|> Enum.map(&X509.Certificate.from_der!/1)
|
110
144
|
|> Enum.map(&X509.Certificate.to_pem/1)
|
111
145
|
|> Enum.join()
|
112
|
- )
|
113
146
|
|
114
|
- create_file(Path.join(path, "valid.pem"), X509.Certificate.to_pem(suite.valid))
|
115
|
- create_file(Path.join(path, "wildcard.pem"), X509.Certificate.to_pem(suite.wildcard))
|
116
|
- create_file(Path.join(path, "expired.pem"), X509.Certificate.to_pem(suite.expired))
|
117
|
- create_file(Path.join(path, "revoked.pem"), X509.Certificate.to_pem(suite.revoked))
|
118
|
- create_file(Path.join(path, "selfsigned.pem"), X509.Certificate.to_pem(suite.selfsigned))
|
147
|
+ create_file(Path.join(path, "alternate_chain.pem"), alternate_chain_pem, force: force)
|
148
|
+
|
149
|
+ valid_pem = X509.Certificate.to_pem(suite.valid)
|
150
|
+ create_file(Path.join(path, "valid.pem"), valid_pem, force: force)
|
151
|
+
|
152
|
+ wildcard_pem = X509.Certificate.to_pem(suite.wildcard)
|
153
|
+ create_file(Path.join(path, "wildcard.pem"), wildcard_pem, force: force)
|
154
|
+
|
155
|
+ expired_pem = X509.Certificate.to_pem(suite.expired)
|
156
|
+ create_file(Path.join(path, "expired.pem"), expired_pem, force: force)
|
157
|
+
|
158
|
+ revoked_pem = X509.Certificate.to_pem(suite.revoked)
|
159
|
+ create_file(Path.join(path, "revoked.pem"), revoked_pem, force: force)
|
160
|
+
|
161
|
+ selfsigned_pem = X509.Certificate.to_pem(suite.selfsigned)
|
162
|
+ create_file(Path.join(path, "selfsigned.pem"), selfsigned_pem, force: force)
|
163
|
+
|
164
|
+ client_pem = X509.Certificate.to_pem(suite.client)
|
165
|
+ create_file(Path.join(path, "client.pem"), client_pem, force: force)
|
119
166
|
|
120
167
|
for {name, crl} <- suite.crls do
|
121
|
- create_file(Path.join(path, name), X509.CRL.to_der(crl))
|
168
|
+ crl_der = X509.CRL.to_der(crl)
|
169
|
+ create_file(Path.join(path, name), crl_der, force: force)
|
122
170
|
end
|
123
171
|
|
124
172
|
print_shell_instructions(path)
|
changed
lib/mix/tasks/x509.test_server.ex
|
@@ -43,6 +43,10 @@ defmodule Mix.Tasks.X509.TestServer do
|
43
43
|
alternate_cacertfile = write_cacerts!("alternate_cacerts.pem", suite.alternate_cacerts)
|
44
44
|
Mix.shell().info("Secondary CA certificate store: #{alternate_cacertfile}")
|
45
45
|
|
46
|
+ client_certfile = write_cert!("client.pem", suite.client)
|
47
|
+ write_key!("client_key.pem", suite.client_key)
|
48
|
+ Mix.shell().info("Client certificate and key: #{client_certfile} / [...]/client_key.pem")
|
49
|
+
|
46
50
|
# Update the CRL server with the generated CRLs
|
47
51
|
suite.crls
|
48
52
|
|> Enum.each(fn {path, crl} ->
|
|
@@ -78,6 +82,18 @@ defmodule Mix.Tasks.X509.TestServer do
|
78
82
|
path
|
79
83
|
end
|
80
84
|
|
85
|
+ defp write_cert!(filename, cert) do
|
86
|
+ path = Path.join(System.tmp_dir!(), filename)
|
87
|
+ File.write!(path, X509.Certificate.to_pem(cert))
|
88
|
+ path
|
89
|
+ end
|
90
|
+
|
91
|
+ defp write_key!(filename, key) do
|
92
|
+ path = Path.join(System.tmp_dir!(), filename)
|
93
|
+ File.write!(path, X509.PrivateKey.to_pem(key))
|
94
|
+ path
|
95
|
+ end
|
96
|
+
|
81
97
|
defp certificate_der_to_pem(der) do
|
82
98
|
der
|
83
99
|
|> X509.Certificate.from_der!()
|
changed
lib/x509/private_key.ex
|
@@ -145,6 +145,8 @@ defmodule X509.PrivateKey do
|
145
145
|
|
146
146
|
* `:wrap` - Wrap the private key in a PKCS#8 PrivateKeyInfo container
|
147
147
|
(default: `false`)
|
148
|
+ * `:password` - If a password is specified, the private key is encrypted
|
149
|
+ using 3DES; to password will be required to decode the PEM entry
|
148
150
|
"""
|
149
151
|
@spec to_pem(t(), Keyword.t()) :: String.t()
|
150
152
|
def to_pem(private_key, opts \\ []) do
|
|
@@ -154,7 +156,7 @@ defmodule X509.PrivateKey do
|
154
156
|
else
|
155
157
|
private_key
|
156
158
|
end
|
157
|
- |> pem_entry_encode()
|
159
|
+ |> pem_entry_encode(Keyword.get(opts, :password))
|
158
160
|
|> List.wrap()
|
159
161
|
|> :public_key.pem_encode()
|
160
162
|
end
|
|
@@ -277,15 +279,35 @@ defmodule X509.PrivateKey do
|
277
279
|
:public_key.der_encode(:PrivateKeyInfo, private_key_info)
|
278
280
|
end
|
279
281
|
|
280
|
- defp pem_entry_encode(rsa_private_key() = rsa_private_key) do
|
282
|
+ defp pem_entry_encode(rsa_private_key() = rsa_private_key, nil) do
|
281
283
|
:public_key.pem_entry_encode(:RSAPrivateKey, rsa_private_key)
|
282
284
|
end
|
283
285
|
|
284
|
- defp pem_entry_encode(ec_private_key() = ec_private_key) do
|
286
|
+ defp pem_entry_encode(ec_private_key() = ec_private_key, nil) do
|
285
287
|
:public_key.pem_entry_encode(:ECPrivateKey, ec_private_key)
|
286
288
|
end
|
287
289
|
|
288
|
- defp pem_entry_encode(private_key_info() = private_key_info) do
|
290
|
+ defp pem_entry_encode(private_key_info() = private_key_info, nil) do
|
289
291
|
:public_key.pem_entry_encode(:PrivateKeyInfo, private_key_info)
|
290
292
|
end
|
293
|
+
|
294
|
+ defp pem_entry_encode(private_key, password) when is_binary(password) do
|
295
|
+ pem_entry_encode(private_key, to_charlist(password))
|
296
|
+ end
|
297
|
+
|
298
|
+ defp pem_entry_encode(rsa_private_key() = rsa_private_key, password) do
|
299
|
+ :public_key.pem_entry_encode(:RSAPrivateKey, rsa_private_key, {cipher_info(), password})
|
300
|
+ end
|
301
|
+
|
302
|
+ defp pem_entry_encode(ec_private_key() = ec_private_key, password) do
|
303
|
+ :public_key.pem_entry_encode(:ECPrivateKey, ec_private_key, {cipher_info(), password})
|
304
|
+ end
|
305
|
+
|
306
|
+ defp pem_entry_encode(private_key_info() = private_key_info, password) do
|
307
|
+ :public_key.pem_entry_encode(:PrivateKeyInfo, private_key_info, {cipher_info(), password})
|
308
|
+ end
|
309
|
+
|
310
|
+ defp cipher_info() do
|
311
|
+ {'DES-EDE3-CBC', :crypto.strong_rand_bytes(8)}
|
312
|
+ end
|
291
313
|
end
|
changed
lib/x509/test/suite.ex
|
@@ -59,6 +59,8 @@ defmodule X509.Test.Suite do
|
59
59
|
* `selfsigned-wrong-host` - presenting a self-signed server certificate with
|
60
60
|
a SAN hostname that does not match; should be rejected unless peer
|
61
61
|
verification is disabled
|
62
|
+
|
63
|
+ * `client-cert` - requires that the client present a valid certificate
|
62
64
|
"""
|
63
65
|
|
64
66
|
require Logger
|
|
@@ -79,6 +81,8 @@ defmodule X509.Test.Suite do
|
79
81
|
:expired,
|
80
82
|
:revoked,
|
81
83
|
:selfsigned,
|
84
|
+ :client,
|
85
|
+ :client_key,
|
82
86
|
:crls
|
83
87
|
]
|
84
88
|
|
|
@@ -88,6 +92,7 @@ defmodule X509.Test.Suite do
|
88
92
|
{:rsa, non_neg_integer()} | {:ec, :crypto.ec_named_curve() | :public_key.oid()},
|
89
93
|
server_key: X509.PrivateKey.t(),
|
90
94
|
other_key: X509.PrivateKey.t(),
|
95
|
+ client_key: X509.PrivateKey.t(),
|
91
96
|
cacerts: [binary()],
|
92
97
|
alternate_cacerts: [binary()],
|
93
98
|
chain: [binary()],
|
|
@@ -99,6 +104,7 @@ defmodule X509.Test.Suite do
|
99
104
|
expired: X509.Certificate.t(),
|
100
105
|
revoked: X509.Certificate.t(),
|
101
106
|
selfsigned: X509.Certificate.t(),
|
107
|
+ client: X509.Certificate.t(),
|
102
108
|
crls: %{String.t() => X509.CRL.t()}
|
103
109
|
}
|
104
110
|
|
|
@@ -139,6 +145,7 @@ defmodule X509.Test.Suite do
|
139
145
|
server_key = new_key(key_type)
|
140
146
|
other_key = new_key(key_type)
|
141
147
|
cross_signer_root_ca_key = new_key(key_type)
|
148
|
+ client_key = new_key(key_type)
|
142
149
|
|
143
150
|
# CA certificates
|
144
151
|
root_ca =
|
|
@@ -220,11 +227,13 @@ defmodule X509.Test.Suite do
|
220
227
|
[
|
221
228
|
subject_alt_name:
|
222
229
|
X509.Certificate.Extension.subject_alt_name([
|
230
|
+ "localhost",
|
223
231
|
"valid.#{domain}",
|
224
232
|
"valid-missing-chain.#{domain}",
|
225
233
|
"valid-revoked-chain.#{domain}",
|
226
234
|
"valid-wrong-key.#{domain}",
|
227
|
- "valid-cross-signed.#{domain}"
|
235
|
+ "valid-cross-signed.#{domain}",
|
236
|
+ "client-cert.#{domain}"
|
228
237
|
])
|
229
238
|
] ++ crl_extensions(crl_server, "intermediate_ca.crl")
|
230
239
|
)
|
|
@@ -240,6 +249,7 @@ defmodule X509.Test.Suite do
|
240
249
|
[
|
241
250
|
subject_alt_name:
|
242
251
|
X509.Certificate.Extension.subject_alt_name([
|
252
|
+ "*.localhost",
|
243
253
|
"*.wildcard.#{domain}"
|
244
254
|
])
|
245
255
|
] ++ crl_extensions(crl_server, "intermediate_ca.crl")
|
|
@@ -257,6 +267,7 @@ defmodule X509.Test.Suite do
|
257
267
|
[
|
258
268
|
subject_alt_name:
|
259
269
|
X509.Certificate.Extension.subject_alt_name([
|
270
|
+ "localhost",
|
260
271
|
"expired.#{domain}"
|
261
272
|
])
|
262
273
|
] ++ crl_extensions(crl_server, "intermediate_ca.crl")
|
|
@@ -273,6 +284,7 @@ defmodule X509.Test.Suite do
|
273
284
|
[
|
274
285
|
subject_alt_name:
|
275
286
|
X509.Certificate.Extension.subject_alt_name([
|
287
|
+ "localhost",
|
276
288
|
"revoked.#{domain}"
|
277
289
|
])
|
278
290
|
] ++ crl_extensions(crl_server, "intermediate_ca.crl")
|
|
@@ -287,12 +299,22 @@ defmodule X509.Test.Suite do
|
287
299
|
extensions: [
|
288
300
|
subject_alt_name:
|
289
301
|
X509.Certificate.Extension.subject_alt_name([
|
302
|
+ "localhost",
|
290
303
|
"selfsigned.#{domain}",
|
291
304
|
"selfsigned-wrong-key.#{domain}"
|
292
305
|
])
|
293
306
|
]
|
294
307
|
)
|
295
308
|
|
309
|
+ client =
|
310
|
+ client_key
|
311
|
+ |> X509.PublicKey.derive()
|
312
|
+ |> X509.Certificate.new(
|
313
|
+ "/O=#{__MODULE__}/CN=Client",
|
314
|
+ intermediate_ca,
|
315
|
+ intermediate_ca_key
|
316
|
+ )
|
317
|
+
|
296
318
|
# CRLs
|
297
319
|
|
298
320
|
crls =
|
|
@@ -336,6 +358,7 @@ defmodule X509.Test.Suite do
|
336
358
|
key_type: key_type,
|
337
359
|
server_key: server_key,
|
338
360
|
other_key: other_key,
|
361
|
+ client_key: client_key,
|
339
362
|
cacerts: [X509.Certificate.to_der(root_ca)],
|
340
363
|
alternate_cacerts: [X509.Certificate.to_der(cross_signer_root_ca)],
|
341
364
|
chain: [X509.Certificate.to_der(intermediate_ca)],
|
|
@@ -350,6 +373,7 @@ defmodule X509.Test.Suite do
|
350
373
|
expired: expired,
|
351
374
|
revoked: revoked,
|
352
375
|
selfsigned: selfsigned,
|
376
|
+ client: client,
|
353
377
|
crls: crls
|
354
378
|
}
|
355
379
|
end
|
|
@@ -541,6 +565,19 @@ defmodule X509.Test.Suite do
|
541
565
|
]
|
542
566
|
end
|
543
567
|
|
568
|
+ def sni_handler(
|
569
|
+ %__MODULE__{valid: valid, chain: chain, server_key: server_key, cacerts: cacerts},
|
570
|
+ "client-cert"
|
571
|
+ ) do
|
572
|
+ [
|
573
|
+ cert: X509.Certificate.to_der(valid),
|
574
|
+ cacerts: chain ++ cacerts,
|
575
|
+ key: {:PrivateKeyInfo, X509.PrivateKey.to_der(server_key, wrap: true)},
|
576
|
+ verify: :verify_peer,
|
577
|
+ fail_if_no_peer_cert: true
|
578
|
+ ]
|
579
|
+ end
|
580
|
+
|
544
581
|
def sni_handler(
|
545
582
|
%__MODULE__{valid: valid, chain: chain, server_key: server_key},
|
546
583
|
scenario
|
changed
mix.exs
|
@@ -1,7 +1,7 @@
|
1
1
|
defmodule X509.MixProject do
|
2
2
|
use Mix.Project
|
3
3
|
|
4
|
- @version "0.5.4"
|
4
|
+ @version "0.6.0"
|
5
5
|
|
6
6
|
def project do
|
7
7
|
[
|
removed
priv/cert/all.pem
|
@@ -1,6 +0,0 @@
|
1
|
- -----BEGIN EC PRIVATE KEY-----
|
2
|
- MHcCAQEEIDZGVJuln/isMeKwf2KrP8yINBTUeUiRleGimWq9oVz4oAoGCCqGSM49
|
3
|
- AwEHoUQDQgAE3wJtFWTxYWk7I87P4cZwLLCBwkrIpn1TLip5XIgjUeDtbqkXqdY+
|
4
|
- HARx0NwV/E2Ns256ZIu7m9psPzOkAfT+/Q==
|
5
|
- -----END EC PRIVATE KEY-----
|
6
|
-
|
removed
priv/cert/cert.pem
|
@@ -1,12 +0,0 @@
|
1
|
- -----BEGIN CERTIFICATE-----
|
2
|
- MIIBkTCCATegAwIBAgIJAP59IsUBfuKKMAoGCCqGSM49BAMCMA8xDTALBgNVBAMM
|
3
|
- BFRlc3QwHhcNMTgxMTI0MTMxODUzWhcNMTkxMjI0MTMyMzUzWjAPMQ0wCwYDVQQD
|
4
|
- DARUZXN0MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE3wJtFWTxYWk7I87P4cZw
|
5
|
- LLCBwkrIpn1TLip5XIgjUeDtbqkXqdY+HARx0NwV/E2Ns256ZIu7m9psPzOkAfT+
|
6
|
- /aN8MHowCQYDVR0TBAIwADAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYB
|
7
|
- BQUHAwEGCCsGAQUFBwMCMB0GA1UdDgQWBBTh4mqsktWAK4nXGUri1rKt+xpdWTAf
|
8
|
- BgNVHSMEGDAWgBTh4mqsktWAK4nXGUri1rKt+xpdWTAKBggqhkjOPQQDAgNIADBF
|
9
|
- AiEAtxEXOaiflM5H+5h6GYzVrTCEnXV2/FgIaQHS2DAtkEwCIEZUqxesWa5Z5ZHS
|
10
|
- MIdtYS1pG5xnyn4Iu0zgfhyyBHbm
|
11
|
- -----END CERTIFICATE-----
|
12
|
-
|
removed
priv/cert/key.pem
|
@@ -1,6 +0,0 @@
|
1
|
- -----BEGIN EC PRIVATE KEY-----
|
2
|
- MHcCAQEEIDZGVJuln/isMeKwf2KrP8yINBTUeUiRleGimWq9oVz4oAoGCCqGSM49
|
3
|
- AwEHoUQDQgAE3wJtFWTxYWk7I87P4cZwLLCBwkrIpn1TLip5XIgjUeDtbqkXqdY+
|
4
|
- HARx0NwV/E2Ns256ZIu7m9psPzOkAfT+/Q==
|
5
|
- -----END EC PRIVATE KEY-----
|
6
|
-
|
removed
priv/cert/selfsigned.pem
|
@@ -1,22 +0,0 @@
|
1
|
- -----BEGIN CERTIFICATE-----
|
2
|
- MIIDcTCCAlmgAwIBAgIIXm8efHmXlIcwDQYJKoZIhvcNAQELBQAwJzElMCMGA1UE
|
3
|
- AwwcU2VsZi1zaWduZWQgdGVzdCBjZXJ0aWZpY2F0ZTAeFw0xOTAzMTcwNzU0MjBa
|
4
|
- Fw0yMDA0MTUwNzU5MjBaMCcxJTAjBgNVBAMMHFNlbGYtc2lnbmVkIHRlc3QgY2Vy
|
5
|
- dGlmaWNhdGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDT+u/idxxc
|
6
|
- /RHY6Ynba3k70sBLuwWpmGwN1fCDgT8qCf5GFHessVFY1yl+MxtvysX6XxX3Ci4e
|
7
|
- s0wsidH5HXeE4oITzMDY0grbdKdknznfwRMeWQXH1ZYYwqwXn8tkHKr5bQdFPW3+
|
8
|
- ZXh9gExS6lg02BUH3gOG8RLPN5YEAZEsB0vnSq9MBcNBiwClO756wTonAzbTaoaa
|
9
|
- 05YcCzQ6gS6UauD5XGvZHrlqUXT7k1X8qbXArEVz3aLMT0KHisxAJV0G3pFuYZFR
|
10
|
- U67vjfeNccqdnoiUmDndxQ28R6DP5yxQNq1pnzziFwHoo2rgKBQXJy2crlaGHK/H
|
11
|
- 4+l5qU58nndDAgMBAAGjgaAwgZ0wCQYDVR0TBAIwADAOBgNVHQ8BAf8EBAMCBaAw
|
12
|
- HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB0GA1UdDgQWBBSnjJr/iKDs
|
13
|
- K3IFIpE8wN04unSoljAfBgNVHSMEGDAWgBSnjJr/iKDsK3IFIpE8wN04unSoljAh
|
14
|
- BgNVHREEGjAYghZzZWxmc2lnbmVkLnZvbHRvbmUubmV0MA0GCSqGSIb3DQEBCwUA
|
15
|
- A4IBAQCRTrjyELVI7Egrg5i+usOSoy8rlPBqidZMCmiUgnbjygsIck0usbAtk7gQ
|
16
|
- bVZ7S8VIcGx98FKr8Rn8wMPmHRKV5QW7h7PJlm0gzZRWNe2vedf+ZQCz/erURX0O
|
17
|
- DP3wN7psxkVsO6hQXg3P2OLPR5Qe3hzVgox1YLjy4pNjciHgqOxBZbq91CYvCvRP
|
18
|
- 4up5Exwdm1JCTZQuG2DfaY41H2BFF9KPFQgze0pyJgxKmfYCXwoWrZaeybz6jseI
|
19
|
- bL8AMEzEKZvDLbfY2A23Q+y9UZV/9n1OCsMNWVBU+vJiRtjlmlPEEtghNH5etNRu
|
20
|
- K7Anj/eSc6s0mY9pP9VgJW2Nyiov
|
21
|
- -----END CERTIFICATE-----
|
22
|
-
|
removed
priv/cert/selfsigned_key.pem
|
@@ -1,28 +0,0 @@
|
1
|
- -----BEGIN RSA PRIVATE KEY-----
|
2
|
- MIIEpQIBAAKCAQEA0/rv4nccXP0R2OmJ22t5O9LAS7sFqZhsDdXwg4E/Kgn+RhR3
|
3
|
- rLFRWNcpfjMbb8rF+l8V9wouHrNMLInR+R13hOKCE8zA2NIK23SnZJ8538ETHlkF
|
4
|
- x9WWGMKsF5/LZByq+W0HRT1t/mV4fYBMUupYNNgVB94DhvESzzeWBAGRLAdL50qv
|
5
|
- TAXDQYsApTu+esE6JwM202qGmtOWHAs0OoEulGrg+Vxr2R65alF0+5NV/Km1wKxF
|
6
|
- c92izE9Ch4rMQCVdBt6RbmGRUVOu7433jXHKnZ6IlJg53cUNvEegz+csUDataZ88
|
7
|
- 4hcB6KNq4CgUFyctnK5Whhyvx+PpealOfJ53QwIDAQABAoIBAQCokrSzfo9Sr3nC
|
8
|
- 6q1TjZsiZM3BK6AsJ2c+dXTHzz+A2eOYrWwiK/yJzslTb6cQ9ssL+RPJmhHlHiak
|
9
|
- gJE3LyS9yzcwMbLmedpifNklXq4ybyMaDidXrFWpqR4bx1qCaX3ZzsdqW5ieJulz
|
10
|
- vFR116B/nZrT380kQY/4s7abxvdAb7Y+lv1oR3qmiB9boksnIlbz5WFGHyTmKMOg
|
11
|
- MlAE93bdhzctzMXZxahREIuWFeTgak2aQFeyqzFwhxY0vLFoJq1G3eb5TSuckGu0
|
12
|
- 0DecHIja5VSVyOvwQ7LpQ5vsZj0GfCmAjsuqIhodBw5RIssk7zBidbdGzB04iQnG
|
13
|
- 9UobGDNJAoGBAPGfbrQSsT/ScCvrxr9T4BM6htBT7MEtVgTIs/mfCjJmMKGywJHs
|
14
|
- Kqoi7d2KSH77tOJ/sN/cB50932g7kbDk8rsqJwaSDs+oJXbLTv3uX2Of2wcNFw1K
|
15
|
- d0rfJYhi66YhaFxgjeZ9+lG/Dw4qr2Cx3q1V/inBjmynxnMWupW3C6NPAoGBAOCX
|
16
|
- 9+a8DKukzyCbSgC2OEQxgM9/+bxiF2JGAUCxIR0nsHEWrXAjNsjA3TSH6i5kXXJD
|
17
|
- X9uavVQTlGZFTFIdwz6+ooUNukrmM9UZalTZzeO5oMpTMGRvHR3Vrdi09midIk1q
|
18
|
- qIsRZk2uO5woFAwN2jl8Wf/mGlkgzS8GSpiRD//NAoGAH+yTwOETYD5aqcLuMItR
|
19
|
- eNjrxQzBpEhsLBekh9+2hjAwTr0CaoVMocwZp4LEz1pMbPy4DuvQabsqEGiGeFvX
|
20
|
- olkQbPLRWCh8QrTcC/r5yXzugID/QbdMCa1wFRQU1I9nbYUoWoLclv5qa9HB+EGo
|
21
|
- DTjmavfy7HJCayRepLdZp0sCgYEAiYAgko+QhklJUeIgpVzqB73y6ZalE5NOU6ke
|
22
|
- PTf0WQAigqnqlxvH/5IsG2wWkD58A2eCOVV8EgxGr3I/ropwLWrS3vivlAlptE5y
|
23
|
- De6moYPVD+lsWCC6x7g5TdJEhXmmNZVWCIYnhuljr0/OLi8Q6l7aTtPWT7jIRcDp
|
24
|
- TIyLKgUCgYEAgUFz4sfOo5R0t9457hWvrl+0TzJLXkepbLVu2T/5asQYamcitzMs
|
25
|
- tui6VKAJonIxozxriZow9mmJszoDXUANGgCdr97c1YIfiKWSqx3g3KpIxr1mAgV2
|
26
|
- bInSxHJg4CJB6d6My3r9Ue/TTSXl17E88p/5KqDMtBKDPofaX+WJ3p4=
|
27
|
- -----END RSA PRIVATE KEY-----
|
28
|
-
|
removed
priv/cert/suite/alternate_cacerts.pem
|
@@ -1,16 +0,0 @@
|
1
|
- -----BEGIN CERTIFICATE-----
|
2
|
- MIICYjCCAcugAwIBAgIJAId0ydzr0h8EMA0GCSqGSIb3DQEBCwUAMD8xHzAdBgNV
|
3
|
- BAoMFkVsaXhpci5YNTA5LlRlc3QuU3VpdGUxHDAaBgNVBAMME0FsdGVybmF0aXZl
|
4
|
- IFJvb3QgQ0EwHhcNMTgxMTA0MTkyMTAyWhcNNDMxMTA0MTkyNjAyWjA/MR8wHQYD
|
5
|
- VQQKDBZFbGl4aXIuWDUwOS5UZXN0LlN1aXRlMRwwGgYDVQQDDBNBbHRlcm5hdGl2
|
6
|
- ZSBSb290IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCzy9CSIY2k8Qj4
|
7
|
- HdfXAONJ6m5OAT39FDRby1JNjsKejf33qZDYPv531+PatOel6kBvc6OUGNO5ltqs
|
8
|
- PgIeuKS8MLWvn+1sJjnAgTg2PrTWO4z0XndVwKnYT+ht3oa56z2A7JjGQE/FjdjE
|
9
|
- 2Jow7Zt7NES/NNncktSnRVUxDe2NJQIDAQABo2YwZDAOBgNVHQ8BAf8EBAMCAYYw
|
10
|
- HQYDVR0OBBYEFMyQsqkgzAOxVFTXOwTGEibqNj/oMB8GA1UdIwQYMBaAFMyQsqkg
|
11
|
- zAOxVFTXOwTGEibqNj/oMBIGA1UdEwEB/wQIMAYBAf8CAQIwDQYJKoZIhvcNAQEL
|
12
|
- BQADgYEACD9/eOYxGD+oDXwi3KLC5DmnqeVrFxqpqU/OD3wp1H7GgeXMfRlYX6xK
|
13
|
- YY66uhyw+TZGhbvhFFuJzTIgwUUKDJPE9MU7fFCwptmVwclosFJJTwddG0UIXQO/
|
14
|
- rMYWrG33L02BEmZ5ayXKMCugg2A4fZmLCYyZs+rKqhM/evmtANg=
|
15
|
- -----END CERTIFICATE-----
|
16
|
-
|
removed
priv/cert/suite/alternate_chain.pem
|
@@ -1,34 +0,0 @@
|
1
|
- -----BEGIN CERTIFICATE-----
|
2
|
- MIICcjCCAdugAwIBAgIIL6ZgSaorUAUwDQYJKoZIhvcNAQELBQAwMzEfMB0GA1UE
|
3
|
- CgwWRWxpeGlyLlg1MDkuVGVzdC5TdWl0ZTEQMA4GA1UEAwwHUm9vdCBDQTAeFw0x
|
4
|
- ODExMDQxOTIxMDJaFw0yODExMDMxOTI2MDJaMDsxHzAdBgNVBAoMFkVsaXhpci5Y
|
5
|
- NTA5LlRlc3QuU3VpdGUxGDAWBgNVBAMMD0ludGVybWVkaWF0ZSBDQTCBnzANBgkq
|
6
|
- hkiG9w0BAQEFAAOBjQAwgYkCgYEAud5hm1X9/ps3RFW6OD057iMhpCB5Eakf7/AR
|
7
|
- wQyiD9Y7z+w20BluX9VAf4bj83HOdyYZEZ4DFdYPB2KSfvj9rVcY3sV9qe3wu6C9
|
8
|
- v0SUbhx441vQSO5ZoRkzuQqNtNiwoF75b1MbMVxVHuQ0ky1dGf+Ppus4gjKg7/z9
|
9
|
- 8uFY/kECAwEAAaOBhjCBgzASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQE
|
10
|
- AwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHQYDVR0OBBYEFObY
|
11
|
- kf965xjT0W9nvyfYh3CeLSZQMB8GA1UdIwQYMBaAFAcjjanqE31rEFzTCtd8D1+V
|
12
|
- 2kRWMA0GCSqGSIb3DQEBCwUAA4GBABTwIJ9s9a3Rnu39b9P2iewXTWtE0ZRb0BdJ
|
13
|
- gY75Cng//cw5lSGT/zWTDU3xcKiDsDtacZiOZcBCg/A5B/j6sBCPbqbK1SNp1GIr
|
14
|
- X5TH/m/3dC/91Se6xJIBLOoDCHxqUzZ57CZPbgXSV/cFD19v6z1csMstX9+pfOwD
|
15
|
- J4LJSKCK
|
16
|
- -----END CERTIFICATE-----
|
17
|
-
|
18
|
- -----BEGIN CERTIFICATE-----
|
19
|
- MIICdzCCAeCgAwIBAgIJAKZB6xPkLCbnMA0GCSqGSIb3DQEBCwUAMD8xHzAdBgNV
|
20
|
- BAoMFkVsaXhpci5YNTA5LlRlc3QuU3VpdGUxHDAaBgNVBAMME0FsdGVybmF0aXZl
|
21
|
- IFJvb3QgQ0EwHhcNMTgxMTA0MTkyMTAyWhcNMjgxMTAzMTkyNjAyWjAzMR8wHQYD
|
22
|
- VQQKDBZFbGl4aXIuWDUwOS5UZXN0LlN1aXRlMRAwDgYDVQQDDAdSb290IENBMIGf
|
23
|
- MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDn1Hk2SebSjuDrcfrQSEW2ykDz+Zmc
|
24
|
- W8lTGYjIF4FefVGBz2tV5vSnTrx7T+y07rfmSKteOkLaauB9Hq9zS4ZvJDyNdlzR
|
25
|
- vvG7tp4UzTgh5YwNRENeAEw/AKlLPCUqdSmV/NCSlSfcVsXGtP/EjBvVdqvNylaJ
|
26
|
- HY0o5BGsFfx0QQIDAQABo4GGMIGDMA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAU
|
27
|
- BggrBgEFBQcDAQYIKwYBBQUHAwIwHQYDVR0OBBYEFAcjjanqE31rEFzTCtd8D1+V
|
28
|
- 2kRWMB8GA1UdIwQYMBaAFMyQsqkgzAOxVFTXOwTGEibqNj/oMBIGA1UdEwEB/wQI
|
29
|
- MAYBAf8CAQEwDQYJKoZIhvcNAQELBQADgYEAe09/h13Xb8gSR/wvKoep4K5xYxGv
|
30
|
- vXRLquEYNaokUvvyduRhUs+BAjV4EG9+eJi/1dPW40FvgVJDS3xuTBugjmG/prx6
|
31
|
- d8JbvgEGv/SU+O3l/Y0LYlj/HeCBKoDxQu26cm3gb/mYKcJT1AaCCJZ95ooYxwxQ
|
32
|
- ZbweXk2gapsnQ+c=
|
33
|
- -----END CERTIFICATE-----
|
34
|
-
|
removed
priv/cert/suite/cacerts.pem
|
@@ -1,16 +0,0 @@
|
1
|
- -----BEGIN CERTIFICATE-----
|
2
|
- MIICSTCCAbKgAwIBAgIIJlzKEu+hugowDQYJKoZIhvcNAQELBQAwMzEfMB0GA1UE
|
3
|
- CgwWRWxpeGlyLlg1MDkuVGVzdC5TdWl0ZTEQMA4GA1UEAwwHUm9vdCBDQTAeFw0x
|
4
|
- ODExMDQxOTIxMDJaFw00MzExMDQxOTI2MDJaMDMxHzAdBgNVBAoMFkVsaXhpci5Y
|
5
|
- NTA5LlRlc3QuU3VpdGUxEDAOBgNVBAMMB1Jvb3QgQ0EwgZ8wDQYJKoZIhvcNAQEB
|
6
|
- BQADgY0AMIGJAoGBAOfUeTZJ5tKO4Otx+tBIRbbKQPP5mZxbyVMZiMgXgV59UYHP
|
7
|
- a1Xm9KdOvHtP7LTut+ZIq146Qtpq4H0er3NLhm8kPI12XNG+8bu2nhTNOCHljA1E
|
8
|
- Q14ATD8AqUs8JSp1KZX80JKVJ9xWxca0/8SMG9V2q83KVokdjSjkEawV/HRBAgMB
|
9
|
- AAGjZjBkMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgGGMB0GA1Ud
|
10
|
- DgQWBBQHI42p6hN9axBc0wrXfA9fldpEVjAfBgNVHSMEGDAWgBQHI42p6hN9axBc
|
11
|
- 0wrXfA9fldpEVjANBgkqhkiG9w0BAQsFAAOBgQDM0mi9WfHfQxKThf0ZnUJv2OVj
|
12
|
- bb6P5fcc+MIKXwhNSdcX68gYf/vgo9fWDnERINvR961ohmskK8tIt8p7CRqEwJHA
|
13
|
- GoEfebFGEAP2raRNXB7tMhV2LodP6DMDyxMdG2RITyGZSOob55T9OCFElfrc9ZBy
|
14
|
- aMkDuoNV7JBmy4dxLw==
|
15
|
- -----END CERTIFICATE-----
|
16
|
-
|
removed
priv/cert/suite/chain.pem
|
@@ -1,17 +0,0 @@
|
1
|
- -----BEGIN CERTIFICATE-----
|
2
|
- MIICcjCCAdugAwIBAgIIL6ZgSaorUAUwDQYJKoZIhvcNAQELBQAwMzEfMB0GA1UE
|
3
|
- CgwWRWxpeGlyLlg1MDkuVGVzdC5TdWl0ZTEQMA4GA1UEAwwHUm9vdCBDQTAeFw0x
|
4
|
- ODExMDQxOTIxMDJaFw0yODExMDMxOTI2MDJaMDsxHzAdBgNVBAoMFkVsaXhpci5Y
|
5
|
- NTA5LlRlc3QuU3VpdGUxGDAWBgNVBAMMD0ludGVybWVkaWF0ZSBDQTCBnzANBgkq
|
6
|
- hkiG9w0BAQEFAAOBjQAwgYkCgYEAud5hm1X9/ps3RFW6OD057iMhpCB5Eakf7/AR
|
7
|
- wQyiD9Y7z+w20BluX9VAf4bj83HOdyYZEZ4DFdYPB2KSfvj9rVcY3sV9qe3wu6C9
|
8
|
- v0SUbhx441vQSO5ZoRkzuQqNtNiwoF75b1MbMVxVHuQ0ky1dGf+Ppus4gjKg7/z9
|
9
|
- 8uFY/kECAwEAAaOBhjCBgzASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQE
|
10
|
- AwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHQYDVR0OBBYEFObY
|
11
|
- kf965xjT0W9nvyfYh3CeLSZQMB8GA1UdIwQYMBaAFAcjjanqE31rEFzTCtd8D1+V
|
12
|
- 2kRWMA0GCSqGSIb3DQEBCwUAA4GBABTwIJ9s9a3Rnu39b9P2iewXTWtE0ZRb0BdJ
|
13
|
- gY75Cng//cw5lSGT/zWTDU3xcKiDsDtacZiOZcBCg/A5B/j6sBCPbqbK1SNp1GIr
|
14
|
- X5TH/m/3dC/91Se6xJIBLOoDCHxqUzZ57CZPbgXSV/cFD19v6z1csMstX9+pfOwD
|
15
|
- J4LJSKCK
|
16
|
- -----END CERTIFICATE-----
|
17
|
-
|
removed
priv/cert/suite/expired.pem
|
@@ -1,17 +0,0 @@
|
1
|
- -----BEGIN CERTIFICATE-----
|
2
|
- MIICizCCAfSgAwIBAgIJAMs2jUtOhALQMA0GCSqGSIb3DQEBCwUAMDsxHzAdBgNV
|
3
|
- BAoMFkVsaXhpci5YNTA5LlRlc3QuU3VpdGUxGDAWBgNVBAMMD0ludGVybWVkaWF0
|
4
|
- ZSBDQTAeFw0xODEyMDQxOTI2MDJaFw0xODExMDMxOTI2MDJaMDMxHzAdBgNVBAoM
|
5
|
- FkVsaXhpci5YNTA5LlRlc3QuU3VpdGUxEDAOBgNVBAMMB0V4cGlyZWQwgZ8wDQYJ
|
6
|
- KoZIhvcNAQEBBQADgY0AMIGJAoGBAOKxTwkdVakTpK0UvZdtEQhjWys1JYKhyfs5
|
7
|
- tB0Zkpkv593qh5DTmqOgS0ZfsE2yz310/wfqyZI+JdlyoBh8rnq/vGUIuZGPFt52
|
8
|
- AAuUk0Rp/nnOngj/khCFaxZ9Y7RQL2gR7ydik24oGOApknQtuGtVja94fu12xDgi
|
9
|
- ey7qc4c9AgMBAAGjgZ4wgZswCQYDVR0TBAIwADAOBgNVHQ8BAf8EBAMCBaAwHQYD
|
10
|
- VR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB0GA1UdDgQWBBSzaLjn9mOm7/Bg
|
11
|
- lT5Tz0jOgzf5eDAfBgNVHSMEGDAWgBTm2JH/eucY09FvZ78n2Idwni0mUDAfBgNV
|
12
|
- HREEGDAWghRleHBpcmVkLmxvY2FsdGVzdC5tZTANBgkqhkiG9w0BAQsFAAOBgQA5
|
13
|
- DapzjkqgnAyNt+Vtc8FDFH2eo4yncTvLR/Vp+Tr6zQ2ccUdHbNi9c2RnZFsk2gXH
|
14
|
- pL+Ra8zRDaT85Ph0xnK3MWXc12QPlZ1mG+p2/8zBqnD7MTG76CCb1rBLofPXFicl
|
15
|
- mH8Aq6CS/cONqOtcQOojnu8bI0KUDaDpNhPSXan7og==
|
16
|
- -----END CERTIFICATE-----
|
17
|
-
|
removed
priv/cert/suite/expired_chain.pem
|
@@ -1,17 +0,0 @@
|
1
|
- -----BEGIN CERTIFICATE-----
|
2
|
- MIICczCCAdygAwIBAgIJANafuMrnGmi3MA0GCSqGSIb3DQEBCwUAMDMxHzAdBgNV
|
3
|
- BAoMFkVsaXhpci5YNTA5LlRlc3QuU3VpdGUxEDAOBgNVBAMMB1Jvb3QgQ0EwHhcN
|
4
|
- MTgxMjA0MTkyNjAyWhcNMTgxMTAzMTkyNjAyWjA7MR8wHQYDVQQKDBZFbGl4aXIu
|
5
|
- WDUwOS5UZXN0LlN1aXRlMRgwFgYDVQQDDA9JbnRlcm1lZGlhdGUgQ0EwgZ8wDQYJ
|
6
|
- KoZIhvcNAQEBBQADgY0AMIGJAoGBALneYZtV/f6bN0RVujg9Oe4jIaQgeRGpH+/w
|
7
|
- EcEMog/WO8/sNtAZbl/VQH+G4/NxzncmGRGeAxXWDwdikn74/a1XGN7Ffant8Lug
|
8
|
- vb9ElG4ceONb0EjuWaEZM7kKjbTYsKBe+W9TGzFcVR7kNJMtXRn/j6brOIIyoO/8
|
9
|
- /fLhWP5BAgMBAAGjgYYwgYMwEgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8E
|
10
|
- BAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB0GA1UdDgQWBBTm
|
11
|
- 2JH/eucY09FvZ78n2Idwni0mUDAfBgNVHSMEGDAWgBQHI42p6hN9axBc0wrXfA9f
|
12
|
- ldpEVjANBgkqhkiG9w0BAQsFAAOBgQB4oxMPyRPK0D+Y9nKmT+2n9zUuS7GZG2lh
|
13
|
- RCB9I4ph/jdSyGjgtVKWk80iW7z1wJtCTfgrWmHS7l4YU5t0hDuiT/EuT/WI/sig
|
14
|
- D1y9fUL12Rr5GXTrUQIAKudvqLQLmlYzmFStD4UTVdHb88sLfwqgNYGAZv0ZaxOQ
|
15
|
- OsLUGjCO4A==
|
16
|
- -----END CERTIFICATE-----
|
17
|
-
|
removed
priv/cert/suite/other_key.pem
|
@@ -1,16 +0,0 @@
|
1
|
- -----BEGIN RSA PRIVATE KEY-----
|
2
|
- MIICWwIBAAKBgQCoU01uDUUdrSooMroD9tsrSSRnmYycrlJGnxMtkjxTmb2uCXxg
|
3
|
- +I2qoR1dfxT50yyE8UiMlz+zApJHeJOXXP9Sb+feb3Z61K3NVtQHjSiPJIV7+nk0
|
4
|
- ub9kstAUQ023FE+ApBHttMgcjBJhKyRbKLRBQYHnsy6iohij5UrliXumXwIDAQAB
|
5
|
- AoGAB5RQrT7tuMteVZcLJziLX+SYPg389eUnkUSCcY/fJYiLsPV+Y0Nt5ZwBnX8m
|
6
|
- a6VloMrYkHQTCzV3br5wLuWiHXpxkxXQPjk4RrmBRo9DPceS+yO7YLvQiAK48sJw
|
7
|
- +R5ajGI/ZTuijXdtG12fjmhnvf/AzR5jIozSqlGZitoWeuECQQDbOll7BmGf/OYO
|
8
|
- oPCB8yYVzXXZttX+g5ugg519lDZn1mHW++MKpTFZjUFri0klj6SKljsfQIN/ovfa
|
9
|
- 0Av5fUJxAkEAxI8ymF4NG313IgeJKRFnxbImVlN2e/g43tv+anyOLaxTY7QlS1ZE
|
10
|
- HkHpHoJtBEH8RTVWEk2jmxxOloHALT49zwJALgdSQkJUvQKcSvX/iUlD9c/troh0
|
11
|
- 5bs8Mbdwma1EvwiEAl9gjBujAOpnkezsrrY6Fd71CtrAwUu2PnrwCLIEAQJAGpys
|
12
|
- o/Zv3d3xyDiu+FFz9E83Y46vRv+Ha5zraC1u7n4bWC9msTl/xXz0+/16lw38Ar7C
|
13
|
- 5X1/fhuqBDSS+U0o/wJAbFzse3lrMBwWjQMTZ0YR21KcH9MKMgZMnLfr+kWrOar9
|
14
|
- ZKKK5KBE1g5kUg9GOCxCsyGu9v16DXG5/Qx7PnvX0A==
|
15
|
- -----END RSA PRIVATE KEY-----
|
16
|
-
|
removed
priv/cert/suite/revoked.pem
|
@@ -1,17 +0,0 @@
|
1
|
- -----BEGIN CERTIFICATE-----
|
2
|
- MIICizCCAfSgAwIBAgIJAIeQzz22IvmzMA0GCSqGSIb3DQEBCwUAMDsxHzAdBgNV
|
3
|
- BAoMFkVsaXhpci5YNTA5LlRlc3QuU3VpdGUxGDAWBgNVBAMMD0ludGVybWVkaWF0
|
4
|
- ZSBDQTAeFw0xODExMDQxOTIxMDJaFw0xOTEyMDQxOTI2MDJaMDMxHzAdBgNVBAoM
|
5
|
- FkVsaXhpci5YNTA5LlRlc3QuU3VpdGUxEDAOBgNVBAMMB1Jldm9rZWQwgZ8wDQYJ
|
6
|
- KoZIhvcNAQEBBQADgY0AMIGJAoGBAOKxTwkdVakTpK0UvZdtEQhjWys1JYKhyfs5
|
7
|
- tB0Zkpkv593qh5DTmqOgS0ZfsE2yz310/wfqyZI+JdlyoBh8rnq/vGUIuZGPFt52
|
8
|
- AAuUk0Rp/nnOngj/khCFaxZ9Y7RQL2gR7ydik24oGOApknQtuGtVja94fu12xDgi
|
9
|
- ey7qc4c9AgMBAAGjgZ4wgZswCQYDVR0TBAIwADAOBgNVHQ8BAf8EBAMCBaAwHQYD
|
10
|
- VR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB0GA1UdDgQWBBSzaLjn9mOm7/Bg
|
11
|
- lT5Tz0jOgzf5eDAfBgNVHSMEGDAWgBTm2JH/eucY09FvZ78n2Idwni0mUDAfBgNV
|
12
|
- HREEGDAWghRyZXZva2VkLmxvY2FsdGVzdC5tZTANBgkqhkiG9w0BAQsFAAOBgQBM
|
13
|
- CGeBdgY0cTKBlM6EfrsJyKV6qtKLjdZAlNqmvn1tOobaTFM6VCDdwrIpKM1xkcqm
|
14
|
- FwQlC/PnjIMoulWPmTHiQFkPCBzr8ehiflO1z8pjZXXxJl6GwZBFy3HdthNO4MAy
|
15
|
- 8leu7+SIpGBh/TIEGpQkDVo0y6hWn9Y4g6xw8tgHnw==
|
16
|
- -----END CERTIFICATE-----
|
17
|
-
|
removed
priv/cert/suite/revoked_chain.pem
|
@@ -1,17 +0,0 @@
|
1
|
- -----BEGIN CERTIFICATE-----
|
2
|
- MIICczCCAdygAwIBAgIJAKBvZwT5ZW4hMA0GCSqGSIb3DQEBCwUAMDMxHzAdBgNV
|
3
|
- BAoMFkVsaXhpci5YNTA5LlRlc3QuU3VpdGUxEDAOBgNVBAMMB1Jvb3QgQ0EwHhcN
|
4
|
- MTgxMTA0MTkyMTAyWhcNMjgxMTAzMTkyNjAyWjA7MR8wHQYDVQQKDBZFbGl4aXIu
|
5
|
- WDUwOS5UZXN0LlN1aXRlMRgwFgYDVQQDDA9JbnRlcm1lZGlhdGUgQ0EwgZ8wDQYJ
|
6
|
- KoZIhvcNAQEBBQADgY0AMIGJAoGBALneYZtV/f6bN0RVujg9Oe4jIaQgeRGpH+/w
|
7
|
- EcEMog/WO8/sNtAZbl/VQH+G4/NxzncmGRGeAxXWDwdikn74/a1XGN7Ffant8Lug
|
8
|
- vb9ElG4ceONb0EjuWaEZM7kKjbTYsKBe+W9TGzFcVR7kNJMtXRn/j6brOIIyoO/8
|
9
|
- /fLhWP5BAgMBAAGjgYYwgYMwEgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8E
|
10
|
- BAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB0GA1UdDgQWBBTm
|
11
|
- 2JH/eucY09FvZ78n2Idwni0mUDAfBgNVHSMEGDAWgBQHI42p6hN9axBc0wrXfA9f
|
12
|
- ldpEVjANBgkqhkiG9w0BAQsFAAOBgQBdKVqpMEyHEYHJ2FXcHlV2Fq1dF2vhfNKh
|
13
|
- guBmFzpmPdy6xDh3xSfoEJ+K/crENLwOyyC8wGZ8+BEkHPFG21jTiylDe727r2A6
|
14
|
- iv3ZAWXhKI2MMLyflig6oaU3gxVIzGXtmZQAulHVTmMbQCBKg+jFXqkvnSrXRXBu
|
15
|
- 9+VW75tKoA==
|
16
|
- -----END CERTIFICATE-----
|
17
|
-
|
removed
priv/cert/suite/selfsigned.pem
|
@@ -1,18 +0,0 @@
|
1
|
- -----BEGIN CERTIFICATE-----
|
2
|
- MIICsDCCAhmgAwIBAgIIB5CjoKvjWJ4wDQYJKoZIhvcNAQELBQAwNzEfMB0GA1UE
|
3
|
- CgwWRWxpeGlyLlg1MDkuVGVzdC5TdWl0ZTEUMBIGA1UEAwwLU2VsZi1zaWduZWQw
|
4
|
- HhcNMTgxMTA0MTkyMTAyWhcNMTkxMjA0MTkyNjAyWjA3MR8wHQYDVQQKDBZFbGl4
|
5
|
- aXIuWDUwOS5UZXN0LlN1aXRlMRQwEgYDVQQDDAtTZWxmLXNpZ25lZDCBnzANBgkq
|
6
|
- hkiG9w0BAQEFAAOBjQAwgYkCgYEA4rFPCR1VqROkrRS9l20RCGNbKzUlgqHJ+zm0
|
7
|
- HRmSmS/n3eqHkNOao6BLRl+wTbLPfXT/B+rJkj4l2XKgGHyuer+8ZQi5kY8W3nYA
|
8
|
- C5STRGn+ec6eCP+SEIVrFn1jtFAvaBHvJ2KTbigY4CmSdC24a1WNr3h+7XbEOCJ7
|
9
|
- Lupzhz0CAwEAAaOBxDCBwTAJBgNVHRMEAjAAMA4GA1UdDwEB/wQEAwIFoDAdBgNV
|
10
|
- HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHQYDVR0OBBYEFLNouOf2Y6bv8GCV
|
11
|
- PlPPSM6DN/l4MB8GA1UdIwQYMBaAFLNouOf2Y6bv8GCVPlPPSM6DN/l4MEUGA1Ud
|
12
|
- EQQ+MDyCF3NlbGZzaWduZWQubG9jYWx0ZXN0Lm1lgiFzZWxmc2lnbmVkLXdyb25n
|
13
|
- LWtleS5sb2NhbHRlc3QubWUwDQYJKoZIhvcNAQELBQADgYEAIUieY+TwWvi6uUFK
|
14
|
- fKsJhlE8wQSG98YqnHPJTDBCUmTFX6QO0YSJ9mtV9lQ/ayH/bccRwZAB0/5+HqSj
|
15
|
- OESHfyv0AtpLdgDJyoxv5c8FkYO87TJicW4g86gtI5zzMymPZutGme2fvwX2XRRx
|
16
|
- TANwNqHxJXLwuxSscxaUJ/5PSsg=
|
17
|
- -----END CERTIFICATE-----
|
18
|
-
|
removed
priv/cert/suite/server_key.pem
|
@@ -1,16 +0,0 @@
|
1
|
- -----BEGIN RSA PRIVATE KEY-----
|
2
|
- MIICXQIBAAKBgQDisU8JHVWpE6StFL2XbREIY1srNSWCocn7ObQdGZKZL+fd6oeQ
|
3
|
- 05qjoEtGX7BNss99dP8H6smSPiXZcqAYfK56v7xlCLmRjxbedgALlJNEaf55zp4I
|
4
|
- /5IQhWsWfWO0UC9oEe8nYpNuKBjgKZJ0LbhrVY2veH7tdsQ4Insu6nOHPQIDAQAB
|
5
|
- AoGBAKubpkU0G8Ceyi7sYIndWuOKs12GIhs99vVjvWG6Fiw5A8IO5QlR5uKvWcyw
|
6
|
- a3qmPkSu6NFJf8Zhna17BI8E898zVwkBHJ9X2tHbdRPMjofDHHcxRnxjNrKkEV2x
|
7
|
- mTcKheEa+wIWTPVB5B3a93NoxcrOnpvrV0Hy8Xks70J2GwyBAkEA/MLgv5XhjcQF
|
8
|
- v/APE6BoW0flKXpkOwFsbYUYNqOk9XpZ4jF3ppHXvuIL0+e/m3QhmwoXsCylw0Fc
|
9
|
- IpTchFmcmQJBAOWY60I8uMEPQwRV4LavA4NUN+ZafyHNJf0BFbAKlpxWllhhgIDA
|
10
|
- 0iuTVwhssKYIqSVcYlXF0SyMT9xwCUOAIkUCQBB27Ubtj3S5mRpIm+LOZx3TEBVk
|
11
|
- mJTTYem8arhcboli/+nhCQc7ps8TUGvsQ6nvpaTAwoxCTEXswwCpq7efUrkCQG5E
|
12
|
- YgB+zzCRVttXL0Qti59gLDSqk9I1B6CaC8NvYmQVRcGOmju733RkH/GA2dnz4OB7
|
13
|
- nRKandoqTRSOjjRn7o0CQQDYoMn0awnnTpFSHy2CyBMnzzgogc6YNH7DkGrZehKb
|
14
|
- nlZhxRRqgpNe8Jp8iOiIx+ya0OzLzNKvp6a0NkauIt9B
|
15
|
- -----END RSA PRIVATE KEY-----
|
16
|
-
|
removed
priv/cert/suite/valid.pem
|
@@ -1,20 +0,0 @@
|
1
|
- -----BEGIN CERTIFICATE-----
|
2
|
- MIIDEDCCAnmgAwIBAgIJAIT6hjbLrocmMA0GCSqGSIb3DQEBCwUAMDsxHzAdBgNV
|
3
|
- BAoMFkVsaXhpci5YNTA5LlRlc3QuU3VpdGUxGDAWBgNVBAMMD0ludGVybWVkaWF0
|
4
|
- ZSBDQTAeFw0xODExMDQxOTIxMDJaFw0xOTEyMDQxOTI2MDJaMDIxHzAdBgNVBAoM
|
5
|
- FkVsaXhpci5YNTA5LlRlc3QuU3VpdGUxDzANBgNVBAMMBlNlcnZlcjCBnzANBgkq
|
6
|
- hkiG9w0BAQEFAAOBjQAwgYkCgYEA4rFPCR1VqROkrRS9l20RCGNbKzUlgqHJ+zm0
|
7
|
- HRmSmS/n3eqHkNOao6BLRl+wTbLPfXT/B+rJkj4l2XKgGHyuer+8ZQi5kY8W3nYA
|
8
|
- C5STRGn+ec6eCP+SEIVrFn1jtFAvaBHvJ2KTbigY4CmSdC24a1WNr3h+7XbEOCJ7
|
9
|
- Lupzhz0CAwEAAaOCASMwggEfMAkGA1UdEwQCMAAwDgYDVR0PAQH/BAQDAgWgMB0G
|
10
|
- A1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAdBgNVHQ4EFgQUs2i45/Zjpu/w
|
11
|
- YJU+U89IzoM3+XgwHwYDVR0jBBgwFoAU5tiR/3rnGNPRb2e/J9iHcJ4tJlAwgaIG
|
12
|
- A1UdEQSBmjCBl4ISdmFsaWQubG9jYWx0ZXN0Lm1lgiB2YWxpZC1taXNzaW5nLWNo
|
13
|
- YWluLmxvY2FsdGVzdC5tZYIgdmFsaWQtcmV2b2tlZC1jaGFpbi5sb2NhbHRlc3Qu
|
14
|
- bWWCHHZhbGlkLXdyb25nLWtleS5sb2NhbHRlc3QubWWCH3ZhbGlkLWNyb3NzLXNp
|
15
|
- Z25lZC5sb2NhbHRlc3QubWUwDQYJKoZIhvcNAQELBQADgYEAnbLTyNijhJnWVu2j
|
16
|
- PDo+ZTEXNihsReeZQYvZSzQijY1EBXJ0sCUIc/9xnTXS9NJgIlp4vL90IhIcRJlv
|
17
|
- q1d9bA8aOJdgOqUoB4+8VRoz9voI1ASNuFl6VPKLk2135wBrPYIUMIuPSJalOOvO
|
18
|
- AgZHesmORyMRG476YZm7oUAgTBc=
|
19
|
- -----END CERTIFICATE-----
|
20
|
-
|
removed
priv/cert/suite/wildcard.pem
|
@@ -1,17 +0,0 @@
|
1
|
- -----BEGIN CERTIFICATE-----
|
2
|
- MIICjzCCAfigAwIBAgIJALmBmxIdtBPUMA0GCSqGSIb3DQEBCwUAMDsxHzAdBgNV
|
3
|
- BAoMFkVsaXhpci5YNTA5LlRlc3QuU3VpdGUxGDAWBgNVBAMMD0ludGVybWVkaWF0
|
4
|
- ZSBDQTAeFw0xODExMDQxOTIxMDJaFw0xOTEyMDQxOTI2MDJaMDQxHzAdBgNVBAoM
|
5
|
- FkVsaXhpci5YNTA5LlRlc3QuU3VpdGUxETAPBgNVBAMMCFdpbGRjYXJkMIGfMA0G
|
6
|
- CSqGSIb3DQEBAQUAA4GNADCBiQKBgQDisU8JHVWpE6StFL2XbREIY1srNSWCocn7
|
7
|
- ObQdGZKZL+fd6oeQ05qjoEtGX7BNss99dP8H6smSPiXZcqAYfK56v7xlCLmRjxbe
|
8
|
- dgALlJNEaf55zp4I/5IQhWsWfWO0UC9oEe8nYpNuKBjgKZJ0LbhrVY2veH7tdsQ4
|
9
|
- Insu6nOHPQIDAQABo4GhMIGeMAkGA1UdEwQCMAAwDgYDVR0PAQH/BAQDAgWgMB0G
|
10
|
- A1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAdBgNVHQ4EFgQUs2i45/Zjpu/w
|
11
|
- YJU+U89IzoM3+XgwHwYDVR0jBBgwFoAU5tiR/3rnGNPRb2e/J9iHcJ4tJlAwIgYD
|
12
|
- VR0RBBswGYIXKi53aWxkY2FyZC5sb2NhbHRlc3QubWUwDQYJKoZIhvcNAQELBQAD
|
13
|
- gYEAWjZAbmrp9u/IbWNCDO25BTYdx8DF15jS6eukdr3e5DMQ4N0j5skPqhUpGWcO
|
14
|
- AcSPCpFDl6fdL+b/FyqcIGsFJ+GcQvMUx+jH5ne1ymzZO+x4Oa0Wis9Y2+Vg5ffz
|
15
|
- h1IUgtCk1FdamJ4qGUeb5auiGpQ+FfJCtdBtDWVvOO/FDpo=
|
16
|
- -----END CERTIFICATE-----
|
17
|
-
|