93 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|                       Peer SSL Certificate Verification
 | |
|                       =================================
 | |
| 
 | |
| libcurl performs peer SSL certificate verification by default. This is done by
 | |
| installing a default CA cert bundle on 'make install' (or similar), that CA
 | |
| bundle package is used by default on operations against SSL servers.
 | |
| 
 | |
| If you communicate with HTTPS or FTPS servers using certificates that are
 | |
| signed by CAs present in the bundle, you can be sure that the remote server
 | |
| really is the one it claims to be.
 | |
| 
 | |
| If the remote server uses a self-signed certificate, if you don't install
 | |
| curl's CA cert bundle, if the server uses a certificate signed by a CA that
 | |
| isn't included in the bundle or if the remote host is an impostor
 | |
| impersonating your favorite site, and you want to transfer files from this
 | |
| server, do one of the following:
 | |
| 
 | |
|  1. Tell libcurl to *not* verify the peer. With libcurl you disable with with
 | |
|     curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
 | |
| 
 | |
|     With the curl command line tool, you disable this with -k/--insecure.
 | |
| 
 | |
|  2. Get a CA certificate that can verify the remote server and use the proper
 | |
|     option to point out this CA cert for verification when connecting. For
 | |
|     libcurl hackers: curl_easy_setopt(curl, CURLOPT_CAPATH, capath);
 | |
| 
 | |
|     With the curl command line tool: --cacert [file]
 | |
| 
 | |
|  3. Add the CA cert for your server to the existing default CA cert bundle.
 | |
|     The default path of the CA bundle installed with the curl package is:
 | |
|     /usr/local/share/curl/curl-ca-bundle.crt, which can be changed by running
 | |
|     configure with the --with-ca-bundle option pointing out the path of your
 | |
|     choice.
 | |
| 
 | |
|     To do this, you need to get the CA cert for your server in PEM format and
 | |
|     then append that to your CA cert bundle.
 | |
| 
 | |
|     If you use Internet Explorer, this is one way to get extract the CA cert
 | |
|     for a particular server:
 | |
| 
 | |
|      o View the certificate by double-clicking the padlock
 | |
|      o Find out where the CA certificate is kept (Certificate>
 | |
|        Authority Information Access>URL)
 | |
|      o Get a copy of the crt file using curl
 | |
|      o Convert it from crt to PEM using the openssl tool:
 | |
|        openssl x509 -inform DES -in yourdownloaded.crt \
 | |
|        -out outcert.pem -text
 | |
|      o Append the 'outcert.pem' to the CA cert bundle or use it stand-alone
 | |
|        as described below.
 | |
| 
 | |
|      (Thanks to Frankie V for this description)
 | |
| 
 | |
|     If you use the 'openssl' tool, this is one way to get extract the CA cert
 | |
|     for a particular server:
 | |
| 
 | |
|      o openssl s_client -connect xxxxx.com:443 |tee logfile
 | |
|      o type "QUIT", followed by the "ENTER" key
 | |
|      o The certificate will have "BEGIN CERTIFICATE" and "END CERTIFICATE"
 | |
|        markers.
 | |
|      o If you want to see the data in the certificate, you can do: "openssl
 | |
|        x509 -inform PEM -in certfile -text -out certdata" where certfile is
 | |
|        the cert you extracted from logfile. Look in certdata.
 | |
|      o If you want to trust the certificate, you can append it to your
 | |
|        cert_bundle or use it stand-alone as described. Just remember that the
 | |
|        security is no better than the way you obtained the certificate.
 | |
| 
 | |
|      (Thanks to Doug Kaufman for this description)
 | |
| 
 | |
|  4. If you're using the curl command line tool, you can specify your own CA
 | |
|     cert path by setting the environment variable CURL_CA_BUNDLE to the path
 | |
|     of your choice.
 | |
| 
 | |
|     If you're using the curl command line tool on Windows, curl will search
 | |
|     for a CA cert file named "curl-ca-bundle.crt" in these directories and in
 | |
|     this order:
 | |
|       1. application's directory
 | |
|       2. current working directory
 | |
|       3. Windows System directory (e.g. C:\windows\system32)
 | |
|       4. Windows Directory (e.g. C:\windows)
 | |
|       5. all directories along %PATH%
 | |
| 
 | |
|  5. Get a better/different/newer CA cert bundle! One option is to extract the
 | |
|     one a recent Mozilla browser uses, by following the instruction found
 | |
|     here:
 | |
| 
 | |
|         http://curl.haxx.se/docs/caextract.html
 | |
| 
 | |
| Neglecting to use one of the above methods when dealing with a server using a
 | |
| certificate that isn't signed by one of the certificates in the installed CA
 | |
| cert bundle, will cause SSL to report an error ("certificate verify failed")
 | |
| during the handshake and SSL will then refuse further communication with that
 | |
| server.
 | 
