Skip to content

Commit 7141733

Browse files
committed
Wildcard patterns in certificates support
Support server address aliasing for client side. It allows connect to localhost, but test server certificate for another real server address. * config/ssl/aws-net-ssl__gnutls.adb, config/ssl/aws-net-ssl__openssl.adb: Search certificate with wildcard pattern if exact name certificate not found. * src/core/aws-net.ad[sb] (Set_Host_Alias): New routine. * config/src/aws-net-std__gnat.adb (Connect): Connect to real host if alias is defined. aws-net-std__ipv4.adb and aws-net-std__ipv6.adb does not support it because they are candidates to remove. * regtests/0041_cert/cert.adb: Test server certificate for alias www.ada-web.org.
1 parent c3a9a53 commit 7141733

22 files changed

+585
-272
lines changed

config/src/aws-net-std__gnat.adb

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,11 @@ package body AWS.Net.Std is
181181
Family : Family_Type := Family_Unspec)
182182
is
183183
Sock_Addr : Sockets.Sock_Addr_Type := Sockets.No_Sock_Addr;
184+
C_Host : constant Containers.Key_Value.Cursor := Aliases.Find (Host);
185+
Real_Host : constant String :=
186+
(if Containers.Key_Value.Has_Element (C_Host)
187+
then Containers.Key_Value.Element (C_Host)
188+
else Host);
184189

185190
Close_On_Exception : Boolean := False;
186191

@@ -202,12 +207,12 @@ package body AWS.Net.Std is
202207

203208
Addr : constant String := Sockets.Image (Sock_Addr);
204209
Msg : constant String :=
205-
(if Ada.Strings.Fixed.Index (Errm, Host) > 0 then Errm else
206-
Error_On_Connect (Errm)
210+
(if Ada.Strings.Fixed.Index (Errm, Real_Host) > 0 then Errm
211+
else Error_On_Connect (Errm)
207212
& (if Sock_Addr.Addr = Sockets.No_Inet_Addr
208-
then Host & ':' & Utils.Image (Port)
209-
elsif Utils.Match (Addr, Host) then Addr
210-
else Host & ' ' & Addr));
213+
then Real_Host & ':' & Utils.Image (Port)
214+
elsif Utils.Match (Addr, Real_Host) then Addr
215+
else Real_Host & ' ' & Addr));
211216
begin
212217
Log.Error (Socket, Msg);
213218

@@ -230,7 +235,7 @@ package body AWS.Net.Std is
230235
Keep_Excp : Exceptions.Exception_Occurrence;
231236
Addresses : constant Address_Info_Array :=
232237
Get_Address_Info
233-
(Host, "", To_GNAT (Family), Passive => False);
238+
(Real_Host, "", To_GNAT (Family), Passive => False);
234239
begin
235240
for Addr_Info of Addresses loop
236241
Check_Address : begin

config/ssl/aws-net-ssl__gnutls.adb

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1562,18 +1562,22 @@ package body AWS.Net.SSL is
15621562

15631563
function Get_Server_Name return String is
15641564
RC : constant C.int := TSSL.gnutls_server_name_get
1565-
(Session, SN'Address, Size'Unchecked_Access,
1566-
Kind'Access, 0);
1565+
(Session, SN'Address, Size'Unchecked_Access, Kind'Access, 0);
1566+
15671567
begin
15681568
case RC is
15691569
when TSSL.GNUTLS_E_SHORT_MEMORY_BUFFER =>
1570-
Log_Error ("Requested server name too long " & C.To_Ada (SN)
1571-
& Size'Img);
1570+
Log_Error
1571+
("Requested server name too long " & C.To_Ada (SN) & Size'Img);
1572+
15721573
return "";
1574+
15731575
when TSSL.GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE =>
15741576
return "";
1577+
15751578
when TSSL.GNUTLS_E_SUCCESS =>
15761579
return C.To_Ada (SN);
1580+
15771581
when others =>
15781582
raise Socket_Error with
15791583
"gnutls_server_name_get error code " & RC'Img;
@@ -1583,17 +1587,30 @@ package body AWS.Net.SSL is
15831587
begin
15841588
if Cfg.PCert_Lists.Length = 1 then
15851589
-- Server does not expect different SNI requests
1590+
15861591
CN := Cfg.PCert_Lists.First;
1592+
15871593
else
15881594
declare
15891595
Server_Name : constant String := Get_Server_Name;
15901596
begin
15911597
CN := Cfg.PCert_Lists.Find (Server_Name);
15921598

15931599
if not Host_Certificates.Has_Element (CN) then
1594-
Log_Error
1595-
("Certifiace for server '" & Server_Name & "' not found");
1596-
CN := Cfg.PCert_Lists.Find ("");
1600+
declare
1601+
Wilded : constant String :=
1602+
Wildcard_Before_Dot (Server_Name);
1603+
begin
1604+
if Wilded /= Server_Name then
1605+
CN := Cfg.PCert_Lists.Find (Wilded);
1606+
end if;
1607+
end;
1608+
1609+
if not Host_Certificates.Has_Element (CN) then
1610+
Log_Error
1611+
("Certifiace for server '" & Server_Name & "' not found");
1612+
CN := Cfg.PCert_Lists.Find ("");
1613+
end if;
15971614
end if;
15981615
end;
15991616
end if;

config/ssl/aws-net-ssl__openssl.adb

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1176,10 +1176,25 @@ package body AWS.Net.SSL is
11761176
return TSSL.SSL_TLSEXT_ERR_OK;
11771177
end if;
11781178

1179-
CH := Hosts.Find (Value (Server_Name));
1179+
declare
1180+
Host : constant String := Value (Server_Name);
1181+
begin
1182+
CH := Hosts.Find (Host);
1183+
1184+
if not Host_Certificates.Has_Element (CH) then
1185+
declare
1186+
Wilded : constant String := Wildcard_Before_Dot (Host);
1187+
begin
1188+
if Wilded /= Host then
1189+
CH := Hosts.Find (Wilded);
1190+
end if;
1191+
end;
1192+
end if;
1193+
end;
11801194

11811195
if Host_Certificates.Has_Element (CH) then
1182-
Dummy := TSSL.SSL_set_SSL_CTX (Session, Hosts.all (CH));
1196+
Dummy := TSSL.SSL_set_SSL_CTX
1197+
(Session, Host_Certificates.Element (CH));
11831198
end if;
11841199

11851200
return TSSL.SSL_TLSEXT_ERR_OK;

regtests/0041_cert/aws-client.pem

Lines changed: 76 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,97 +1,97 @@
11
Certificate:
22
Data:
33
Version: 1 (0x0)
4-
Serial Number: 43948 (0xabac)
4+
Serial Number: 43950 (0xabae)
55
Signature Algorithm: sha256WithRSAEncryption
66
Issuer: C=FR, ST=Ile de France, L=Magny les Hameaux, O=AWS Team, CN=Pascal Obry/emailAddress=aws@obry.net
77
Validity
8-
Not Before: Feb 13 13:17:45 2021 GMT
9-
Not After : Feb 13 13:17:45 2022 GMT
8+
Not Before: Apr 4 13:07:01 2021 GMT
9+
Not After : Apr 2 13:07:01 2031 GMT
1010
Subject: C=FR, ST=Ile de France, O=AWS Team, CN=Jean Dupont/emailAddress=jean.dupont@nowhere.com
1111
Subject Public Key Info:
1212
Public Key Algorithm: rsaEncryption
1313
RSA Public-Key: (2048 bit)
1414
Modulus:
15-
00:c3:1d:56:a4:3d:cf:ca:f3:8b:5b:f9:66:56:4d:
16-
ba:b8:c7:88:d5:2d:7c:59:e2:9e:df:6e:17:14:74:
17-
b0:27:b7:83:bc:f0:b4:65:e7:0a:00:09:77:5f:63:
18-
20:9d:99:6b:5f:21:58:77:be:cf:9d:bd:81:07:60:
19-
fe:a2:8c:c7:8d:c0:e0:73:30:ca:2c:fb:90:f6:fd:
20-
73:f3:27:d2:ad:3e:e6:9a:71:88:c6:27:0a:12:99:
21-
02:a8:19:35:d3:94:d9:ac:56:d9:4d:b1:eb:2e:67:
22-
39:b8:15:3a:68:3c:1c:37:18:4a:32:5a:3e:79:74:
23-
83:3a:ab:78:55:db:05:3f:fd:f3:55:6d:24:e9:7c:
24-
c0:60:bd:32:20:b6:f9:49:09:2b:30:b7:57:84:9e:
25-
e7:05:fe:d9:2e:4c:5a:32:06:bc:cb:b0:8c:8f:5e:
26-
5c:e8:4e:7c:ff:c3:10:8a:43:f4:c4:cf:1a:70:e0:
27-
a3:89:94:58:de:05:bc:ae:e5:28:4d:51:b9:0a:3f:
28-
79:ed:7a:4a:d3:14:8b:39:f9:8a:8b:14:b3:9b:4d:
29-
b2:20:e2:27:00:c7:a4:e7:8d:66:85:7c:ae:ae:a1:
30-
c9:51:01:ac:0e:ed:44:99:d1:bf:bd:f1:8b:55:f0:
31-
5f:39:39:dd:a5:d4:0b:52:ab:94:a9:d3:80:a4:fc:
32-
bc:2d
15+
00:ce:47:3a:a8:0f:34:ad:a5:d3:f0:66:a8:15:71:
16+
38:db:8e:53:6d:93:9a:f3:e9:7f:03:25:33:45:3f:
17+
83:ef:26:4c:78:f7:95:a5:3a:9c:fb:84:25:f0:da:
18+
85:98:44:8c:fe:27:b0:8c:82:fe:83:6b:91:24:f9:
19+
c2:6c:1b:b9:a6:e4:7b:6d:8a:26:2a:94:f2:c0:14:
20+
98:6e:3d:81:57:99:75:5b:5e:8f:bc:33:35:c7:83:
21+
f5:a3:25:3e:11:57:11:c1:6c:d6:9a:31:b8:9e:e6:
22+
88:b0:ff:cc:b4:93:bc:f5:fa:02:29:a3:ae:e8:dd:
23+
0d:de:ff:e9:af:c1:f6:8a:c2:5b:72:ae:12:bc:9e:
24+
36:6b:28:b8:13:1f:66:70:ec:f6:a9:a8:a2:b8:28:
25+
a0:2c:98:63:fb:f8:92:66:43:b0:3d:7d:03:35:b1:
26+
8f:79:9f:f1:65:28:be:65:3f:c3:7f:9a:09:d0:c4:
27+
b3:f6:6a:08:55:4b:22:60:a8:84:59:8c:2c:32:8e:
28+
10:3e:b2:9f:f2:e8:a8:e1:37:88:77:24:9d:6d:63:
29+
10:60:4c:39:99:d6:73:c5:06:f8:69:65:08:a1:1b:
30+
7c:dd:5f:b1:8f:1f:0a:cf:11:27:35:32:04:68:a3:
31+
0d:53:00:cb:5f:35:d4:19:e6:71:22:77:57:cb:93:
32+
ea:d1
3333
Exponent: 65537 (0x10001)
3434
Signature Algorithm: sha256WithRSAEncryption
35-
a4:6c:0b:d6:c6:a2:08:1f:1f:db:67:dc:32:2b:a8:7d:4b:d4:
36-
54:3b:69:67:40:41:89:96:bb:76:96:62:2f:26:ec:f5:2c:17:
37-
d0:14:cd:31:45:2c:fb:5f:3a:77:32:df:09:b1:fc:ea:cb:99:
38-
ea:3a:82:3a:14:e4:69:a2:9a:d6:ad:e8:0f:5c:57:58:ad:0a:
39-
ce:34:5d:f0:e1:f0:97:db:35:8e:9a:9f:8b:be:60:e7:30:be:
40-
4b:d2:15:13:20:b0:29:94:ee:45:75:1b:e4:67:80:7e:c8:d3:
41-
a0:70:88:e4:51:67:2e:ef:2e:48:72:80:f4:d3:e0:29:bc:c2:
42-
d5:7c:20:46:43:00:b0:46:19:6a:e1:5f:44:c7:c7:0a:34:1d:
43-
8f:93:47:e1:7b:df:b5:c8:9f:1d:1e:78:f6:02:61:6a:b8:9a:
44-
bf:55:67:71:16:c1:46:b2:81:c5:a7:01:d6:51:44:0e:b0:19:
45-
90:e7:4b:0c:68:18:b1:b2:a3:84:08:d3:6a:83:3a:52:64:b8:
46-
7c:50:1d:44:73:66:aa:32:52:5b:f4:1c:d0:37:f5:29:e3:a1:
47-
a7:ae:ab:d7:c7:f6:c4:ee:43:66:c3:4f:bb:38:0c:6b:95:7f:
48-
83:f7:62:23:85:7f:8f:48:58:8a:2c:14:ce:cf:01:a4:4c:92:
49-
a3:f6:ca:1e
35+
1e:a0:d9:8b:47:86:ee:3b:a4:a1:b4:64:01:b5:eb:a1:d1:6d:
36+
53:a6:75:81:bb:54:cc:7a:86:d1:13:1c:f5:2d:83:11:14:b9:
37+
35:3a:6c:95:e1:44:a6:fe:3a:d7:29:c1:d5:ee:bf:e7:28:6e:
38+
f7:b5:a5:77:99:4e:7b:f0:29:4f:d3:d1:c1:eb:c6:98:6b:e3:
39+
74:bf:76:bc:a9:4e:19:9c:fa:09:86:df:0b:40:a6:a2:7c:43:
40+
f3:77:db:6f:e8:62:91:50:71:cf:a6:f5:2f:69:19:0c:e1:8f:
41+
cd:d6:92:ab:e5:d9:f0:77:e5:8d:40:40:27:f8:ec:76:87:fd:
42+
06:2a:c9:a0:8b:39:73:4f:f2:d9:4b:b9:cb:fe:4e:dd:0f:80:
43+
bc:cb:64:14:f9:57:54:43:d7:6f:a5:7a:c3:04:ac:9a:21:d5:
44+
69:1c:53:b3:97:9d:c6:af:42:4d:fe:02:be:c6:25:a1:3e:14:
45+
17:1f:c3:e9:30:da:17:25:bf:f3:8f:c5:25:2f:9e:44:a9:8f:
46+
d8:88:01:d5:3b:e0:c4:ec:f0:9f:bb:80:00:fa:6d:9d:50:e8:
47+
1d:38:a0:73:33:b0:27:36:1f:ec:1b:0d:ca:0a:58:74:eb:2e:
48+
82:df:7e:49:23:c1:1c:32:95:cd:b0:93:22:21:e6:63:eb:49:
49+
2f:68:bd:5f
5050
-----BEGIN CERTIFICATE-----
51-
MIIDdDCCAlwCAwCrrDANBgkqhkiG9w0BAQsFADCBhzELMAkGA1UEBhMCRlIxFjAU
51+
MIIDdDCCAlwCAwCrrjANBgkqhkiG9w0BAQsFADCBhzELMAkGA1UEBhMCRlIxFjAU
5252
BgNVBAgMDUlsZSBkZSBGcmFuY2UxGjAYBgNVBAcMEU1hZ255IGxlcyBIYW1lYXV4
5353
MREwDwYDVQQKDAhBV1MgVGVhbTEUMBIGA1UEAwwLUGFzY2FsIE9icnkxGzAZBgkq
54-
hkiG9w0BCQEWDGF3c0BvYnJ5Lm5ldDAeFw0yMTAyMTMxMzE3NDVaFw0yMjAyMTMx
55-
MzE3NDVaMHYxCzAJBgNVBAYTAkZSMRYwFAYDVQQIDA1JbGUgZGUgRnJhbmNlMREw
54+
hkiG9w0BCQEWDGF3c0BvYnJ5Lm5ldDAeFw0yMTA0MDQxMzA3MDFaFw0zMTA0MDIx
55+
MzA3MDFaMHYxCzAJBgNVBAYTAkZSMRYwFAYDVQQIDA1JbGUgZGUgRnJhbmNlMREw
5656
DwYDVQQKDAhBV1MgVGVhbTEUMBIGA1UEAwwLSmVhbiBEdXBvbnQxJjAkBgkqhkiG
5757
9w0BCQEWF2plYW4uZHVwb250QG5vd2hlcmUuY29tMIIBIjANBgkqhkiG9w0BAQEF
58-
AAOCAQ8AMIIBCgKCAQEAwx1WpD3PyvOLW/lmVk26uMeI1S18WeKe324XFHSwJ7eD
59-
vPC0ZecKAAl3X2MgnZlrXyFYd77Pnb2BB2D+oozHjcDgczDKLPuQ9v1z8yfSrT7m
60-
mnGIxicKEpkCqBk105TZrFbZTbHrLmc5uBU6aDwcNxhKMlo+eXSDOqt4VdsFP/3z
61-
VW0k6XzAYL0yILb5SQkrMLdXhJ7nBf7ZLkxaMga8y7CMj15c6E58/8MQikP0xM8a
62-
cOCjiZRY3gW8ruUoTVG5Cj957XpK0xSLOfmKixSzm02yIOInAMek541mhXyurqHJ
63-
UQGsDu1EmdG/vfGLVfBfOTndpdQLUquUqdOApPy8LQIDAQABMA0GCSqGSIb3DQEB
64-
CwUAA4IBAQCkbAvWxqIIHx/bZ9wyK6h9S9RUO2lnQEGJlrt2lmIvJuz1LBfQFM0x
65-
RSz7Xzp3Mt8Jsfzqy5nqOoI6FORpoprWregPXFdYrQrONF3w4fCX2zWOmp+LvmDn
66-
ML5L0hUTILAplO5FdRvkZ4B+yNOgcIjkUWcu7y5IcoD00+ApvMLVfCBGQwCwRhlq
67-
4V9Ex8cKNB2Pk0fhe9+1yJ8dHnj2AmFquJq/VWdxFsFGsoHFpwHWUUQOsBmQ50sM
68-
aBixsqOECNNqgzpSZLh8UB1Ec2aqMlJb9BzQN/Up46GnrqvXx/bE7kNmw0+7OAxr
69-
lX+D92IjhX+PSFiKLBTOzwGkTJKj9soe
58+
AAOCAQ8AMIIBCgKCAQEAzkc6qA80raXT8GaoFXE4245TbZOa8+l/AyUzRT+D7yZM
59+
ePeVpTqc+4Ql8NqFmESM/iewjIL+g2uRJPnCbBu5puR7bYomKpTywBSYbj2BV5l1
60+
W16PvDM1x4P1oyU+EVcRwWzWmjG4nuaIsP/MtJO89foCKaOu6N0N3v/pr8H2isJb
61+
cq4SvJ42ayi4Ex9mcOz2qaiiuCigLJhj+/iSZkOwPX0DNbGPeZ/xZSi+ZT/Df5oJ
62+
0MSz9moIVUsiYKiEWYwsMo4QPrKf8uio4TeIdySdbWMQYEw5mdZzxQb4aWUIoRt8
63+
3V+xjx8KzxEnNTIEaKMNUwDLXzXUGeZxIndXy5Pq0QIDAQABMA0GCSqGSIb3DQEB
64+
CwUAA4IBAQAeoNmLR4buO6ShtGQBteuh0W1TpnWBu1TMeobRExz1LYMRFLk1OmyV
65+
4USm/jrXKcHV7r/nKG73taV3mU578ClP09HB68aYa+N0v3a8qU4ZnPoJht8LQKai
66+
fEPzd9tv6GKRUHHPpvUvaRkM4Y/N1pKr5dnwd+WNQEAn+Ox2h/0GKsmgizlzT/LZ
67+
S7nL/k7dD4C8y2QU+VdUQ9dvpXrDBKyaIdVpHFOzl53Gr0JN/gK+xiWhPhQXH8Pp
68+
MNoXJb/zj8UlL55EqY/YiAHVO+DE7PCfu4AA+m2dUOgdOKBzM7AnNh/sGw3KClh0
69+
6y6C335JI8EcMpXNsJMiIeZj60kvaL1f
7070
-----END CERTIFICATE-----
7171
-----BEGIN RSA PRIVATE KEY-----
72-
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
9797
-----END RSA PRIVATE KEY-----

0 commit comments

Comments
 (0)