├── scripts ├── Ubuntu12LTS.sh ├── Ubuntu14TS.sh ├── Debian8Jessie.sh ├── FreeBSD10.sh ├── RedHat7.sh ├── CentOS7.sh ├── AmazonLinux2015.sh ├── CentOS6.sh ├── RedHat6.sh └── Debian7Wheezy.sh ├── LICENSE └── README.md /scripts/Ubuntu12LTS.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Ubuntu 12.04 LT LetsEncrypt beta client installer 4 | # 5 | # If you get stuck, just try again: 6 | # cd ~/ && rm -rf ./letsencrypt && rm -rf ~/.local/share/letsencrypt && rm -rf /etc/letsencrypt && rm -rf ~/.cache/pip 7 | # 8 | # Usage (as root; note the leading space): . ./Ubuntu12LTS.sh 9 | 10 | # Set this to your domain for certificate 11 | 12 | export DOMAIN=www.EXAMPLE.org 13 | 14 | apt-get -y -qq update 15 | apt-get -y -qq install git 16 | 17 | git clone https://github.com/letsencrypt/letsencrypt 18 | 19 | cd letsencrypt 20 | 21 | ./letsencrypt-auto --agree-dev-preview -d $DOMAIN --authenticator manual certonly 22 | 23 | -------------------------------------------------------------------------------- /scripts/Ubuntu14TS.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Ubuntu 14.04 LT LetsEncrypt beta client installer 4 | # 5 | # If you get stuck, just try again: 6 | # cd ~/ && rm -rf ./letsencrypt && rm -rf ~/.local/share/letsencrypt && rm -rf /etc/letsencrypt && rm -rf ~/.cache/pip 7 | # 8 | # Usage (as root; note the leading space): . ./Ubuntu14LTS.sh 9 | 10 | # Set this to your domain for certificate 11 | 12 | export DOMAIN=www.EXAMPLE.org 13 | 14 | apt-get -y -qq update 15 | apt-get -y -qq install git 16 | 17 | git clone https://github.com/letsencrypt/letsencrypt 18 | 19 | cd letsencrypt 20 | 21 | ./letsencrypt-auto --agree-dev-preview -d $DOMAIN --authenticator manual certonly 22 | 23 | -------------------------------------------------------------------------------- /scripts/Debian8Jessie.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Debian 8 (Jessie) LetsEncrypt beta client installer 4 | # 5 | # If you get stuck, just try again: 6 | # cd ~/ && rm -rf ./letsencrypt && rm -rf ~/.local/share/letsencrypt && rm -rf /etc/letsencrypt && rm -rf ~/.cache/pip 7 | # 8 | # Usage (as root; note the leading space): . ./Debian8Jessie.sh 9 | 10 | # Set this to your domain for certificate 11 | 12 | export DOMAIN=www.EXAMPLE.org 13 | 14 | apt-get -y -qq update 15 | apt-get -y -qq install git 16 | 17 | git clone https://github.com/letsencrypt/letsencrypt 18 | 19 | cd letsencrypt 20 | 21 | ./letsencrypt-auto --agree-dev-preview -d $DOMAIN --authenticator manual certonly 22 | 23 | -------------------------------------------------------------------------------- /scripts/FreeBSD10.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # FreeBSD 10.2-RELEASE stock build (on AWS: ami-f709a29c) LetsEncrypt beta client installer 4 | # 5 | # If you get stuck, just try again: 6 | # cd ~/ && rm -rf ./letsencrypt && rm -rf ~/.local/share/letsencrypt && rm -rf /usr/local/etc/letsencrypt && rm -rf ~/.cache/pip 7 | # 8 | 9 | # Usage (as root; note the leading space): source ./FreeBSD10.sh 10 | 11 | # Set this to your domain for certificate 12 | export DOMAIN=www.EXAMPLE.org 13 | 14 | 15 | mkdir -p /usr/local/etc/pkg/repos 16 | 17 | # Currently only available for 10.2-Release 18 | 19 | cat > /usr/local/etc/pkg/repos/FreeBSD.conf << 'EOF' 20 | FreeBSD: { 21 | url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest" 22 | } 23 | 'EOF' 24 | 25 | pkg install -y py27-letsencrypt 26 | 27 | letsencrypt --agree-dev-preview -d $DOMAIN --authenticator manual certonly 28 | 29 | 30 | # For trusted cert (currently Beta testers only): 31 | # --server https://acme-v01.api.letsencrypt.org/directory 32 | 33 | 34 | -------------------------------------------------------------------------------- /scripts/RedHat7.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # RedHat 7 stock LetsEncrypt beta client installer 4 | # 5 | # If you get stuck, just try again: 6 | # cd ~/ && rm -rf ./letsencrypt && rm -rf ~/.local/share/letsencrypt && rm -rf /etc/letsencrypt && rm -rf ~/.cache/pip 7 | # 8 | # Usage (as root; note the leading space): . ./RedHat7.sh 9 | 10 | # Set this to your domain for certificate 11 | 12 | export DOMAIN=www.EXAMPLE.org 13 | 14 | # Sanity checks 15 | if ( whoami | grep -qv root ); then 16 | echo "Fatal: Please rerun script as sudo or root." && read -p "[Hit cntrl-c to break]" 17 | fi 18 | if [ "$DOMAIN" == "www.EXAMPLE.org" ]; then 19 | echo "Fatal: Please set DOMAIN and rerun this script." && read -p "[Hit cntrl-c to break]" 20 | fi 21 | 22 | yum update -y -q 23 | yum -q -y install git 24 | 25 | git clone https://github.com/letsencrypt/letsencrypt 26 | cd letsencrypt 27 | ./letsencrypt-auto --agree-dev-preview -d $DOMAIN --authenticator manual certonly 28 | 29 | # For trusted cert (currently Beta testers only): 30 | # --server https://acme-v01.api.letsencrypt.org/directory 31 | -------------------------------------------------------------------------------- /scripts/CentOS7.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # CentOS 7 stock LetsEncrypt beta client installer 4 | # 5 | # If you get stuck, just try again: 6 | # cd ~/ && rm -rf ./letsencrypt && rm -rf ~/.local/share/letsencrypt && rm -rf /etc/letsencrypt && rm -rf ~/.cache/pip 7 | # 8 | # Usage (as root; note the leading space): . ./CentOS7.sh 9 | 10 | # Set this to your domain for certificate 11 | 12 | export DOMAIN=www.EXAMPLE.org 13 | 14 | # Sanity checks 15 | if ( whoami | grep -qv root ); then 16 | echo "Fatal: Please rerun script as sudo or root." && read -p "[Hit cntrl-c to break]" 17 | fi 18 | if [ "$DOMAIN" == "www.EXAMPLE.org" ]; then 19 | echo "Fatal: Please set DOMAIN and rerun this script." && read -p "[Hit cntrl-c to break]" 20 | fi 21 | 22 | yum update -y -q 23 | yum -q -y install git 24 | 25 | git clone https://github.com/letsencrypt/letsencrypt 26 | 27 | cd letsencrypt 28 | 29 | ./letsencrypt-auto --agree-dev-preview -d $DOMAIN --authenticator manual certonly 30 | 31 | # For trusted cert (currently Beta testers only): 32 | # --server https://acme-v01.api.letsencrypt.org/directory 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /scripts/AmazonLinux2015.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Amazon Linux 2015.09-Minimal stock LetsEncrypt beta client installer (HVM EBS: ami-fbb9c991) 4 | # 5 | # If you get stuck, just try again: 6 | # cd ~/ && rm -rf ./letsencrypt && rm -rf ~/.local/share/letsencrypt && rm -rf /etc/letsencrypt && rm -rf ~/.cache/pip 7 | # 8 | # Usage (as root; note the leading space): . ./AmazonLinux2015sh 9 | 10 | # Set this to your domain for certificate 11 | 12 | export DOMAIN=www.EXAMPLE.org 13 | 14 | # Sanity checks 15 | if ( whoami | grep -qv root ); then 16 | echo "Fatal: Please rerun script as sudo or root." && read -p "[Hit cntrl-c to break]" 17 | fi 18 | if [ "$DOMAIN" == "www.EXAMPLE.org" ]; then 19 | echo "Fatal: Please set DOMAIN and rerun this script." && read -p "[Hit cntrl-c to break]" 20 | fi 21 | 22 | yum update -y -q 23 | 24 | # The LE installer OS autodetect doesn't recognize Amazon Linux, so we have to manually pre-install required buildpkgs 25 | 26 | yum install -y -q augeas-libs dialog epel-release gcc git libffi-devel openssl-devel python27-pip python27-python-devel python27-virtualenv 27 | 28 | git clone https://github.com/letsencrypt/letsencrypt 29 | 30 | cd letsencrypt 31 | 32 | ./letsencrypt-auto --agree-dev-preview -d $DOMAIN --authenticator manual certonly 33 | 34 | # For trusted cert (currently Beta testers only): 35 | # --server https://acme-v01.api.letsencrypt.org/directory 36 | -------------------------------------------------------------------------------- /scripts/CentOS6.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # CentOS 6.7 stock LetsEncrypt beta client installer 4 | # 5 | # If you get stuck, just try again: 6 | # cd ~/ && rm -rf ./letsencrypt && rm -rf ~/.local/share/letsencrypt && rm -rf /etc/letsencrypt && rm -rf ~/.cache/pip 7 | # 8 | # Usage (as root; note the leading space): . ./CentOS6.sh 9 | 10 | # Set this to your domain for certificate 11 | 12 | export DOMAIN=www.EXAMPLE.org 13 | 14 | # Sanity checks 15 | if ( whoami | grep -qv root ); then 16 | echo "Fatal: Please rerun script as sudo or root." && read -p "[Hit cntrl-c to break]" 17 | fi 18 | if [ "$DOMAIN" == "www.EXAMPLE.org" ]; then 19 | echo "Fatal: Please set DOMAIN and rerun this script." && read -p "[Hit cntrl-c to break]" 20 | fi 21 | 22 | # Enable EPEL repository (for Python 2.7) 23 | rpm --import https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6 24 | rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm 25 | 26 | yum install -y -q git python-pip python27-python-devel 27 | pip install --upgrade pip 28 | 29 | # Set temporary PATH and LD Library (current shell only) 30 | # Note the leading space. Rerun if starting new shell before launching letsencrypt-auto 31 | 32 | . /opt/rh/python27/enable 33 | 34 | if ( python -V 2>&1 | grep -q '2.7' ) then 35 | git clone https://github.com/letsencrypt/letsencrypt 36 | cd letsencrypt 37 | ./letsencrypt-auto --agree-dev-preview -d $DOMAIN --authenticator manual certonly 38 | # For trusted cert (currently Beta testers only): 39 | # --server https://acme-v01.api.letsencrypt.org/directory 40 | else 41 | echo -e "\n\nFatal: Incompatible Python build environment. Please rerun: . /opt/rh/python27/enable \n" 42 | fi 43 | -------------------------------------------------------------------------------- /scripts/RedHat6.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # RedHat 6.7 stock LetsEncrypt beta client installer 4 | # 5 | # If you get stuck, just try again: 6 | # cd ~/ && rm -rf ./letsencrypt && rm -rf ~/.local/share/letsencrypt && rm -rf /etc/letsencrypt && rm -rf ~/.cache/pip 7 | # 8 | # Usage (as root; note the leading space): . ./RedHat6.sh 9 | 10 | # Set this to your domain for certificate 11 | 12 | export DOMAIN=www.EXAMPLE.org 13 | 14 | # Sanity checks 15 | if ( whoami | grep -qv root ); then 16 | echo "Fatal: Please rerun script as sudo or root." && read -p "[Hit cntrl-c to break]" 17 | fi 18 | if [ "$DOMAIN" == "www.EXAMPLE.org" ]; then 19 | echo "Fatal: Please set DOMAIN and rerun this script." && read -p "[Hit cntrl-c to break]" 20 | fi 21 | 22 | # Enable EPEL repository (for Python 2.7) 23 | rpm --import https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6 24 | rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm 25 | 26 | yum install -y -q git python-pip python27-python-devel 27 | pip install --upgrade pip 28 | 29 | # Set temporary PATH and LD Library (current shell only) 30 | # Note the leading space. Rerun if starting new shell before launching letsencrypt-auto 31 | 32 | . /opt/rh/python27/enable 33 | 34 | if ( python -V 2>&1 | grep -q '2.7' ) then 35 | git clone https://github.com/letsencrypt/letsencrypt 36 | cd letsencrypt 37 | ./letsencrypt-auto --agree-dev-preview -d $DOMAIN --authenticator manual certonly 38 | # For trusted cert (currently Beta testers only): 39 | # --server https://acme-v01.api.letsencrypt.org/directory 40 | else 41 | echo -e "\n\nFatal: Incompatible Python build environment. Please rerun: . /opt/rh/python27/enable \n" 42 | fi 43 | -------------------------------------------------------------------------------- /scripts/Debian7Wheezy.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Debian 7.9 (Wheezy) LetsEncrypt beta client installer 4 | # 5 | # If you get stuck, just try again: 6 | # cd ~/ && rm -rf ./letsencrypt && rm -rf ~/.local/share/letsencrypt && rm -rf /etc/letsencrypt && rm -rf ~/.cache/pip 7 | # 8 | # Usage (as root; note the leading space): . ./Debian7Wheezy.sh 9 | 10 | # Set this to your domain for certificate 11 | 12 | export DOMAIN=www.EXAMPLE.org 13 | 14 | apt-get -y -qq update 15 | apt-get -y -qq install \ 16 | curl gcc git libbz2-dev libncurses5-dev libreadline-dev libsqlite3-dev libssl-dev llvm make patch python-pip wget zlib1g-dev 17 | 18 | 19 | # A little insane, so read and run at your own risk! 20 | 21 | # This installs the pyenv manager to run non-system multiple/parallel versions of python 22 | # (Rationale in short: LE official python client requires very specific versions of libraries) 23 | 24 | curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash 25 | 26 | eval "$(pyenv init -)" 27 | eval "$(pyenv virtualenv-init -)" 28 | 29 | # There will be a long pause at the patch update while pyenv compiles 2.7.9 30 | echo 'To monitor the build process, from another terminal: tail -f /tmp/$(ls -t /tmp | grep log$ | head -n 1)' 31 | pyenv install 2.7.9 32 | 33 | eval "$(pyenv init -)" 34 | eval "$(pyenv virtualenv-init -)" 35 | 36 | pyenv global 2.7.9 37 | 38 | echo "Next line should show: 2.7.9" 39 | python -V 40 | 41 | git clone https://github.com/letsencrypt/letsencrypt 42 | 43 | cd letsencrypt 44 | 45 | ./letsencrypt-auto --agree-dev-preview -d $DOMAIN --authenticator manual certonly 46 | 47 | # For trusted cert (currently Beta testers only): 48 | # --server https://acme-v01.api.letsencrypt.org/directory 49 | 50 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Note: This project has been archived. I recommend using the official CertBot or Lego now (https://certbot.eff.org/ or https://github.com/xenolf/lego) 2 | _________________ 3 | 4 | ## LetsEncrypt Client Installers 5 | 6 | A suite of simple install scripts for the LetsEncrypt official certificate client on most major *nix OS (Debian, AWS, CentOS, RedHat, Ubuntu, and FreeBSD) 7 | 8 | This is a minimal, repeatable set of scripts to stand up the official [Let's Encrypt](https://letsencrypt.org/) 9 | certificate management [ACME client tool](https://github.com/letsencrypt/letsencrypt). Let's Encrypt is a really important 10 | project, and the team has made *amazing* progress in the past year. 11 | 12 | The letsencrypt ("LE") client is written in Python, and though it attempts to automatically 13 | detect your operating system and build environment, it can be fragile and error-prone on 14 | some systems, particularly popular distros like Amazon Linux and older versions of CentOS 15 | or RedHat. 16 | 17 | This started because of so many false starts for me when trying to use the beta client. I was eventually able to reliably request and receive certificates on Debian and CentOS on GCE and AWS, and achieve an A+ rating with 18 | [SSLLabs' test suite](https://www.ssllabs.com/ssltest/index.html). Woot! 19 | These scripts are a cleanup and drastic simplification of that work (many dozens of VMs later). My message is: _you too_ can painlessly [generate certs](https://community.letsencrypt.org/t/beta-program-announcements/1631) for your systems. 20 | 21 | 22 | ### Abbreviated advice from the front line 23 | 24 | * For people who are not in the Beta program, the scripts by default will target the LE "staging" API endpoint, and on successful generation of certs, the CA will be a test authority ("Happy Hacker CA"). To enable trusted certificates, Beta testers can modify the scripts as indicated in each, but *only* against white-listed domains (and `example.com` doesn't whitelist `blog.example.com` by default). 25 | * Do __not__ run either these scripts or the client on production systems (yet). LE is still in beta and has some rough edges, including silently invoking sudo and installing [quite a few](#dependencies) development packages. __Please__ study the script for your platform. These were written quickly to help other people hopefully avoid some of the stumbling blocks I hit, and to expand the pool of testing volunteers. 26 | * The Apache and Nginx plugins to autoupdate are very much still works-in-progress. I encourage anyone to help improve them by testing & documenting your results. Constructive feedback is welcome! 27 | * Because the Nginx LE plugin in particular is still classified as highly experimental, I recommend spinning up a test VM (micro instances on GCE or AWS work great), and using the LE client as a certificate fetcher, pushing certs and keys to target servers via ssh. 28 | * Be patient during the build, because there may be long pauses (multi-minute on micro VMs) that are preceded by unrelated warning messages. If you're running on a platform that ships with Python v 2.6 (wheezy, Cent6, Amazon Linux), be aware that there are some [core limits](#urllib3) on the underlying library around TLS, but workarounds are in place during the "bootstrap" process of standing up the client, and additional 2.6 support is being added by the LE team. 29 | 30 | 31 | As indicated in each script, if you get stuck, it's perfectly ok to tear down, rebuild, and try again, just make sure to run the following clean up to remove python and build fragments: 32 | 33 | cd ~/ && rm -rf ./letsencrypt && rm -rf ~/.local/share/letsencrypt && rm -rf /etc/letsencrypt && rm -rf ~/.cache/pip 34 | 35 | 36 | ### If you're just completely stuck and ready to give up 37 | 38 | There are three non-official alternative LE clients, and they work pretty well: 39 | 40 | https://github.com/unixcharles/acme-client (a Ruby gem) 41 | https://github.com/xenolf/lego (a single cross-platform Go program) 42 | https://github.com/diafygi/letsencrypt-nosudo (as the name suggests, a non-sudo alternative—a single python script) 43 | 44 | I tried each, and was able to generate certs quite easily with both Lego and LE-nosudo. Might be worth checking out. 45 | 46 | 47 | #### Must-read (latest on the beta program): 48 | 49 | https://community.letsencrypt.org/t/beta-program-announcements/ 50 | 51 | 52 | #### Recommended Nginx config: 53 | 54 | https://community.letsencrypt.org/t/nginx-configuration-sample/2173 55 | 56 | 57 | #### Dependencies 58 | 59 | Here is an inventory of files added to a stock Debian Jessie system by the LE client. 60 | As mentioned earlier, the official python client installs *lots* of packages in the background, 61 | so depending on your use case and tolerance for eventually adding a heavy tools footprint in production, 62 | it may be preferred to run the client as a certificate generator of sorts, and push 63 | certs and keys to a receiving web server or public API endpoint. 64 | 65 | Alternatively, you may want to look at the Go-based [lego client](https://github.com/xenolf/lego) mentioned earlier. 66 | It will compile on virtually any platform into a single binary that you can run on other 67 | servers, and the installer dependencies are all self-contained packages. 68 | 69 | # Generated from a before/after: grep install /var/log/dpkg.log 70 | 71 | augeas-lenses 72 | binutils 73 | cpp 74 | cpp-4.9 75 | dh-python 76 | dialog 77 | gcc 78 | gcc-4.9 79 | git-core 80 | libasan1 81 | libatomic1 82 | libaugeas0 83 | libc-dev-bin 84 | libc6-dev 85 | libcilkrts5 86 | libcloog-isl4 87 | libexpat1-dev 88 | libffi-dev 89 | libgcc-4.9-dev 90 | libgomp1 91 | libisl10 92 | libitm1 93 | liblsan0 94 | libmpc3 95 | libmpdec2 96 | libmpfr4 97 | libpython-dev 98 | libpython2.7 99 | libpython2.7-dev 100 | libpython3-stdlib 101 | libpython3.4-minimal 102 | libpython3.4-stdlib 103 | libquadmath0 104 | libssl-dev 105 | libtsan0 106 | libubsan0 107 | linux-libc-dev 108 | python-chardet-whl 109 | python-colorama-whl 110 | python-dev 111 | python-distlib-whl 112 | python-html5lib-whl 113 | python-pip-whl 114 | python-requests-whl 115 | python-setuptools-whl 116 | python-six-whl 117 | python-urllib3-whl 118 | python-virtualenv 119 | python2.7-dev 120 | python3 121 | python3-minimal 122 | python3-pkg-resources 123 | python3-virtualenv 124 | python3.4 125 | python3.4-minimal 126 | virtualenv 127 | zlib1g-dev 128 | 129 | 130 | #### SSLContext warning from python urllib3 131 | 132 | You may get this warning if you're running on a platform with python 2.6 (Wheezy, Cent6, Amazon Linux): 133 | 134 | > InsecurePlatformWarning: A true SSLContext object is not available. 135 | > This prevents urllib3 from configuring SSL appropriately and may cause 136 | > certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning. 137 | 138 | The bootstrap processes attempt to handle multiple libraries through python virtual environments, 139 | but on some OS', the only solution at the moment is to run a parallel library manager that 140 | (attempts) to not step over the core system dependencies for yum and apt. 141 | 142 | For this suite of scripts I managed to avoid that in all cases but Debian Wheezy, which required 143 | [pyenv](https://github.com/yyuu/pyenv), which offers a lot of benefits, but brings with 144 | it additional package and environment variable dependencies. 145 | 146 | #### Acknowledgements 147 | 148 | Big shout out to Kubilay Kocak (@koobs) and Bernard Spil (@Sp1l) on getting LetsEncrypt packaged on FreeBSD, and to Jacob Hoffman-Andrews (@j4cob) from @letsencrypt on his support and suggestions. 149 | 150 | #### Contact 151 | 152 | Ping me @kennwhite with questions. Have fun! 153 | 154 | 155 | --------------------------------------------------------------------------------