Jakub Warmuz c4042e6ce8 Busy wait loop for testing serve_forever2
This fixes race conditions, such as those in
https://travis-ci.org/letsencrypt/letsencrypt/jobs/84990239:

+ nosetests -c /dev/null --with-cover --cover-tests --cover-package acme --cover-min-percentage=100 acme
.......................................................................................................................................................................................................................................................................................................................................................Exception in thread Thread-5:
Traceback (most recent call last):
  File "/opt/python/2.7.9/lib/python2.7/threading.py", line 810, in __bootstrap_inner
    self.run()
  File "/opt/python/2.7.9/lib/python2.7/threading.py", line 763, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/opt/python/2.7.9/lib/python2.7/SocketServer.py", line 271, in handle_request
    timeout = self.socket.gettimeout()
  File "/opt/python/2.7.9/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
  File "/opt/python/2.7.9/lib/python2.7/socket.py", line 170, in _dummy
    raise error(EBADF, 'Bad file descriptor')
error: [Errno 9] Bad file descriptor
.127.0.0.1 - - [12/Oct/2015 20:08:23] "GET /foo HTTP/1.1" 404 -
.127.0.0.1 - - [12/Oct/2015 20:08:23] "GET / HTTP/1.1" 200 -
.127.0.0.1 - - [12/Oct/2015 20:08:23] "GET /.well-known/acme-challenge/eHh4eHh4eHh4eHh4eHh4eA HTTP/1.1" 200 -
.....
Name                           Stmts   Miss  Cover   Missing
------------------------------------------------------------
acme.py                            0      0   100%
acme/challenges.py               215      0   100%
acme/challenges_test.py          366      0   100%
acme/client.py                   215      0   100%
acme/client_test.py              308      0   100%
acme/crypto_util.py               92      0   100%
acme/crypto_util_test.py          53      0   100%
acme/errors.py                    19      0   100%
acme/errors_test.py               18      0   100%
acme/fields.py                    32      0   100%
acme/fields_test.py               41      0   100%
acme/jose.py                       8      0   100%
acme/jose/b64.py                  15      0   100%
acme/jose/b64_test.py             38      0   100%
acme/jose/errors.py               12      0   100%
acme/jose/errors_test.py           8      0   100%
acme/jose/interfaces.py           39      0   100%
acme/jose/interfaces_test.py      73      0   100%
acme/jose/json_util.py           170      0   100%
acme/jose/json_util_test.py      214      0   100%
acme/jose/jwa.py                 105      0   100%
acme/jose/jwa_test.py             58      0   100%
acme/jose/jwk.py                 114      0   100%
acme/jose/jwk_test.py             96      0   100%
acme/jose/jws.py                 205      0   100%
acme/jose/jws_test.py            145      0   100%
acme/jose/util.py                114      0   100%
acme/jose/util_test.py           126      0   100%
acme/jws.py                       17      0   100%
acme/jws_test.py                  27      0   100%
acme/messages.py                 184      0   100%
acme/messages_test.py            198      0   100%
acme/other.py                     21      0   100%
acme/other_test.py                48      0   100%
acme/standalone.py               102      1    99%   58
acme/standalone_test.py          109      0   100%
acme/test_util.py                 28      0   100%
acme/util.py                       3      0   100%
acme/util_test.py                  7      0   100%
------------------------------------------------------------
TOTAL                           3643      1    99%
nose.plugins.cover: ERROR: TOTAL Coverage did not reach minimum required: 100%
2015-10-13 07:09:28 +00:00
2015-10-06 10:49:33 -07:00
2015-09-26 11:07:54 +00:00
2015-09-27 16:12:50 +00:00
2015-09-06 09:27:39 +00:00
2015-09-30 12:10:16 -07:00
2015-03-11 07:51:06 +00:00
2015-10-07 22:40:02 +00:00
2015-09-11 07:12:49 +00:00
2015-10-06 18:58:06 +00:00

.. notice for github users

Disclaimer
==========

This is a **DEVELOPER PREVIEW** intended for developers and testers only.

**DO NOT RUN THIS CODE ON A PRODUCTION SERVER. IT WILL INSTALL CERTIFICATES
SIGNED BY A TEST CA, AND WILL CAUSE CERT WARNINGS FOR USERS.**

Browser-trusted certificates will be available in the coming months.

For more information regarding the status of the project, please see
https://letsencrypt.org. Be sure to checkout the
`Frequently Asked Questions (FAQ) <https://community.letsencrypt.org/t/frequently-asked-questions-faq/26#topic-title>`_.

About the Let's Encrypt Client
==============================

|build-status| |coverage| |docs| |container|

In short: getting and installing SSL/TLS certificates made easy (`watch demo video`_).

The Let's Encrypt Client is a tool to automatically receive and install
X.509 certificates to enable TLS on servers. The client will
interoperate with the Let's Encrypt CA which will be issuing browser-trusted
certificates for free.

It's all automated:

* The tool will prove domain control to the CA and submit a CSR (Certificate
  Signing Request).
* If domain control has been proven, a certificate will get issued and the tool
  will automatically install it.

All you need to do to sign a single domain is::

  user@www:~$ sudo letsencrypt -d www.example.org auth

For multiple domains (SAN) use::

  user@www:~$ sudo letsencrypt -d www.example.org -d example.org auth

and if you have a compatible web server (Apache or Nginx), Let's Encrypt can
not only get a new certificate, but also deploy it and configure your
server automatically!::

  user@www:~$ sudo letsencrypt -d www.example.org run


**Encrypt ALL the things!**


.. |build-status| image:: https://travis-ci.org/letsencrypt/letsencrypt.svg?branch=master
   :target: https://travis-ci.org/letsencrypt/letsencrypt
   :alt: Travis CI status

.. |coverage| image:: https://coveralls.io/repos/letsencrypt/letsencrypt/badge.svg?branch=master
   :target: https://coveralls.io/r/letsencrypt/letsencrypt
   :alt: Coverage status

.. |docs| image:: https://readthedocs.org/projects/letsencrypt/badge/
   :target: https://readthedocs.org/projects/letsencrypt/
   :alt: Documentation status

.. |container| image:: https://quay.io/repository/letsencrypt/letsencrypt/status
   :target: https://quay.io/repository/letsencrypt/letsencrypt
   :alt: Docker Repository on Quay.io

.. _`installation instructions`:
   https://letsencrypt.readthedocs.org/en/latest/using.html

.. _watch demo video: https://www.youtube.com/watch?v=Gas_sSB-5SU


Current Features
----------------

* web servers supported:

  - apache/2.x (tested and working on Ubuntu Linux)
  - nginx/0.8.48+ (under development)
  - standalone (runs its own webserver to prove you control the domain)

* the private key is generated locally on your system
* can talk to the Let's Encrypt (demo) CA or optionally to other ACME
  compliant services
* can get domain-validated (DV) certificates
* can revoke certificates
* adjustable RSA key bitlength (2048 (default), 4096, ...)
* optionally can install a http->https redirect, so your site effectively
  runs https only (Apache only)
* fully automated
* configuration changes are logged and can be reverted using the CLI
* text and ncurses UI
* Free and Open Source Software, made with Python.


Installation Instructions
-------------------------

Official **documentation**, including `installation instructions`_, is
available at https://letsencrypt.readthedocs.org.


Links
-----

Documentation: https://letsencrypt.readthedocs.org

Software project: https://github.com/letsencrypt/letsencrypt

Notes for developers: CONTRIBUTING.md_

Main Website: https://letsencrypt.org/

IRC Channel: #letsencrypt on `Freenode`_

Community: https://community.letsencrypt.org

Mailing list: `client-dev`_ (to subscribe without a Google account, send an
email to client-dev+subscribe@letsencrypt.org)

.. _Freenode: https://freenode.net
.. _client-dev: https://groups.google.com/a/letsencrypt.org/forum/#!forum/client-dev
.. _CONTRIBUTING.md: https://github.com/letsencrypt/letsencrypt/blob/master/CONTRIBUTING.md
S
Description
Certbot is EFF's tool to obtain certs from Let's Encrypt and (optionally) auto-enable HTTPS on your server. It can also act as a client for any other CA that uses the ACME protocol.
Readme
146 MiB
Languages
Python 94.5%
Shell 3.7%
Batchfile 0.8%
Makefile 0.7%
Augeas 0.2%