| Index: net/tools/testserver/minica.py | 
| diff --git a/net/tools/testserver/minica.py b/net/tools/testserver/minica.py | 
| index 3395daf97ac7301bd34bfd1ae57f321197de4a62..62991ffba2ea385c559366253339e87372a26554 100644 | 
| --- a/net/tools/testserver/minica.py | 
| +++ b/net/tools/testserver/minica.py | 
| @@ -216,11 +216,12 @@ OCSP_TYPE_BASIC = asn1.OID([1, 3, 6, 1, 5, 5, 7, 48, 1, 1]) | 
| ORGANIZATION = asn1.OID([2, 5, 4, 10]) | 
| PUBLIC_KEY_RSA = asn1.OID([1, 2, 840, 113549, 1, 1, 1]) | 
| SHA256_WITH_RSA_ENCRYPTION = asn1.OID([1, 2, 840, 113549, 1, 1, 11]) | 
| - | 
| +SUBJECT_ALTERNATIVE_NAME = asn1.OID([2, 5, 29, 17]) | 
|  | 
| def MakeCertificate( | 
| issuer_cn, subject_cn, serial, pubkey, privkey, ocsp_url = None, | 
| -    ca_issuers_url = None, is_ca=False, path_len=None): | 
| +    ca_issuers_url = None, is_ca=False, path_len=None, ip_sans=None, | 
| +    dns_sans=None): | 
| '''MakeCertificate returns a DER encoded certificate, signed by privkey.''' | 
| extensions = asn1.SEQUENCE([]) | 
|  | 
| @@ -242,6 +243,24 @@ def MakeCertificate( | 
| ))), | 
| ])) | 
|  | 
| +  if ip_sans is not None or dns_sans is not None: | 
| +    sans = [] | 
| +    if dns_sans is not None: | 
| +      for dns_name in dns_sans: | 
| +        sans.append( | 
| +          asn1.Raw(asn1.TagAndLength(0x82, len(dns_name)) + dns_name)) | 
| +    if ip_sans is not None: | 
| +      for ip_addr in ip_sans: | 
| +        sans.append( | 
| +          asn1.Raw(asn1.TagAndLength(0x87, len(ip_addr)) + ip_addr)) | 
| +    extensions.children.append( | 
| +      asn1.SEQUENCE([ | 
| +        SUBJECT_ALTERNATIVE_NAME, | 
| +        # There is implicitly a critical=False here. Since false is the | 
| +        # default, encoding the value would be invalid DER. | 
| +        asn1.OCTETSTRING(asn1.ToDER(asn1.SEQUENCE(sans))) | 
| +      ])) | 
| + | 
| if ocsp_url is not None or ca_issuers_url is not None: | 
| aia_entries = [] | 
| if ocsp_url is not None: | 
| @@ -426,6 +445,8 @@ def GenerateCertKeyAndOCSP(subject = "127.0.0.1", | 
| ocsp_states = None, | 
| ocsp_dates = None, | 
| ocsp_produced = OCSP_PRODUCED_VALID, | 
| +                           ip_sans = ["\x7F\x00\x00\x01"], | 
| +                           dns_sans = None, | 
| serial = 0): | 
| '''GenerateCertKeyAndOCSP returns a (cert_and_key_pem, ocsp_der) where: | 
| * cert_and_key_pem contains a certificate and private key in PEM format | 
| @@ -441,7 +462,8 @@ def GenerateCertKeyAndOCSP(subject = "127.0.0.1", | 
| if serial == 0: | 
| serial = RandomNumber(16) | 
| cert_der = MakeCertificate(ROOT_CN, bytes(subject), serial, LEAF_KEY, | 
| -                             ROOT_KEY, bytes(ocsp_url)) | 
| +                             ROOT_KEY, bytes(ocsp_url), ip_sans=ip_sans, | 
| +                             dns_sans=dns_sans) | 
| cert_pem = DERToPEM(cert_der) | 
|  | 
| ocsp_der = None | 
|  |