Skip to content

TLS validation in local dev does not work #2891

@afdy

Description

@afdy

TLS validation on localhost does not work with the auto generated certificate.

To replicate:

  • Follow install & setup, pass --cert-file
python3 manage.py runserver_plus --cert-file dev-cert.crt
Django version 5.0.4, using settings 'ourapp.devsettings'
Development server is running at https://ourapp.localhost:8000/
Using the Werkzeug debugger (https://werkzeug.palletsprojects.com/)
Quit the server with CONTROL-C.

dev-cert.crt is generated, but does not work, a sample ERROR using wget:

wget -vvv --ca-certificate=$PWD/dev-cert.crt https://ourapp.localhost:8000
--2024-05-02 07:49:10--  https://ourapp.localhost:8000/
Resolving ourapp.localhost (ourapp.localhost)... 127.0.0.1
Connecting to ourapp.localhost (ourapp.localhost)|127.0.0.1|:8000... connected.
ERROR: no certificate subject alternative name matches
	requested host name ‘ourapp.localhost’.
To connect to ourapp.localhost insecurely, use `--no-check-certificate'.

Certificate looks valid, however I think wget, curl, python requests does not like the cn name?

openssl x509 -in dev-cert.crt --text --noout
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            25:44:40:09:99:71:4e:8c:b3:78:9e:ba:1b:de:d2:d0:f3:4f:d4:3e
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: O=Dummy Certificate, CN=*.localhost/CN=localhost
        Validity
            Not Before: May  2 07:02:26 2024 GMT
            Not After : May  2 07:02:26 2025 GMT
        Subject: O=Dummy Certificate, CN=*.localhost/CN=localhost
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:ad:fb:88:dd:bd:9f:d7:af:33:6f:92:5e:25:1e:
                    2d:de:22:b2:ec:e6:67:91:24:23:6e:f2:7f:08:dc:
                    6c:4d:be:b8:ca:a9:34:4c:08:71:c3:9f:dd:ac:67:
                    35:a5:72:8f:9f:dc:b1:47:9c:e7:9f:6b:b3:9c:a4:
                    f4:28:a8:5f:fd:9a:f1:a4:c0:59:88:bb:25:31:e5:
                    7c:75:33:67:ee:01:cc:f6:e0:59:b7:f4:ff:99:44:
                    a9:31:13:6a:eb:13:4e:e1:fa:ec:54:5c:0d:a6:a5:
                    38:59:5c:ae:b7:0c:d9:ee:23:40:db:1e:5e:42:47:
                    99:96:26:31:1a:62:23:44:41:31:1d:3a:9d:35:b0:
                    8b:49:3d:76:cb:6d:41:da:e8:10:a8:6d:82:7c:fb:
                    22:fd:8d:c8:9f:ed:90:1c:cd:3c:31:34:dc:d4:a1:
                    56:c4:c2:1f:f0:ca:b5:5a:9d:dd:06:43:7a:49:ed:
                    9a:74:e2:ea:31:e7:04:35:9b:f6:4a:75:8f:df:2c:
                    55:14:3b:56:85:cf:0b:b1:ea:8f:52:99:8e:33:b1:
                    cd:fc:9d:e0:38:24:e7:23:b5:da:cb:a8:14:ad:2d:
                    d6:f7:2c:fa:bc:e0:c3:15:e2:8f:72:22:7f:db:ad:
                    a7:14:1e:4b:09:fc:2d:71:6b:fa:15:0d:ec:da:5b:
                    c0:6f
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Extended Key Usage:
                TLS Web Server Authentication
            X509v3 Subject Alternative Name:
                DNS:*.localhost/CN=localhost
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
        99:51:30:ea:30:3f:57:01:28:80:78:44:fa:f6:8a:47:af:7b:
        01:1f:ff:d2:eb:8f:d2:21:46:f2:b7:6c:29:a1:b0:7a:1f:80:
        a7:1e:93:aa:af:6f:c2:fe:19:28:6a:93:6b:19:94:8c:2c:c3:
        82:9a:d6:39:35:21:ea:02:1f:62:00:14:51:38:51:42:56:11:
        af:1d:53:60:90:d7:e2:6c:28:8e:af:b8:b6:ef:73:95:5b:4d:
        dd:3e:14:a0:95:20:52:3b:93:88:9f:c2:e3:c4:29:d6:7e:a8:
        de:c0:db:e9:2f:cb:d7:e2:f7:06:e4:f2:ee:5f:4b:e3:43:2c:
        fc:bd:be:df:f7:06:37:89:10:35:19:99:c0:b5:ff:0a:20:20:
        e4:64:af:40:7d:f0:e6:e7:a1:e1:fc:ee:70:c0:71:be:ee:c9:
        9a:a2:4c:7d:33:36:d1:a7:de:cc:d1:47:09:2e:d5:ae:1a:0f:
        4a:68:9a:08:be:d1:6d:03:1b:b3:0c:b0:e8:5a:ac:fa:73:4a:
        c5:4d:39:e0:b7:47:26:c6:66:d2:26:d0:88:6e:f4:9e:15:13:
        d9:e0:a8:48:cc:f9:40:93:82:49:0f:4b:cd:16:95:ca:cd:78:
        1a:7c:67:71:c5:8a:a9:03:10:ed:47:ac:89:63:41:af:5c:d7:
        f0:ce:1f:3d

I've been using this library and running it insecure as a result for a while but today it really bugged me so thought i would dig deeper.

If i generate the certificate manually, it works and validates fine. With minor modifications to serving.py to fix the SANS/CN fields, i can make it work ok:

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            38:a7:d1:e8:46:1c:f2:94:04:eb:ac:86:19:6d:7f:87:22:4f:a1
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: O=Dummy Certificate, CN=localhost
        Validity
            Not Before: May  2 07:13:25 2024 GMT
            Not After : May  2 07:13:25 2025 GMT
        Subject: O=Dummy Certificate, CN=localhost
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:c2:b7:20:f0:b2:5d:d5:e5:e6:b4:9b:a6:b7:e4:
                    65:4d:d3:52:f5:9c:a5:3c:b5:12:7c:2b:cd:c3:f5:
                    d2:43:72:b1:dd:39:74:8c:23:ff:b5:c9:4a:2a:18:
                    96:33:b8:d4:2a:8f:bd:6c:b5:10:24:1a:3e:19:5a:
                    7d:aa:b6:76:e2:37:dc:57:98:6e:dc:80:38:d7:c0:
                    b4:3c:b6:98:68:31:54:e3:a4:d0:fe:d5:14:97:56:
                    7f:5d:f0:5a:8e:ee:ae:cf:15:ef:4b:98:52:40:c4:
                    45:a5:af:cb:39:6f:67:95:19:62:24:52:64:8a:d1:
                    1d:77:86:40:fe:db:92:68:c7:7c:bc:56:1d:fe:e7:
                    61:ba:11:d5:a7:e4:3b:d9:b7:d9:fb:42:22:ba:27:
                    81:2a:7f:72:b7:81:f2:73:eb:1c:8f:90:ac:ba:80:
                    ac:c2:4f:4a:aa:bc:2b:d8:05:cd:98:b3:0d:11:18:
                    45:09:b1:bc:43:6e:53:c3:19:ff:6d:55:64:1d:ea:
                    73:27:3f:c1:f6:87:b7:6b:13:12:77:6e:de:05:bf:
                    bb:8c:42:6d:49:32:0f:a0:d5:06:20:14:ff:39:58:
                    28:67:39:34:15:40:72:d3:f8:4b:a8:07:0c:82:14:
                    21:f5:2a:c1:05:6e:4e:7f:3a:86:0c:c1:0b:97:6f:
                    61:4b
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Extended Key Usage:
                TLS Web Server Authentication
            X509v3 Subject Alternative Name:
                DNS:localhost, DNS:*.localhost
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
        72:bc:10:27:91:1b:11:6e:29:11:1d:91:66:93:7d:f4:d8:8d:
        0e:57:14:c8:16:44:c9:bd:e6:1e:cb:12:53:ee:59:02:29:ea:
        53:f8:09:cf:a0:fe:f3:1e:0c:0c:78:34:83:dd:4c:03:6f:e2:
        f7:7d:56:44:82:1a:bb:50:c1:bb:3d:1c:58:ea:0d:a6:12:24:
        34:4d:b5:3c:a5:10:d3:a6:a5:2d:f9:86:20:bb:e3:fd:62:14:
        ec:b7:aa:45:36:3e:f1:f6:02:1f:4a:8b:97:69:98:5e:22:54:
        14:5c:87:ee:f0:f7:e2:fc:72:9b:c0:bd:67:a6:fa:4a:69:3e:
        6e:48:5e:fe:6d:7a:f6:9e:e6:0f:33:4c:44:39:24:9c:98:06:
        da:a9:a1:12:4c:bc:f8:b1:cb:bf:0f:c2:c9:83:aa:e2:4d:c5:
        1a:0d:7e:60:da:a6:49:83:b6:f6:a7:da:34:db:aa:0b:8d:19:
        b6:c7:f9:67:73:cf:2f:af:e7:09:6c:63:5c:86:c7:4f:cb:a3:
        f2:98:77:e0:3a:de:ef:b8:38:df:67:97:8e:fd:79:9b:8b:7b:
        a7:05:2c:3f:f7:cf:9a:ff:31:a9:f0:6c:f7:7f:1e:a2:1f:58:
        dd:e2:c8:99:b6:3e:c4:41:9d:0f:29:e6:8a:88:f1:6d:a6:b5:
        36:e8:40:a2

Environment:

  • Python version:3.12.1
  • Poetry 1.8.2
  • Werkzeug version:3.0.1
  • Mac Sonoma 14.4.1

Is this a bug? I could submit a pull request with my local change to serving.py, which appears to resolve?

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions