Annotation of embedaddon/curl/docs/SSLCERTS.md, revision 1.1

1.1     ! misho       1: SSL Certificate Verification
        !             2: ============================
        !             3: 
        !             4: SSL is TLS
        !             5: ----------
        !             6: 
        !             7: SSL is the old name. It is called TLS these days.
        !             8: 
        !             9: 
        !            10: Native SSL
        !            11: ----------
        !            12: 
        !            13: If libcurl was built with Schannel or Secure Transport support (the native SSL
        !            14: libraries included in Windows and Mac OS X), then this does not apply to
        !            15: you. Scroll down for details on how the OS-native engines handle SSL
        !            16: certificates. If you're not sure, then run "curl -V" and read the results. If
        !            17: the version string says "WinSSL" in it, then it was built with Schannel
        !            18: support.
        !            19: 
        !            20: It is about trust
        !            21: -----------------
        !            22: 
        !            23: This system is about trust. In your local CA certificate store you have certs
        !            24: from *trusted* Certificate Authorities that you then can use to verify that the
        !            25: server certificates you see are valid. They're signed by one of the CAs you
        !            26: trust.
        !            27: 
        !            28: Which CAs do you trust? You can decide to trust the same set of companies your
        !            29: operating system trusts, or the set one of the known browsers trust. That's
        !            30: basically trust via someone else you trust. You should just be aware that
        !            31: modern operating systems and browsers are setup to trust *hundreds* of
        !            32: companies and recent years several such CAs have been found untrustworthy.
        !            33: 
        !            34: Certificate Verification
        !            35: ------------------------
        !            36: 
        !            37: libcurl performs peer SSL certificate verification by default.  This is done
        !            38: by using a CA certificate store that the SSL library can use to make sure the
        !            39: peer's server certificate is valid.
        !            40: 
        !            41: If you communicate with HTTPS, FTPS or other TLS-using servers using
        !            42: certificates that are signed by CAs present in the store, you can be sure
        !            43: that the remote server really is the one it claims to be.
        !            44: 
        !            45: If the remote server uses a self-signed certificate, if you don't install a CA
        !            46: cert store, if the server uses a certificate signed by a CA that isn't
        !            47: included in the store you use or if the remote host is an impostor
        !            48: impersonating your favorite site, and you want to transfer files from this
        !            49: server, do one of the following:
        !            50: 
        !            51:  1. Tell libcurl to *not* verify the peer. With libcurl you disable this with
        !            52:     `curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);`
        !            53: 
        !            54:     With the curl command line tool, you disable this with -k/--insecure.
        !            55: 
        !            56:  2. Get a CA certificate that can verify the remote server and use the proper
        !            57:     option to point out this CA cert for verification when connecting. For
        !            58:     libcurl hackers: `curl_easy_setopt(curl, CURLOPT_CAINFO, cacert);`
        !            59: 
        !            60:     With the curl command line tool: --cacert [file]
        !            61: 
        !            62:  3. Add the CA cert for your server to the existing default CA certificate
        !            63:     store. The default CA certificate store can changed at compile time with the
        !            64:     following configure options:
        !            65: 
        !            66:     --with-ca-bundle=FILE: use the specified file as CA certificate store. CA
        !            67:     certificates need to be concatenated in PEM format into this file.
        !            68: 
        !            69:     --with-ca-path=PATH: use the specified path as CA certificate store. CA
        !            70:     certificates need to be stored as individual PEM files in this directory.
        !            71:     You may need to run c_rehash after adding files there.
        !            72: 
        !            73:     If neither of the two options is specified, configure will try to auto-detect
        !            74:     a setting. It's also possible to explicitly not hardcode any default store
        !            75:     but rely on the built in default the crypto library may provide instead.
        !            76:     You can achieve that by passing both --without-ca-bundle and
        !            77:     --without-ca-path to the configure script.
        !            78: 
        !            79:     If you use Internet Explorer, this is one way to get extract the CA cert
        !            80:     for a particular server:
        !            81: 
        !            82:      - View the certificate by double-clicking the padlock
        !            83:      - Find out where the CA certificate is kept (Certificate>
        !            84:        Authority Information Access>URL)
        !            85:      - Get a copy of the crt file using curl
        !            86:      - Convert it from crt to PEM using the openssl tool:
        !            87:        openssl x509 -inform DES -in yourdownloaded.crt \
        !            88:        -out outcert.pem -text
        !            89:      - Add the 'outcert.pem' to the CA certificate store or use it stand-alone
        !            90:        as described below.
        !            91: 
        !            92:     If you use the 'openssl' tool, this is one way to get extract the CA cert
        !            93:     for a particular server:
        !            94: 
        !            95:      - `openssl s_client -showcerts -servername server -connect server:443 > cacert.pem`
        !            96:      - type "quit", followed by the "ENTER" key
        !            97:      - The certificate will have "BEGIN CERTIFICATE" and "END CERTIFICATE"
        !            98:        markers.
        !            99:      - If you want to see the data in the certificate, you can do: "openssl
        !           100:        x509 -inform PEM -in certfile -text -out certdata" where certfile is
        !           101:        the cert you extracted from logfile. Look in certdata.
        !           102:      - If you want to trust the certificate, you can add it to your CA
        !           103:        certificate store or use it stand-alone as described. Just remember that
        !           104:        the security is no better than the way you obtained the certificate.
        !           105: 
        !           106:  4. If you're using the curl command line tool, you can specify your own CA
        !           107:     cert file by setting the environment variable `CURL_CA_BUNDLE` to the path
        !           108:     of your choice.
        !           109: 
        !           110:     If you're using the curl command line tool on Windows, curl will search
        !           111:     for a CA cert file named "curl-ca-bundle.crt" in these directories and in
        !           112:     this order:
        !           113:       1. application's directory
        !           114:       2. current working directory
        !           115:       3. Windows System directory (e.g. C:\windows\system32)
        !           116:       4. Windows Directory (e.g. C:\windows)
        !           117:       5. all directories along %PATH%
        !           118: 
        !           119:  5. Get a better/different/newer CA cert bundle! One option is to extract the
        !           120:     one a recent Firefox browser uses by running 'make ca-bundle' in the curl
        !           121:     build tree root, or possibly download a version that was generated this
        !           122:     way for you: [CA Extract](https://curl.haxx.se/docs/caextract.html)
        !           123: 
        !           124: Neglecting to use one of the above methods when dealing with a server using a
        !           125: certificate that isn't signed by one of the certificates in the installed CA
        !           126: certificate store, will cause SSL to report an error ("certificate verify
        !           127: failed") during the handshake and SSL will then refuse further communication
        !           128: with that server.
        !           129: 
        !           130: Certificate Verification with NSS
        !           131: ---------------------------------
        !           132: 
        !           133: If libcurl was built with NSS support, then depending on the OS distribution,
        !           134: it is probably required to take some additional steps to use the system-wide
        !           135: CA cert db. RedHat ships with an additional module, libnsspem.so, which
        !           136: enables NSS to read the OpenSSL PEM CA bundle. On openSUSE you can install
        !           137: p11-kit-nss-trust which makes NSS use the system wide CA certificate store. NSS
        !           138: also has a new [database format](https://wiki.mozilla.org/NSS_Shared_DB).
        !           139: 
        !           140: Starting with version 7.19.7, libcurl automatically adds the 'sql:' prefix to
        !           141: the certdb directory (either the hardcoded default /etc/pki/nssdb or the
        !           142: directory configured with SSL_DIR environment variable). To check which certdb
        !           143: format your distribution provides, examine the default certdb location:
        !           144: /etc/pki/nssdb; the new certdb format can be identified by the filenames
        !           145: cert9.db, key4.db, pkcs11.txt; filenames of older versions are cert8.db,
        !           146: key3.db, secmod.db.
        !           147: 
        !           148: Certificate Verification with Schannel and Secure Transport
        !           149: -----------------------------------------------------------
        !           150: 
        !           151: If libcurl was built with Schannel (Microsoft's native TLS engine) or Secure
        !           152: Transport (Apple's native TLS engine) support, then libcurl will still perform
        !           153: peer certificate verification, but instead of using a CA cert bundle, it will
        !           154: use the certificates that are built into the OS. These are the same
        !           155: certificates that appear in the Internet Options control panel (under Windows)
        !           156: or Keychain Access application (under OS X). Any custom security rules for
        !           157: certificates will be honored.
        !           158: 
        !           159: Schannel will run CRL checks on certificates unless peer verification is
        !           160: disabled. Secure Transport on iOS will run OCSP checks on certificates unless
        !           161: peer verification is disabled. Secure Transport on OS X will run either OCSP
        !           162: or CRL checks on certificates if those features are enabled, and this behavior
        !           163: can be adjusted in the preferences of Keychain Access.
        !           164: 
        !           165: HTTPS proxy
        !           166: -----------
        !           167: 
        !           168: Since version 7.52.0, curl can do HTTPS to the proxy separately from the
        !           169: connection to the server. This TLS connection is handled separately from the
        !           170: server connection so instead of `--insecure` and `--cacert` to control the
        !           171: certificate verification, you use `--proxy-insecure` and `--proxy-cacert`.
        !           172: With these options, you make sure that the TLS connection and the trust of the
        !           173: proxy can be kept totally separate from the TLS connection to the server.

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>