————by icarus
2019.2.25
万由的https证书是自签发的,你在外网访问的时候会显示不安全,就很烦,为了解决这个问题,我找到了Let’s Encrypt。
关于Let's Encrypt 免费SSL证书
Let's Encrypt作为一个公共且免费SSL的项目逐渐被广大用户传播和使用,是由Mozilla、Cisco、Akamai、IdenTrust、EFF等组织人员发起,主要的目的也是为了推进网站从HTTP向HTTPS过度的进程,目前已经有越来越多的商家加入和赞助支持。
Let's Encrypt免费SSL证书的出现,也会对传统提供付费SSL证书服务的商家有不小的打击。到目前为止,Let's Encrypt获得IdenTrust交叉签名,这就是说可以应用且支持包括FireFox、Chrome在内的主流浏览器的兼容和支持,虽然目前是公测阶段,但是也有不少的用户在自有网站项目中正式使用起来。
Let's Encrypt 的最大贡献是它的 ACME 协议,第一份全自动服务器身份验证协议,以及配套的基础设施和客户端。这是为了解决一直以来 HTTPS TLS X.509 PKI 信任模型,即证书权威(Certificate Authority, CA)模型缺陷的一个起步。
在客户端-服务器数据传输中,公私钥加密使得公钥可以明文传输而依然保密数据,但公钥本身是否属于服务器,或公钥与服务器是否同属一个身份,是无法简单验证的。证书权威模型通过引入事先信任的第三方,由第三方去验证这一点,并通过在服务器公钥上签名的方式来认证服务器。第三方的公钥则在事先就约定并离线准备好,以备访问时验证签名之用。这个第三方就称为证书权威,简称CA。相应的,CA验证过的公钥被称为证书。
问题是,如果服务器私钥泄露,CA无法离线使对应的证书无效化,只能另外发布无效记录供客户端查询。也就是说,在私钥泄露到CA发布无效记录的窗口内,中间人可以肆意监控服-客之间的传输。如果中间人设法屏蔽了客户端对无效记录的访问,那么直到证书过期,中间人都可以进行监控。而由于当前CA验证和签发证书大多手动,证书有效期往往在一年到三年。
Let's Encrypt 签发的证书有效期只有90天,甚至希望缩短到60天。有效期越短,泄密后可供监控的窗口就越短。为了支撑这么短的有效期,就必须自动化验证和签发。因为自动化了,长远而言,维护反而比手动申请再安装要简单。
证书的有效期,我坚持认为这是合理的。Let's Encrypt 的证书是自动签发的,对 Let's Encrypt 的目标用户(个人网站、小网站)来说,90天已经是一个很长的时间了。特别是个人网站,域名所有权的变动是非常快的。可能前几天域名还属于张三,后几天就属于李四了。因此自动签发一个长有效期的证书是很容易产生问题的。如果证书的有效期是两年,那么经常交易域名的人就可以长时间持有已经不属于他们的域名的证书。并且这种持有不受证书吊销列表的控制,因为签发的时候,所有权是没有问题的,即使后来所有权变更了,Let's Encrypt 也不会知道。所以设的有效期短一点,可以减少这个问题的影响。然后是易用性,现在已经有不少的 Let's Encrypt 自动续期脚本了,配好后就不用管了,非常方便。
总之,强烈推荐站长和服务器平台用 Let's Encrypt 向访客提供加密连接。这是域名认证未来的发展方向。
目前,申请获取Let's Encrypt证书有很多种方法,网上也有不少申请Let's Encrypt证书的教程,使用的工具可以说是五花八门。
但是,就经验来看 acme.sh 这个是最方便、最快捷、最省事儿的,因为使用的就是Let's Encrypt的ACME协议,所以兼容性绝对是最可靠的,Shell脚本式的对系统几乎没有任何依懒性,有很强的自由度。其实 acme.sh 的使用还是非常“傻瓜”的,只要照着指令参数做就可以轻松搞定的,上述的示例其实将域名修改为自己的域名就可以用了,其它的也是同样的道理,简单修改一下参数就可以拿来用的。
下面我就具体的讲述一下利用Let's Encrypt的ACME协议在服务器上运用acme.sh脚本来申请、管理SSL证书,这里要强调一下的是Let's Encrypt的SSL证书申请是必须要有服务器root权限
找到SSH服务安装并打开
并且允许root登录
使用PuTTY登录或者其他SSH软件
输入账号root 密码yutech
按顺序输入一下代码:
sudo apt-get update
sudo apt-get install openssl
sudo apt-get install libssl-dev
安装过程中问你Do you want to continue? [Y/n]
当然y啊
sudo apt-get install curl #安装curl
curl -V
查看curl版本,注意curl版本和libcurl要一致,要不然安装acme.sh会出错
如何安装acme.sh:
https://github.com/Neilpang/acme.sh/wiki/How-to-install
安装https://github.com/Neilpang/acme.sh
curl https://get.acme.sh | sh
要么
wget -O - https://get.acme.sh | sh
curl https://raw.githubusercontent.com/Neilpang/acme.sh/master/acme.sh | INSTALLONLINE=1 sh
要么:
wget -O - https://raw.githubusercontent.com/Neilpang/acme.sh/master/acme.sh | INSTALLONLINE=1 sh
git clone https://github.com/Neilpang/acme.sh.git
cd acme.sh
./acme.sh --install
#我选的是curl,输入以下代码,然后自动安装:
curl https://get.acme.sh | sh
注意curl和libcurl版本要一致
安装完后关闭SSH连接,重新SSH连接,要不然acme.sh会报错
安装完acme.sh后就需要颁发证书,颁发证书有多种方法,具体可见:
https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
#我使用的方法是使用DNS API,且服务商为DNSPod,下面就用DNSPod演示,找到网页中的第2.
首先,您需要登录DNSPod帐户才能获取API密钥和ID。
export DP_Id="1234"
export DP_Key="sADDsdasdgdsf"
好的,我们现在发出一个证书:
acme.sh --issue --dns dns_dp -d example.com -d www.example.com
的DP_Id
和DP_Key
将被保存~/.acme.sh/account.conf
,需要时会被重用。
如果您的DNS提供商不提供api访问权限,您可以使用我们的DNS别名模式:
https://github.com/Neilpang/acme.sh/wiki/DNS-alias-mode
#首先去DNSpod创建一个Token
以下是我的配置信息:
名称: acme.sh ssl
ID:******
Token:*********************************87*****
创建时间: 2018-08-28 23:31:43
#然后导入密钥,在ssh中以root身份直接输入
export DP_Id="******"
export DP_Key="*********************************87*****"
#申请证书
以腾讯/DNSPod(国内版) DNS为例,我们为****.** 签发一个泛域名证书。
acme.sh --issue --dns dns_dp -d example.com -d *. example.com
或者一张证书上多个域名适配:
acme.sh --issue --dns dns_dp -d example.com -d *. example.com -d eg2.com -d *. eg2.com -d
更多DNS API设置请参考:https://github.com/Neilpang/acme.sh/tree/master/dnsapi
列出当前已经申请到证书的域名信息:
acme.sh --list
FlashFXP可以看到/root/.acme.sh 下多了几个文件
https://github.com/Neilpang/acme.sh/wiki/Deploy-ssl-certs-to-apache-server
1.1)创建一个合理的目录来存储您的apache证书
我选择的目录在 /etc/apache2/2.2/ssl ,使用mkdir命令创建这个目录
mkdir -p /etc/apache2/2.2/ssl
1.2)运行acme.sh
几点说明:
acme.sh --install-cert -d online.domain.com \
--cert-file /etc/apache2/2.2/ssl/online.domain.com-cert.pem \
--key-file /etc/apache2/2.2/ssl/online.domain.com-key.pem \
--fullchain-file /etc/apache2/2.2/ssl/letsencrypt.pem \
--reloadcmd "service apache2 force-reload"
以下所有
online.domain.com
替换成自己的域名
/etc/apache2/2.2/ssl/
更换成自己安放证书的位置
这是我的配置命令:
acme.sh --install-cert -d ****.*** \
--cert-file /etc/apache2/2.2/ssl/****.***-cert.pem \
--key-file /etc/apache2/2.2/ssl/****.***-key.pem \
--fullchain-file /etc/apache2/2.2/ssl/letsencrypt.pem \
--reloadcmd "service apache2 force-reload"
有很多方法可以执行此操作,编写每个变体需要很长的列表,但是您需要在httpd.conf(或ssl.conf或httpd-ssl.conf)中设置的特定代码是:
SSLCertificateFile /etc/apache2/2.2/ssl/online.domain.com-cert.pem
SSLCertificateKeyFile /etc/apache2/2.2/ssl/online.domain.com-key.pem
SSLCertificateChainFile "/etc/apache2/2.2/ssl/letsencrypt.pem"
SSLCACertificatePath "/etc/apache2/2.2/ssl/"
SSLCACertificateFile "/etc/apache2/2.2/ssl/letsencrypt.pem"
我这里用万由unas来演示:
打开FlashFXP,然后连接服务器
找到 /etc/apache2/sites-available/ 目录,使用Linux的vi编辑器修改或者用FlashFXP等软件通过ssh连接修改文件。
编辑修改unasdesktop-ssl.conf和default-ssl.conf文件
在文件中找到如下代码,并修改文件的绝对位置,如果没有的复制进去,前面有#注释的要把#去掉。
SSLCertificateFile /etc/apache2/2.2/ssl/****.***-cert.pem
SSLCertificateKeyFile /etc/apache2/2.2/ssl/****.***-key.pem
SSLCertificateChainFile /etc/apache2/2.2/ssl/letsencrypt.pem
SSLCACertificatePath /etc/apache2/2.2/ssl/
SSLCACertificateFile /etc/apache2/2.2/ssl/letsencrypt.pem
善用搜索功能
记得,相关代码前面如果有#注释的要把#去掉
最后完成后reload一下:
service apache2 reload
最后来测试一下效果:
用ip登录发现https还是显示不安全
原因是自签证书时是签给xxx.xxx.xxx.com域名的,而浏览器中是通过ip访问的,浏览器警告用户证书与所在域不匹配!本机hosts文件中配上映射关系后,使用域名访问试试:
测试是否成功我们可以通过修改Windows上的host文件
C:\Windows\System32\drivers\etc
比如我申请的域名是****.***
则在host内上输入
192.168.2.123 ****.***
192.168.2.123 ****.***
然后再通过刚刚设置好的域名访问,可以看到Https的锁不再是不安全状态了。大成功
手机外网连接万由管理界面和Nextcloud再也不会提示不安全了美滋滋,不会再弹出烦人的连接不安全警告了
目前证书在60天以后会自动更新,你无需任何操作。今后有可能会缩短这个时间,不过都是自动的,你不用关心。
你可通过下面的命令看到acme.sh的定时任务
crontab -l
目前由于acme协议和letsencrypt CA都在频繁的更新,因此acme.sh也经常更新以保持同步。
升级acme.sh到最新版:
acme.sh --upgrade
如果你不想手动升级,可以开启自动升级:
acme.sh --upgrade --auto-upgrade
之后,acme.sh就会自动保持更新了。
你也可以随时关闭自动更新:
acme.sh --upgrade --auto-upgrade 0
如果出错,请添加调试日志:
acme.sh --issue ..... --debug
或者:
acme.sh --issue ..... --debug 2
https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E
如果你是用手动安装curl的注意看:
1)下载curl包(可以在这个网站上找最新的版本 http://curl.haxx.se/download/)
wget https://curl.haxx.se/download/curl-7.60.0.tar.gz
或者最新的
wget https://curl.haxx.se/download/curl-7.64.0.tar.gz
2)解压
tar -xzvf curl-7.60.0.tar.gz
或者最新的
tar -xzvf curl-7.64.0.tar.gz
3)覆盖安装,输入下面代码,每项都要回车
cd curl-7.60.0
./configure
make
make install
4)使用
curl --version
检查是否更新成功
5)至此,升级成功
万由3.0.7版本上按照上面手动安装的方法装是完全没有问题的
但是!我在重装了万由3.1.0版本的时候按照
wget https://curl.haxx.se/download/curl-7.60.0.tar.gz
tar -xzvf curl-7.60.0.tar.gz
cd curl-7.60.0
./configure
make
make install
上面的手动安装的方法装完就会出现下面的错误
curl和libcurl版本不一致,curl无法联通。
curl没有反应
curl https://get.acme.sh | sh
没有反应
然后尝试用
wget -O - https://get.acme.sh | sh
安装asmh.sh
然后换另一种安装方法
wget -O - https://raw.githubusercontent.com/Neilpang/acme.sh/master/acme.sh | INSTALLONLINE=1 sh
你会发现直接报错了
Please refer to https://curl.haxx.se/libcurl/c/libcurl-errors.html for error code: 43
然后我去排查错误,各种排查,一开始以为是acme.sh的问题,后来又以为是openssl的问题,结果发现就是curl的问题
回到万由系统网页管理上,打开控制中心,系统升级,全部升级
curl测试一下,没有问题了
直接安装acme.sh,直接安装成功
curl https://get.acme.sh | sh
默认情况下,libcurl不支持https, 如果使用https链接,就会出现" Protocol https not supported or disabled in libcurl" 的错误提示。查看curl是否支持https可以使用命令:curl -V
解压:
tar -xzvf curl-7.60.0.tar.gz
cd curl-7.60.0
./configure
这里注意的是最后会显示一段信息提示是否支持https:
注意最后一行Protocols中显示没有https的支持。
这里的SSL support提示的是不支持的,因为https协议是加密安全的基于http的协议,需要使用openssl的静态库,所以需要支持https就必须下载openssl,并安装
不然直接安装acme.sh会出现
返回错误代码:
curl: (1) Protocol "'http" not supported or disabled in libcurl
意思是:不支持HTTPS协议!
CURLE_UNSUPPORTED_PROTOCOL(1)错误
你的URL传递给libcurl的使用协议,这libcurl的不支持。支持可能是你没有使用一个编译时的选项,它可以是一个拼写错的协议字符串,或者只是一个协议的libcurl没有代码。
或者出现
返回错误代码:
curl: (48) An unknown option was passed in to libcurl
CURLE_UNKNOWN_OPTION(48) 错误
总之,会出现各种奇怪的错误
输入如下命令
sudo apt-get update
sudo apt-get install openssl
为了以防万一把上面这两句也打上吧
sudo apt-get install libssl-devl
然后重新编译安装
cd curl-7.60.0
./configure
提示支持https ,接着
make
make install
curl -V 查看一下,可以看到Protocols一行中显示有对https的支持了。
1.发现问题
通过ssh连接万由,输入,连接名称,ip,端口,已经用户名密码,输入完成后点击连接,开始进行远程连接,发现一直提示连接不了;提示"ssh服务器拒绝了密码,请再试一次。"其实试了多少次都没用;
直接在万由网页管理界面打开SSH服务设置
或者
1、确认ssh服务已安装,通过普通用户连接成功;
2、确认ssh配置是否对root进行特殊设置,修改/etc/ssh/sshd_config文件中
PermitRootLogin without-password将 without-password改为yes;
3、重启ssh服务/etc/init.d/ssh restart;
3.验证结果
再次使用ssh连接,这次没有任何提示,连接成功了;
看不到root下面的文件:
FlashFXP默认是可以看到隐藏文件的
WinSCP就需要手动打开“显示隐藏文件”
ACME Shell脚本:acme.sh
https://github.com/Neilpang/acme.sh
Apache2.4安装SSL证书教程(基于ubuntu 16.04)
https://blog.csdn.net/mgsky1/article/details/53844332
给你的网站免费配置上 HTTPS 证书
https://www.cnblogs.com/jxlwqq/p/7492274.html
使用 acme.sh 部署 Let's Encrypt 通过阿里云 DNS 验证方式实现泛域名 HTTPS
http://frontenddev.org/article/use-acme-sh-deployment-let-s-encrypt-by-ali-cloud-dns-generic-domain-https-authentication.html
利用 acme.sh 获取网站证书并配置https访问
https://my.oschina.net/u/3042999/blog/1858891
Linux 下使用 acme.sh 配置 Let’s Encrypt 免费 SSL 证书 + 通配符证书
https://www.sooele.com/index.php/2018/03/21/linux-%E4%B8%8B%E4%BD%BF%E7%94%A8-acme-sh-%E9%85%8D%E7%BD%AE-lets-encrypt-%E5%85%8D%E8%B4%B9-ssl-%E8%AF%81%E4%B9%A6-%E9%80%9A%E9%85%8D%E7%AC%A6%E8%AF%81%E4%B9%A6/
curl不能支持https问题
https://blog.csdn.net/yejinxiong001/article/details/77745943
用 NextCloud 搭建个人私有云
https://www.logcg.com/archives/2750.html