Let's Encrypt 免费SSL配置

原创
2018/05/30 15:14
阅读数 976

官方网址 https://letsencrypt.org/

UPDATE:

[2018/10/26]如果创建证书时出现 Client with the currently selected authenticator does not support any combination of challenges that will satisfy the CA.,表示要更新你的certbot工具了,如果是certos,简单的执行yum update certbot就行了。参考这里

高能提醒

[1] Let's Encrypt实测还是有兼容性问题(兼容性在这里测试java 6u45和java 7u80都不兼容),特别是java程序里,会被不信任(如错误提示:您需要设置证书才能访问此网址,PKIX path building failed: unable to find valid certification path to requested target)。因为java会自己维护一份keystore,目录在 $JAVA_HOME/lib/security/cacerts(详情解释在这),里面放了大部分公开的可信CA ROOT证书(关于根证书更新的方法可以参考微信的这个帮助说明,当然,每家CA的root证书是不同的,不要照搬照抄,去CA的官方找ROOT证书再更新),但并不包含Let's Encrypt,特别是一些老的运行环境,解决办法可以手工添加(点此处下载Let's Encrypt CA Root,关于Let's Encrypt CA的详细介绍)或用这个程序自动添加,下载这个代码 http://blogs.sun.com/andreas/resource/InstallCert.java,编译后运行,更新keystore #java InstallCert www.example.com

[2] 关于Let's Encrypt 与 Java 运行环境的问题参考这里。Java 7 >= 7u111 and Java 8 >= 8u101 已经支持,但依赖于JVM环境,如JDK/JRE 到8u66还没有完全自动支持。

[3]如何查询java运行环境已经支持的CA ROOT证书,代码在这。默认密码是changeit

转入正题,开始安装Let's Encrypt SSL

环境:CentOS Linux release 7.4.1708 (Core);欲添加ssl的域名必须是可以直接访问的,因为需要与let's encrypt服务器进行正反双向的握手通讯认证,如果是修改hosts方式定义的域名无法生成ssl证书;

1.安装支持软件
yum install certbot-nginx

升级pip
pip install --upgrade pip

如果pyOpenSSL版本小于0.14(比如阿里云的yum仓库),则要先删除再独立安装最新版本(如果yum库没有最新版本的话,有的话直接从yum安装)
yum erase pyOpenSSL (此命令会同步删除certbot-nginx,不可使用)
rpm -e --nodeps pyOpenSSL

pip install --upgrade pyOpenSSL

2.配置单域名方式

如果域名和IP在同一台机器上,则执行自动配置命令:
certbot --nginx

如果想安全一点不让程序自动修改Nginx.conf,则执行手工配置命令:

certbot --nginx certonly


根据命令提示一步一步,每次只能选择一个域名,虽然提示说可以逗号分多个选择,但实际测试不支持。另外注意结束的提示,有pem证书和密钥文件保存的位置要记录下来,以后有用到,如
/etc/letsencrypt/live/tf.example.com/fullchain.pem
/etc/letsencrypt/live/tf.example.com/privkey.pem

配置完后一定要测试续订命令有没有报错:certbot renew,如果有报错,可以删除一些配置/etc/letsencrypt/renewal/,重试。

2.配置通配符方式
安装DNS插件,目前只有部分DNS服务商提供了这个服务(国内大部分DNS商家都没有)
https://certbot.eff.org/docs/using.html#dns-plugins

certbot-dns-cloudflare
certbot-dns-cloudxns
certbot-dns-digitalocean
certbot-dns-dnsimple
certbot-dns-dnsmadeeasy
certbot-dns-google
certbot-dns-luadns
certbot-dns-nsone
certbot-dns-rfc2136
certbot-dns-route53

DNS插件安装成功后提示命令
certbot -a dns-plugin -i nginx -d "*.example.com" -d example.com --server https://acme-v02.api.letsencrypt.org/directory

3.因Let's Encrpty三个月过期,可以自动续订
certbot renew --dry-run

安装脚本到cron里
certbot renew

例如:
0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew 

4.配置备份

帐号等配置放在这个目录下,要做好这个目录下文件的备份。
/etc/letsencrypt

附录

[1]安装时报错:ImportError: No module named 'requests.packages.urllib3',是因数Centos7的BUG,请用此命令强制升级 pip install requests urllib3 pyOpenSSL --force --upgrade,如果有提示某些包被其他管理器安装的,这里是yum,则先删除后再执行,如梦
rpm -e --nodeps python-enum34
rpm -e --nodeps python-ipaddress

[2] 从泛域名换成单个域名,发现某些java程序调用ssl链接会报错,如PKIX path building failed: unable to find valid certification path to requested target,具体原因跟java运行环境对ssl密钥的管理有关,因为Let's Encrypt 还不是大众都接受的证书供应商,所以对部分客户端的支持不是那么友好,解决方案参考这里 或 这里自动更新java的证书。另外遇到的一个问题时,有的java环境会缓存另外的域名的情况,如果提示hostname不一致,则可以删除那个域名试下(如果不重要的域名),致于java环境如果会缓存到未提供过的域名,原因还未知。

[3]centos 7下面如何直接certbot renew时报如下错误,

ImportError: 'pyOpenSSL' module missing required functionality. Try upgrading to v0.14 or newer.

则执行

mv /usr/lib64/python2.7/site-packages/OpenSSL /usr/lib64/python2.7/site-packages/pyOpenSSL

具体参考讨论,这是一种不太安全的做法,不知会不会其他负作用。可以尝试下面的方法:

rpm --query centos-release  # centos-release-7-3.1611.el7.centos.x86_64
wget ftp://ftp.muug.ca/mirror/centos/7/cloud/x86_64/openstack-newton/common/pyOpenSSL-0.15.1-1.el7.noarch.rpm
sudo rpm -Uvh pyOpenSSL-0.15.1-1.el7.noarch.rpm
sudo yum install certbot
certbot renew  # OK

如果报错:

An unexpected error occurred:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u201d' in position 1401: ordinal not in range(128)

vi /usr/lib/python2.7/site-packages/certbot/_internal/main.py

 在 import sys后加入

reload(sys)
sys.setdefaultencoding('utf-8')

参考资料

[1] https://certbot.eff.org/lets-encrypt/centosrhel7-nginx
[2]Issues: https://github.com/certbot/certbot/issues/5104

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部